🛠 ツール制作ログ

Whisper精度が爆上がり!? 音声の事前処理を自動でやってみた話

Whisper精度が爆上がり!? 音声の事前処理を自動でやってみた話

🔰 はじめに:Whisper、精度出なくない?

Whisperで文字起こししてみたけど…

  • なんか、誤字多くない?
  • 音が遠いと、聞き間違いひどくない?
  • あと、ファイル大きすぎって怒られたんだけど?

そんな「精度出なくない問題」には、大抵このへんの課題が絡んでます👇

❗ ノイズ多すぎ問題

空調の音、マイクのジジジ…

人の声がちゃんと聞こえてても、AIにはノイズが壁になってます。

Whisperくん、めちゃくちゃ真面目に聞き取ろうとしてくれるんだけど、そのせいで「違う単語」に聞こえてしまうことも。

🎚 音量バラバラ問題

  • 大きすぎて音割れ
  • 小さすぎて聞こえない
  • 急にボリューム上がってビックリ!

これ、AIもビックリしてます

音量の上下が激しいと、意外と精度に悪影響が出るんです。

💾 ファイル容量オーバー問題

Whisper APIには「25MBの壁」があります。

ちょっと長めの音声を入れたら、弾かれて終わり。

でもカットしすぎると、文脈バラバラ。

いい感じに分割して、つながるようにしないと意味がない。

🛠 というわけで…

この3つの問題を解決するために、「事前処理パイプライン」を組みました!

Whisperくんが最高のパフォーマンスを出せるように、こっちで舞台整えておく、ってことですね。

🧪 今回やった処理一覧(処理の流れ)

Whisperに渡す前に、音声ファイルを徹底クリーニング&チューニング!

今回は以下の処理を順番に行いました👇

