ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-07-01中級

音を出すアプリのリリース前チェックを、音声描画とエージェントで仕組み化する

6/26 の更新で Antigravity が音声ファイルを描画できるようになりました。癒し系アプリで音を扱ってきた経験から、音量・クリップ・長さ・無音の事前チェックをエージェントの検証ループに組み込む設計を、実際のスクリプトとともに紹介します。

Antigravity301音声アセットリリース前チェック個人開発82品質ゲート2

プレミアム記事

癒し系のアプリを長く運営していると、star が 1 つ落ちる理由の意外な上位に「音」が入ってきます。「就寝前に使ったら急に音が大きくて驚いた」「無音だと思ったら数秒後に鳴った」といった声は、機能のバグより静かに評価を削っていきます。

音のアセットは、コードのようにコンパイルエラーで気づけません。耳で全部を確かめるのは、曲数が増えるほど現実的でなくなります。6/26 の更新で Antigravity が IDE 内で音声ファイルを波形として描画できるようになったことで、この「耳の作業」を目とスクリプトに一部肩代わりさせる道が開けました。個人開発で音を扱ってきた立場から、公開前の音声チェックを検証ループとして仕組み化する設計を書いていきます。

音のアセットで実際に事故が起きるのはどこか

まず、どんな不具合が読者体験を壊すのかを具体的にしておきます。曖昧な「品質チェック」では、エージェントに任せても曖昧な結果しか返りません。

私が運用してきたなかで、クレームや低評価につながりやすかったのは次の四つでした。ラウドネス(体感音量)がトラック間でばらつくこと、ピークがクリップして歪むこと、冒頭に不自然な無音や逆に立ち上がりの唐突さがあること、そしてループ素材の末尾と先頭が滑らかにつながらないことです。

これらは波形を見れば多くが判別できます。逆に言えば、波形として可視化できる項目に落とし込めば、エージェントにも判断の足場を与えられます。

機械で判定できる部分は先に潰す

耳やエージェントに回す前に、数値で機械判定できるものは自動化しておきます。ここを省くと、レビューが主観のやり取りに埋もれます。私は ffprobeffmpeg の loudnorm 解析を使った軽いゲートを、公開前に必ず通しています。

#!/usr/bin/env bash
# audio-gate.sh — 公開前の音声アセットを機械判定する
# 使い方: ./audio-gate.sh assets/sounds/*.wav
set -euo pipefail
 
# 配信基準(自分のアプリに合わせて調整)
TARGET_LUFS=-16     # モバイル再生の目安
MAX_TP=-1.0         # トゥルーピーク上限 dBTP
MIN_SEC=1.0         # 短すぎる素材を弾く
MAX_HEAD_SILENCE=0.3 # 冒頭無音の許容秒数
 
for f in "$@"; do
  # 長さ
  dur=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$f")
  # ラウドネスとトゥルーピークを loudnorm の解析パスで取得
  stats=$(ffmpeg -i "$f" -af loudnorm=I=$TARGET_LUFS:TP=$MAX_TP:print_format=json -f null - 2>&1 \
          | sed -n '/{/,/}/p')
  lufs=$(echo "$stats" | python3 -c "import sys,json;print(json.load(sys.stdin)['input_i'])")
  tp=$(echo "$stats" | python3 -c "import sys,json;print(json.load(sys.stdin)['input_tp'])")
  # 冒頭無音の秒数(-50dB を無音とみなす)
  head_sil=$(ffmpeg -i "$f" -af silencedetect=noise=-50dB:d=0.1 -f null - 2>&1 \
             | grep -m1 "silence_end" | grep -oE "[0-9.]+" | head -1 || echo 0)
 
  status="OK"
  awk "BEGIN{exit !($dur < $MIN_SEC)}" && status="TOO_SHORT"
  awk "BEGIN{exit !($tp > $MAX_TP)}" && status="CLIPPING"
  awk "BEGIN{exit !($head_sil > $MAX_HEAD_SILENCE)}" && status="HEAD_SILENCE"
  printf "%-28s dur=%.1fs LUFS=%s TP=%s headSil=%ss -> %s\n" \
    "$(basename "$f")" "$dur" "$lufs" "$tp" "$head_sil" "$status"
done

このスクリプトを通すだけで、「ある 1 曲だけ 6 dB 大きい」「末尾がクリップしている」といった、耳で聴き比べないと見つけにくい問題が一覧で出ます。私は AdMob の報酬音を差し替えたとき、この段でトゥルーピーク超過を拾い、配信前に直せました。実際、曲間の音量差が 6 dB(体感で約 2 倍の大きさ)あった素材も、この一覧で即座に見つかりました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
ラウドネス -16 LUFS・トゥルーピーク -1 dBTP を ffprobe と loudnorm で機械判定する検証スクリプト
音声描画を使ってエージェントに『耳の代わりの目』でレビューさせる手順
配信後に音量クレームで星を落とさないための、公開前ゲートの置き方
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

アプリ開発2026-06-21
Play Store の密度分割で、特定の端末だけ内蔵壁紙が消えた — drawable と nodpi の境界設計
App Bundle の密度分割は、密度別に分けてはいけない画像まで分けてしまうと、特定の密度バケットの端末からだけリソースを取りこぼします。bundletool で再現し、drawable-nodpi への移動か密度分割の無効化で直すまでを、判断基準ごと残しました。
アプリ開発2026-06-01
targetSdk 36 で edge-to-edge が必須になった壁紙アプリを Antigravity で移行した運用メモ
targetSdk を 36(Android 16)に上げた途端、壁紙アプリのプレビュー画面のツールバーがステータスバーに食い込みました。opt-out が効かなくなった edge-to-edge 強制対応を、Antigravity のエージェントで複数アプリ横断に進めた数週間の運用メモです。
アプリ開発2026-05-26
アプリ内レビュー要求の出し分け条件を Antigravity Editor で 5 アプリ統一した数日の記録
個人開発で運用してきた iOS 壁紙アプリ 5 本の SKStoreReviewController 呼び出し条件を、Antigravity Editor のマルチファイル編集機能でひとつの基準にまとめ直したときの数日間の所感を、コード例とあわせて静かに記録しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →