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

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

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

Antigravity376音声アセットリリース前チェック個人開発101品質ゲート7

✦ プレミアム記事

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

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

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

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

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

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

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

耳やエージェントに回す前に、数値で機械判定できるものは自動化しておきます。ここを省くと、レビューが主観のやり取りに埋もれます。私は ffprobe と ffmpeg の 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/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

▣ アプリ開発2026-09-29
Cloudflare をパージしても古い壁紙が届き続けた原因は、オリジン側で JPEG を握っていた XPageSpeed
同じ URL に上書きした壁紙画像が、Cloudflare をパージしても古いまま届き続けた運用の記録です。ローカル・オリジン・エッジの三者を突き合わせて層を名指しする検査、プレフィックスパージの使いどころ、Xserver の XPageSpeed を .htaccess で安全に切る書き方まで扱います。
▣ アプリ開発2026-09-19
見積書 PDF の自動化を一度にまとめて頼み、4 つに割り直すまで
受託の見積書を毎回コピーして作っていた手作業を、Antigravity に頼んで小さな PDF 出力ツールへ移した記録です。最初に全部をまとめて頼んで作り直すことになった理由と、データ・計算・見た目・保存の 4 つに割って渡し直した順番を、動くコードと一緒に書き残します。
▣ アプリ開発2026-05-21
Firebase Remote Config と Antigravity Agent で AdMob 配置を実運用しながら微調整する設計
壁紙アプリの AdMob 収益が頭打ちになった経験から、Firebase Remote Config と Antigravity Agent を組み合わせて広告配置を実運用中に少しずつ最適化する仕組みをまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます