話者分離付き文字起こし

それなりに高精度で高速な話者分離付き文字起こしがローカルで実現できる時代になりました。

本記事では、pyannote.audioによる話者分離とmlx-whisperによる高速文字起こしを組み合わせ、さらにSRT字幕ファイルを自動生成するワークフローを紹介します。

話者分離と文字起こしが同時にできれば良いのですが、残念ながらwhisperにその機能はないので、まず話者分離をpyannote.audioで実施します。
pyannote.audioはApple SiliconならMPS指定ができるので、かなり高速に実行可能です。
声質が似ていたり音量が小さいとかノイズが多かったりすると話者がうまく分離できないことはありますが、RNNoiseやdemucsで前処理したり、話者の人数を指定することで多少の改善が見込めます。

なお、pyannote.audioの話者分離モデル(例:pyannote/speaker-diarization-3.1など)は、Hugging Faceでの利用規約への同意が必須です。

[ 利用までの手順 ]
・Hugging Faceアカウントを作成
・以下のモデルページで「利用規約に同意(Accept)」をクリック
pyannote/segmentation-3.0
pyannote/speaker-diarization-3.1

文字起こしは当初、faster-whisperを使っていました。
faster-whisperはWhisper本家よりも高速化されているものの、MPSには現状非対応(CUDAには対応しています)らしく、CPU環境ではリアルタイム程度の速度が限界で、話者分離の高速さと比べるとどうしても長時間ファイルや複数話者の処理では処理待ち時間が気になる場面も多くありました。

そこで、Apple Siliconに最適化されたmlx-whisperに切り替えました。
large-v3モデルでも実時間の数倍速で処理可能です。
実際の文字起こしですと、14分の音声で話者分離込みで2分程度、60分の音声で10〜20分程度で処理完了するケースが多く、作業効率が大きく向上します。

あとはタイムスタンプ付きで文字起こししてSRT形式で出力し、いつものようにPyQt5でGUIを付けておきました。
翻訳を加えれば英語の動画音声を字幕付きにすることもできますし、会議音声を文字起こしした後、LLMに渡して要約して議事録生成したりと、わりと重宝するのではないかと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)