1. 🎧 m4a → wav変換(ffmpeg)

    まずは形式を変換!

    そのままだと扱いにくいので、標準的なwav形式に変えます。

    2. 🚫 リミッター処理(音割れ防止)

    「音が大きすぎてバリバリ鳴る問題」を防ぐ処理。

    一定以上の音量をカットして、耳にもAIにもやさしくします。

    3.🔊 Normalize(音量補正)

    音が小さいところを持ち上げて、全体をいい感じのボリューム感に整えます。

    これで、「小さくて聞き取れない…」が激減。

    4.📢 コンプレッサー(声の大小を整える)

    急に大きい声、小さい声、そんな変化もなめらかに補正

    聞きやすさが一気にアップします。

    5.🎙 モノラル化(ステレオ→1ch)

    Whisperくん、モノラルが得意です。

    片耳だけ録音されてた…みたいな問題も、ここで統一!

    6.🎚 サンプリングレート変換(16kHz)

    Whisperの標準仕様に合わせて、16kHzに変換

    サンプリングレートが合っていないと、意外とエラーや精度低下につながるんです。

    7.✂️ ファイル分割(20MB以下&オーバーラップ付き)

    Whisper APIの容量制限(25MB)対策!

    20MB以下に自動分割+10秒オーバーラップで、途中の文脈も保ちます。

    🚫 ノイズ除去は今回はパス

    実は、ノイズ除去(noisereduce)はめっちゃ時間がかかる…!

    そのため今回はあえて除外して、処理スピード重視で構築しました。

    必要に応じてONにできる構成にはしてあるので、後からの追加も可能です◎

    処理内容はこんな感じ。

    ここまで整えておけば、Whisperくんの実力がちゃんと発揮されます💪✨

    ⚙️ 実行環境:Google Colabでお手軽に

    今回は、Google Colab 上で全部動かせるように構築しました!

    特別な開発環境なんていりません。ブラウザさえあればOK🙆‍♂️

    Colabで使うために、以下のライブラリをインストールしています👇

    pip install pydub ffmpeg-python noisereduce librosa --quiet
    • pydub: 音声ファイルの加工(圧縮・モノラル化など)
    • ffmpeg-python: リミッター処理や形式変換
    • noisereduce: ノイズ除去(今回は未使用)
    • librosa: 音声解析系の下支えライブラリ

    📂 Google Drive をマウントして音声ファイルを読み込み

    元の音声ファイルは Google Drive に保存。

    以下のコードでマウントできます👇

    from google.colab import drive
    drive.mount('/content/drive')

    そのまま Drive 内の input_audio フォルダから音声を読み込んで、加工後もそこに保存します。

    Colabでもリアルにファイルを扱えるのが便利!

    🚀 本番運用はAWSで想定

    Colabはあくまでプロトタイプ・検証用

    実際に多くのユーザーに提供する際は、AWS Lambda+S3などの構成を想定しています。

    • 短時間で処理が終わる(Colabで5分 → AWSなら2分半も可能)
    • 1件あたり 約4〜8円(コストも激安)
    • 同時処理にも強い(API Gateway + 並列Lambdaでさばける)

    つまり、「試すのはColab」「回すのはAWS」。

    開発と運用でしっかり切り分けてます!

    💡 ステップ1:m4a → wav変換

    🤔 なぜ必要?

    今回の音声処理パイプラインでは、途中の処理で pydub を使っています。

    でも pydubm4a形式をうまく扱えないことがある…!

    ということで、まず最初に wav形式に変換しておくのが安全&安定です💡

    また、Whisperなどの音声モデルもwavが得意なので、どっちにしても変換しといた方が吉◎

    🔧 コード例(Colabで動く)

    import ffmpeg
    
    input_path = '/content/drive/MyDrive/Coaching_Meta/input_audio/ファイル名.m4a'
    output_path = '/content/drive/MyDrive/Coaching_Meta/input_audio/ファイル名.wav'
    
    ffmpeg.input(input_path).output(output_path).run(overwrite_output=True)
    print("✅ m4a → wav に変換完了")
    

    🧠 .input(...).output(...).run() の意味

    • ffmpeg.input(...): 入力ファイルを指定します
    • .output(...): 出力ファイルの形式と保存先を指定します
    • .run(): 処理を実行!

    ちなみに overwrite_output=True を付けておくと、既存のファイルがあっても上書きしてくれます✍️(便利!)

    💡 ステップ2〜6:音声の品質改善(Normalize〜16kHz変換)

    Whisperくんにベストな状態で渡すために、音声のクオリティを総仕上げ!

    ここでは、5つの工程で音の聞きやすさと処理の安定性をグッと引き上げます👇

    ② リミッター(Limiter)

    • 目的:大きすぎる音をバチッと制限!音割れを防ぎます
    • やってること:ffmpegで「一定以上の音量をカット」してます

    🎧 体感効果は小さめだけど、予防として入れておくと安心

    Whisper精度が爆上がり!? 音声の事前処理を自動でやってみた話

    ③ Normalize(音量補正)

    • 目的:全体的に音が小さい…を解決!
    • やってること:最大音量に合わせて全体の音を持ち上げます
    • ライブラリpydub.effects.normalize()

    📈 Before(上) / After(下) の波形を比べると一目瞭然!

    Whisper精度が爆上がり!? 音声の事前処理を自動でやってみた話

    ④ コンプレッサー

    • 目的:声が小さいところが聞こえにくい問題を解消
    • やってること:小さい音を持ち上げて、全体のバランスを整える
    • ライブラリpydub で疑似コンプレッサー処理

    🔊 「声が通る」感じに近づくよ Before(上) / After(下)

    Whisper精度が爆上がり!? 音声の事前処理を自動でやってみた話

    ⑤ モノラル化(ステレオ → 1ch)

    • 目的:Whisperはモノラル推奨!
    • やってることaudio.set_channels(1) で1チャンネルに変換
    • メリット:ファイルサイズが軽くなって、処理も安定

    🎧 ステレオでなくても違和感なし。必須処理!

    ⑥ サンプリングレート変換(16kHz)

    • 目的:Whisperが最も得意とする音声形式に揃える!
    • やってることaudio.set_frame_rate(16000)
    • 元の値:たとえば44.1kHz → 16kHzへ

    📉 波形を見ると密度が変わるけど、人間の耳ではほぼ差なし!お守りです。処理は軽い

    Whisper精度が爆上がり!? 音声の事前処理を自動でやってみた話

    🗂 保存形式と命名ルール

    各ステップの処理は基本的に1つの音声ファイルに連続して適用されます。

    最終的に保存されるのはこの形式👇

    sample_audio_division_1.wav
    sample_audio_division_2.wav
    ...

    ※これはステップ⑧(ファイル分割)で生成されるものですが、 その前の処理すべてを通過済みの“完成音声”です✨

    💡 ステップ7:分割処理でWhisperに優しく

    Whisper API には 「25MB以下じゃないとダメ!」 という制限があります。

    そのまま大きな音声を渡すと処理がエラーで止まることも…😱

    というわけで、あらかじめ分割処理しておくのが超重要!

    📏 分割サイズは「20MB上限」+「前後10秒オーバーラップ」

    • Whisperの安全圏ライン=20MB
    • 分割時に前のファイルの終わりと、次の頭を10秒ずつ重ねる
    • こうすると、つなぎ目で文が切れても前後でカバー可能!

    📌 オーバーラップありだと、「一文まるごと消える」事故が激減します!

    🧠 裏側では…

    • os.path.getsize() でファイルサイズを計算
    • 20MB以上なら AudioSegment で分割
    • 重なり部分も .append() でつなぎ処理済み

    📂 保存先:/MyDrive/Coaching_Meta/input_audio/

    これで Whisper くんが「重すぎて無理〜」とならずに、最後まで安定して聞き取ってくれます! 🎧✨

    📦 実行コード(Colab用・お試し版)

    🔧 必要なライブラリをインストール

    !pip install pydub ffmpeg-python --quiet
    

    🧪 たとえば、Normalize+Compress の処理だけ試すならこんな感じ👇

    from pydub import AudioSegment, effects
    import os
    
    # Google Drive に保存したファイルを読み込み
    input_path = '/content/drive/MyDrive/Coaching_Meta/input_audio/sample_audio_2.m4a'
    output_path = '/content/drive/MyDrive/Coaching_Meta/input_audio/sample_audio_2_processed.wav'
    
    # m4a → wav へ変換して読み込み(pydubはwav形式の方が扱いやすい)
    audio = AudioSegment.from_file(input_path, format="m4a")
    print("✅ m4a読み込み完了")
    
    # Normalize(音量補正)
    normalized = effects.normalize(audio)
    print("✅ Normalize完了")
    
    # Compress(疑似コンプレッサー:ボリューム差を少し和らげる)
    compressed = normalized.compress_dynamic_range()
    print("✅ Compress完了")
    
    # 保存
    compressed.export(output_path, format="wav")
    print(f"✅ 保存完了:{output_path}")
    

    🚀 結果:耳で聞いても波形で見ても、かなり聞き取りやすく!

    このあとに、モノラル化・16kHz変換・分割処理なども続けて実行できます。

    Colabだからインストールもゼロ&無料で動作確認できるので、「どの処理がどれくらい効果あるの?」をぜひ体験してみてください!🎧💡

    🔄 実行結果と処理時間の目安

    今回の事前処理パイプラインを Google Colab で実行したところ、約5分 で全工程が完了しました。🎉

    ⏱ 各ステップの処理状況(Colab)

    ✅ Google Drive をマウントしました  
    ✅ リミッター処理完了  
    ✅ Normalize(音量補正)完了  
    ✅ コンプレッサー完了  
    ✅ モノラル化完了  
    ✅ サンプリングレート(16kHz)変換完了  
    ✅ 分割ファイル保存:...__division_1.wav  
    ✅ 分割ファイル保存:...__division_2.wav  
    ✅ 分割ファイル保存:...__division_3.wav  
    ...  
    🎉 すべての処理が完了しました!

    ☁️ 本番環境での想定(AWS)

    • 処理時間:おおよそ 2〜3分(Lambda等の軽量処理を想定)
    • コスト目安1件あたり 約4〜8円

    数百人規模でも問題なし!

    サーバーのスケール設計次第で高速&低コスト運用が可能です💡

    💬 実際にやってみた感想&気づき

    実際に事前処理パイプラインを組んでみて感じたこと、たくさんありました!

    🎧 normalize や compress は「波形」で一目瞭然!

    • 音を聞いただけでは違いが分かりにくいけど、波形を見ると明らかに変化あり。
    • 特に normalize で音量の底上げ、compress で声の大小が整うのは効果絶大。

    🛡 limiter や モノラル化 は「保険として大切」

    • ぱっと聞きは変化がないように思えるけど、Whisperの安定性向上に影響大。
    • 本番運用では「事故防止用」の処理として組み込んでおくと安心。

    🗂 分割サイズ調整&ファイル命名の自動化が地味に便利!

    • Whisper制限に合わせて20MB以下&前後10秒オーバーラップ付きで分割。
    • 手動でやると超面倒な処理を自動化できるの、ほんと正義
    • ファイル名も __division_1 などで自動生成されてて、後工程がラクになる!

    実験してみて思ったのは、「精度を上げるには“音声の手入れ”がかなり効く」ということでした!

    🧵 おわりに:精度が変わる、たったひと手間

    今回は、Whisperでしっかり精度を出すための事前処理パイプラインを組んでみました。

    音声って、ちょっとしたノイズや音量バランスのせいで、AIが意図を汲み取りづらくなるんですよね。

    でも!

    ちょっと手を加えるだけで、出力の質が明らかに変わるというのは、実際に試してみて実感できました。

    🔁 今回の処理を一言でまとめると…

    「AIに渡す素材が良ければ、結果も良くなる」

    次回はいよいよ、Whisperに分割ファイルを渡して、文字起こし→整形→要約!

    プロトタイプでもグッと使えるレベルになるので、お楽しみに。

    • この記事を書いた人

    SHIRAN

    「コードは知らない。でも作れる。」AIとツールで便利を生む非エンジニア。挫折も経験しながら、今は作る楽しさを発信中。詳しくはこちら

    -🛠 ツール制作ログ
    -, ,