bunty's blog

ググったこととか勉強したことのメモ

whisper で話者分離を試してみる

前に Notion で書いていたブログからの移行分 (2023/2/11)

whisper で話者分離を試してみる

いくつか文字起こしのサービスを比較検討してみて、whisper が 1 番精度がよかったが、話者分離ができないことがネックだったのでそれを試してみた。試した日は 2023/02/11。

下記の記事がよくまとまっていたので、Google Colab で試してみた。

pyannote.audioで簡単話者分離〜whisperを添えて〜 - Qiita

動画を wav に変換

.wav にしないといけないようだったので ffmpeg で変換をする。

$ ffmpeg -i movie.webm -ar 16000 movie.wav

1番良い結果が得られるように試す

ベースは Qiita の記事のソースコードで、いくつか設定を変更して試してみる。

num_speakers の設定

今回は人数が 2人と決まっていたので num_speakers を設定。これは指定しておいて損はなさそう。

diarization = pipeline(audio_file, num_speakers=2)

language の設定

また、日本語が対象なので language も指定した。

text = model.transcribe(waveform.squeeze().numpy(), language="japanese")["text"]

明らかにおかしいなという結果が出るようになった。もちろん「ご視聴ありがとうございました」なんて一言も言ってないし、似てる言葉すら発していない。ちなみに large モデルで試していて、whisper 単体で文字起こしをするときに比べると体感で 2,3 割質が下がったように感じる。

[105.6s - 105.6s] SPEAKER_00: ご視聴ありがとうございました
[110.7s - 112.0s] SPEAKER_00: うん。分かりました。

[315.2s - 316.9s] SPEAKER_01: おやすみなさい
[318.7s - 319.4s] SPEAKER_01: おやすみなさい

[899.2s - 900.0s] SPEAKER_00: Focal on the play priority見てねお気に召したい被写体数少なくみんなおめでとうFocal on the play priority銘很に味わえるFocal on the play priorityお水食い

language の指定なし

逆に指定しない方が良いのかな?と思い試してみる。(気になるところを抽出してみた)

全体的に英語が増えたなという印象だが、よくみるとかなり色々な言語が混ざった結果になった。

[280.4s - 281.2s] SPEAKER_01: Mm-hmm.

[2132.3s - 2133.0s] SPEAKER_00: الله أكبر

[2200.8s - 2201.2s] SPEAKER_01: No, no.
[2222.1s - 2223.3s] SPEAKER_00: Yeah, you do.

[2377.4s - 2378.1s] SPEAKER_01: 過得好

[2507.6s - 2508.8s] SPEAKER_00: 정도되어 있었네.

出力に含まれる言語が日本語と英語だけなら、英語だけの出力は非表示にしてしまおうかと考えたが、なかなか色々なパターンが含まれており機械的にやるのは無理そう。

sample_rate の設定

これは sample 通り 16000 のままにした。もともと ffmpeg-ar 44100 を指定していたので、これに合わせて sample_rate も 44100 にしてみた。44100 に設定をするとほとんど一致する箇所がないくらいに質が下がった。

結論

  • 今回のやり方だと、話者分離はできるが精度が下がる
    • 事前に検証をした Amazon Transcribe と同じくらいの精度に感じた

次やりたいこと

  • 少し前にこれを見かけたので、このモデルを使ってみる

超高精度で商用利用可能な純国産の日本語音声認識モデル「ReazonSpeech」を無償公開

  • 話者分離の結果とwhisperの文字起こしを統合する処理を入れる

whisper 単体だとかなり精度が高く、今回試した方法だと話者分離ができる反面精度が下がるという結果だった。その意味でここにまとめられているケースは試してみたい。