DEV Community

bigkijimon
bigkijimon

Posted on

mlx-whisperで生成曲の歌詞一致率を数値化する品質採点(uvx arm64罠込み)

AI生成曲の品質をどう測るか。主観判定には限界がある——自分の曲を自分で採点しないルールが必要だ。そこで採用したのが、mlx-whisperローカル文字起こし→歌詞一致率を客観指標にする3層採点パイプライン。M1 Max 64GBでACE-Step 1.5を使い、32テイクの実測値(0.0%〜100.0%)を得た。そしてuvx arm64罠にハマり、解決するまでの記録。

問題: AI生成曲の品質をどう測るか

AI音楽生成の最大の課題は「品質の可視化」だ。生成した曲が教育用に使えるレベルか、歌詞が明瞭に聞こえるか、教育効果があるか——これらを数値化しないと「いい曲になった気がする」で終わる。人間の耳での判定は主観に偏る。自分が作った曲だから「悪くない」と思ってしまう。

そこで必要なのは、客観指標だ。発音明瞭度の代理として「歌詞一致率」を使う。文字起こしAIがどれくらい正確に歌詞を認識できたかを数値化する。これがあれば、再生成しても「前より良くなったか」が一目で分かる。

解法: 3層採点パイプライン

3層品質採点パイプラインのフロー図: Whisper一致率→ルーブリック採点→オーナー耳チェック→最終採用

採用したのは3層構造だ。

① Whisper一致率(客観層) — mlx-whisper(large-v3-turbo)で各トラックを文字起こしし、実使用歌詞と単語列一致率を計算する。数字は英単語に正規化して比較("1,2,3"表記による偽低スコアを補正済み)。この層が本文の核だ。

② 独立ルーブリック採点(別コンテキスト) — 英語の正しさ25/設計原則遵守25/教育効果25/歌いやすさ25の4軸で、別コンテキストの採点官が各100点採点。平均94.1点。客観層が漏らす「教育的な意味でいい曲か」を補う。

③ オーナー耳チェック(最終) — 数字で表せない「歌い心地」「子どもに届くか」を最終判定。特に文字の歌唱(A-B-C)はWhisperが誤転写しやすく一致率が下振れるため、ここが補正になる。

実装①: mlx-whisperローカル文字起こし

まずは文字起こしの実装だ。完璧にローカルで完結させたい。

uvx --python cpython-3.12-macos-aarch64-none --from mlx-whisper mlx_whisper <mp3> --model mlx-community/whisper-large-v3-turbo
Enter fullscreen mode Exit fullscreen mode

uvx arm64罠にハマった。このMacの既定python3はanaconda(x86/Rosetta)で、uvxが失敗する。Python実行環境のアーキテクチャ不一致だ。--python cpython-3.12-macos-aarch64-noneでarm64明示で解決した。罠は「何も言わずに失敗する」点だ。エラーメッセージも明確でないため、x86環境が選ばれていることに気づくのに時間がかかる。

モデルはlarge-v3-turbo(Apache 2.0)をローカルに配置。完全ローカル・課金ゼロ・APIキー不要。16音源の転写には約2分(M1 Max 64GB)。

実装②: 独立ルーブリック採点

客観層だけでは不十分だ。歌詞が完璧に聞こえても、教育効果が薄ければ意味がない。そこで独立ルーブリックを導入した。

基準は4軸25点ずつ:英語の正しさ(文法・表現の自然さ)、設計原則遵守(LMNOP問題回避・音節数)、教育効果(子どもが覚えやすいか)、歌いやすさ(BPM・キー・リズム)。

別コンテキストで採点することで、「作り手のバイアス」を排除する。平均94.1点は「教育的に優れた曲セット」であることを示している。ただし数字が高いから最終採用というわけではない。

実測結果: 32テイクの分布

Daily Routineソングブック(全8曲×2バリアント=16音源×2版v1/v2=32テイク)の実測結果だ。

採用8本の平均一致率: 83.9%

python3 -c "vals=[75.3, 79.4, 97.1, 76.7, 94.4, 73.3, 75.2, 100.0]; print(sum(vals)/len(vals))"
# 出力: 83.925 → 83.9%
Enter fullscreen mode Exit fullscreen mode

平均83.9%だが、分布は広い。

最高100.0% — 08_Introduce_Yourself v2a。完璧な聞き取り。Whisperが歌詞を完全に認識。穴あきBridge実装済みで教育的にも優秀。

最低0.0% — 07_Seasons v1b。不良テイク。Whisperが"Thank you"を幻聴し続ける状態。ボーカル不明瞭。これは「不良テイク・不採用」として即除外。

分布の両端を引用することが重要だ。平均83.9%だけ見ると「実用的なレベル」に見えるが、0.0%〜100.0%のギャップが存在する。この分散がAI音楽生成の現実だ。

v1/v2の裁定原則。歌詞修正版(v2)を再生成しても、明瞭度が落ちる場合がある。

例: 01_ABC_Song v1a=75.3%だが、v2a=53.2%に低下。ルーブリック採点で指摘された「TPR動作語ゼロ→clap追加」を反映したv2は、歌詞は良くなったが明瞭度が大幅減だ。seed運だから。clap追加の益が明瞭度低下を上回らない。

結論: 旧版を捨てず曲ごとに最良テイクを採用するのが正解。歌詞修正(v2)とseed運は独立だ。v2で明瞭度が落ちる場合、v1を維持する。

最終採用セットは8本(採用テイクを曲名のみで配置)。

曲採用一致率裁定理由

01 ABCv1a75.3%v2は明瞭度大幅減。clap追加の益<明瞭度
02 Numbersv2a79.4%歌詞修正済みかつ明瞭度も最高
03 Hellov1b97.1%全曲最高の明瞭度・97点
04 Weatherv2b76.7%明瞭度同等で不自然英語を解消
05 Days&Monthsv1b94.4%明瞭度94.4を優先
06 What Timev1a73.3%98点曲。"sweet"軽微<明瞭度
07 Seasonsv2a75.2%歌詞4件修正済みかつ明瞭度も向上
08 Introducev2a100.0%一致率100%=完璧な聞き取り・穴あきBridge実装済み

教訓: 品質採点の3つのポイント

① 1リクエスト2バリアント生成=seed運の保険

ACE-Step 1.5は1リクエストで自動的に2曲生成する(seed違い=A/B試聴に使える)。これが今回、2本の不良テイク(07_Seasons v1b=0.0%、01_ABC_Song v1b=16.7%)を無償で回避した。生成コストは変わらないが、品質の安定性が向上する。seed運に頼らない構造だ。

② 旧版を捨てず曲ごとに最良テイクを採用する

ABC曲の例が示す通り、v2で歌詞修正しても明瞭度が落ちる場合がある。「最新版が最良」という前提は危険だ。曲ごとにWhisper一致率×ルーブリック×耳チェックで最良を採用する。文字の歌唱(A-B-C)はWhisperが誤転写しやすく一致率が下振れるため、最終判定は耳だ。

③ 文字の歌唱はWhisperが誤転写しやすい

A-B-Cのような文字の歌唱は、Whisperが文字認識の誤りをする。一致率が低くても耳では聞き取れることがある。逆に、内容のある歌詞は一致率が高い傾向にある。客観指標を鵜呑みにせず、耳での最終判定が必要だ。

品質採点は「品質を可視化し、再生成の意思決定を助ける」ためのものだ。数字に振り回されず、数字と耳の両方で判定する。これがAI音楽生成の実用レベルへの道だ。

Top comments (0)