WSL2でBetterWhisperXを試してみる
「OpenAI Whisperを拡張し、音声認識結果に音素単位のタイムスタンプと話者区別機能を付加しつつ、GPU最適化による高速処理と多言語対応を実現する、高精度かつ柔軟な音声文字起こしツール」らしいBetterWhisperXを試してみます。
使用するPCはドスパラさんの「GALLERIA UL9C-R49」。スペックは
・CPU: Intel® Core™ i9-13900HX Processor
・Mem: 64 GB
・GPU: NVIDIA® GeForce RTX™ 4090 Laptop GPU(16GB)・GPU: NVIDIA® GeForce RTX™ 4090 (24GB)
・OS: Ubuntu22.04 on WSL2(Windows 11)
です。
1. 準備
環境構築
python3.11 -m venv whisperx
cd $_
#
pip install whisperx
2. 音声データ
データどうしよう…
話者区別機能(話者ダイアライゼーション)を確認したいのですが、当方そういうデータを持ち合わせておりません。
shi3zさんから有り難いお言葉いただきました。
ただ、配信プラットフォームである「シラス」の音声利用は、「シラス利用規約 | シラス」の第12条第1項を読むに微妙なので、YouTubeの「銀座魂 ImaginationTankで松尾さんとAI漫画について語らう。」を使わせていただきます。
YouTubeからダウンロード
YouTubeの動画から音声データを作ります。
今回、yt-dlpを使います。Ubuntu 22.04のyt-dlpパッケージはバージョンが古い(2022.04.08)ため正常に動作しません。このため、GitHubから最新版をダウンロードします。
curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o ~/.local/bin/yt-dlp
chmod a+rx ~/.local/bin/yt-dlp
では、ダウンロードしつつ音声データへ変換します。
~/.local/bin/yt-dlp -f bestaudio --extract-audio --audio-format mp3 --audio-quality 0 https://www.youtube.com/watch\?v\=_PyPUi_PBD4
mp3ファイルが作成されました。
-rw-rw-r-- 1 user user 6899589 Dec 21 2022 '銀座魂 ImaginationTankで松尾さんとAI漫画について語らう。 [_PyPUi_PBD4].mp3'
3. 試してみる - CLI
コマンドラインから試してみます。
CUDA_VISIBLE_DEVICES=0 whisperx --compute_type float32 \
--model large \
--language ja \
~/銀座魂 ImaginationTankで松尾さんとAI漫画について語らう。\ \[_PyPUi_PBD4\].mp3
画面に何やら出力されました。
INFO:speechbrain.utils.quirks:Applied quirks (see `speechbrain.utils.quirks`): [allow_tf32, disable_jit_profiling]
INFO:speechbrain.utils.quirks:Excluded quirks specified by the `SB_DISABLE_QUIRKS` environment (comma-separated list): []
Lightning automatically upgraded your loaded checkpoint from v1.5.4 to v2.5.0.post0. To apply the upgrade to your files permanently, run `python -m pytorch_lightning.utilities.upgrade_checkpoint lib/python3.10/site-packages/whisperx/assets/pytorch_model.bin`
Model was trained with pyannote.audio 0.0.1, yours is 3.3.2. Bad things might happen unless you revert pyannote.audio to 0.x.
Model was trained with torch 1.10.0+cu102, yours is 2.5.1+cu124. Bad things might happen unless you revert torch to 1.x.
>>Performing transcription...
/mnt/data/shoji_noguchi/venv/whisperx.2/lib/python3.10/site-packages/pyannote/audio/utils/reproducibility.py:74: ReproducibilityWarning: TensorFloat-32 (TF32) has been disabled as it might lead to reproducibility issues and lower accuracy.
It can be re-enabled by calling
>>> import torch
>>> torch.backends.cuda.matmul.allow_tf32 = True
>>> torch.backends.cudnn.allow_tf32 = True
See https://github.com/pyannote/pyannote-audio/issues/1370 for more details.
warnings.warn(
Transcript: [0.605 --> 24.314] AI漫画すごいよね。すごいと思わない?思った。完全に思った。俺が最初に行った時、理解できてなかったでしょ。あの時はね、コンセプトが見えなかった。だから、俺はこれ練習だから。テクノエッジの。
Transcript: [24.5 --> 51.348] 要はどうやったら思い通りのキャラが出せるかとかどうやったら思い通りの場面が出せるかとかわざとテラサーVTっぽくやってるわけみんなあ、でもミッドジャーニーとかねあの手の絵だよねっていうあの手のやつだよねっていう感じでやってこんなの描きたくないよという漫画好きの人は思うわでもちゃんとキャラクター描いてやったらこれは面白いよこれ描けちゃうの?ってなってる
Transcript: [52.732 --> 80.879] 話もチャットGPTが考えてるしそこがすごいよねあれどのくらい考えたんですか?すんごいざっくりした話でもねそれも考えるのが一番難しいんですよ今まで漫画って3回くらい書こうとして2回書いたけど書かれたことはあるけれどもでも結局面白くできないもちろんハイボールですハイボールで第3話にしたらちゃんともうキャラクターが安定したじゃんこれすごくない?同じやつどんどん出てくる
Transcript: [82.499 --> 110.326] 最初はねサブローの顔が安定してなかったこれすごいな同じ人が服が変わるって今までできなかったわけですよステイムディフューションだけだとこれから新しいインプレックスの新機能のカスタムモデル学習を使うと同じ人の髪型とか服が違うっていうのができるようになってほら同じ人だって感じですよこれ大事ですよすごいはいじゃあマジで
Transcript: [111.001 --> 138.642] いや、AI漫画、これ来たよリンプレックスの新機能をバリパリに活かしてるじゃんそうそう、俺のために作ってるからねこれいいこれは僕のために作られたんじゃないかななんで?神さんの写真をあれだけ検討して思い出をネットで送るっていうなにその悲しいえ、奥さんって亡くなれたんだよね
Transcript: [139.739 --> 169.692] 写真はたくさん残ってるんですよその中のベストショットを何点か入れてそれでもう新しい写真できないそのために僕もいろいろ手は尽くしたんですよモデリングやってたりとかどこまで?写真を撮り込んで顔だけ撮り込んであとのボディのところはパラメータいじって3D化するソフトがある
Transcript: [170.08 --> 197.857] それでやって、ある程度のところまでいくんだけれども、それはあくまでもその写真からモデリングしたものであって、もう一つリアリティにかけるんですよね。わかる。それが俺がこの間YFYに書いた新体制ですよ。それをやるためには、例えば目とか口の中の構造とか、
Transcript: [198.177 --> 227.084] 歯がね、ちょっと右の方が、前歯が少し出てるとか、そういう細かいところをやらなくちゃいけないんだけれども、そういう解剖学的なところまでやりたくないわけですよ。夢だしね。そう。そんな、俺はちょっとやだよ、ぜひ。でも、写真はこう、何点かピックアップして、そのデストショットのものから、あり得たかもしれない写真というのを、まあ、捏造というか、作り出すってことはできるんじゃないですか。
Transcript: [227.641 --> 255.873] まさにそれより想像力を広げてなくなったペットシリーズっていうのがあってさ必ず持ち込まれるらしいんだよねベンチャーキャッターでわかります僕はペット飼ったことないからあんまりわからなかった奥さんだと現実的に本当そうだよねそのリアリティのある顔にできたら
Transcript: [256.177 --> 271.735] そこからまた同じツールを使ってモデリングもできるし、これ言うとね、みんなドン引きすると思うんですけど、出てる時も横にとみさんの工具を3Dプリンターで出したりとか、
/mnt/data/shoji_noguchi/venv/whisperx.2/lib/python3.10/site-packages/transformers/configuration_utils.py:311: UserWarning: Passing `gradient_checkpointing` to a config initialization is deprecated and will be removed in v5 Transformers. Using `model.gradient_checkpointing_enable()` instead, or if you are using the `Trainer` API, pass `gradient_checkpointing=True` in your `TrainingArguments`.
warnings.warn(
>>Performing alignment...
文字起こしされていますが・・・。話者区別しているように見えません。直下のディレクトリに5つファイルが作成されています。
$ ls -al
total 240
drwxrwxr-x 6 user user 4096 Jan 9 10:33 .
drwxr-xr-x 176 user user 4096 Jan 9 10:31 ..
drwxrwxr-x 2 user user 4096 Jan 9 10:32 bin
drwxrwxr-x 3 user user 4096 Jan 9 10:32 include
drwxrwxr-x 3 user user 4096 Jan 9 10:31 lib
lrwxrwxrwx 1 user user 3 Jan 9 10:31 lib64 -> lib
-rw-rw-r-- 1 user user 71 Jan 9 10:31 pyvenv.cfg
drwxrwxr-x 3 user user 4096 Jan 9 10:31 share
-rw-rw-r-- 1 user user 180685 Jan 9 14:06 '銀座魂 ImaginationTankで松尾さんとAI漫画について語らう。 [_PyPUi_PBD4].json'
-rw-rw-r-- 1 user user 4461 Jan 9 14:06 '銀座魂 ImaginationTankで松尾さんとAI漫画について語らう。 [_PyPUi_PBD4].srt'
-rw-rw-r-- 1 user user 4277 Jan 9 14:06 '銀座魂 ImaginationTankで松尾さんとAI漫画について語らう。 [_PyPUi_PBD4].tsv'
-rw-rw-r-- 1 user user 4130 Jan 9 14:06 '銀座魂 ImaginationTankで松尾さんとAI漫画について語らう。 [_PyPUi_PBD4].txt'
-rw-rw-r-- 1 user user 4388 Jan 9 14:06 '銀座魂 ImaginationTankで松尾さんとAI漫画について語らう。 [_PyPUi_PBD4].vtt'
$
一つずつ見ていきましょう。
(1).jsonファイル
サイズが大きいので整形して最初の30行近くのみを表示します。
一文字ずつ、開始時間/終了時間がミリ秒で示されていますね。
$ cat *.json | jq | head -34
{
"segments": [
{
"start": 7.488,
"end": 23.914,
"text": "AI漫画すごいよね。すごいと思わない?思った。完全に思った。俺が最初に行った時、理解できてなかったでしょ。あの時はね、コンセプトが見えなかった。だから、俺はこれ練習だから。テクノエッジの。",
"words": [
{
"word": "A",
"start": 7.488,
"end": 7.648,
"score": 0.875
},
{
"word": "I"
},
{
"word": "漫",
"start": 7.648,
"end": 7.768,
"score": 0.827
},
{
"word": "画",
"start": 7.768,
"end": 7.788,
"score": 0
},
{
"word": "す",
"start": 7.788,
"end": 7.808,
"score": 0
},
(2) .srtファイル
1
00:00:07,488 --> 00:00:23,914
AI漫画すごいよね。すごいと思わない?思った。完全に思った。俺が最初に行った時、理解できてなかったでしょ。あの時はね、コンセプトが見えなかった。だから、俺はこれ練習だから。テクノエッジの。
2
00:00:24,560 --> 00:00:51,148
要はどうやったら思い通りのキャラが出せるかとかどうやったら思い通りの場面が出せるかとかわざとテラサーVTっぽくやってるわけみんなあ、でもミッドジャーニーとかねあの手の絵だよねっていうあの手のやつだよねっていう感じでやってこんなの描きたくないよという漫画好きの人は思うわでもちゃんとキャラクター描いてやったらこれは面白いよこれ描けちゃうの?ってなってる
3
00:00:52,892 --> 00:01:20,699
話もチャットGPTが考えてるしそこがすごいよねあれどのくらい考えたんですか?すんごいざっくりした話でもねそれも考えるのが一番難しいんですよ今まで漫画って3回くらい書こうとして2回書いたけど書かれたことはあるけれどもでも結局面白くできないもちろんハイボールですハイボールで第3話にしたらちゃんともうキャラクターが安定したじゃんこれすごくない?同じやつどんどん出てくる
4
00:01:22,759 --> 00:01:50,026
最初はねサブローの顔が安定してなかったこれすごいな同じ人が服が変わるって今までできなかったわけですよステイムディフューションだけだとこれから新しいインプレックスの新機能のカスタムモデル学習を使うと同じ人の髪型とか服が違うっていうのができるようになってほら同じ人だって感じですよこれ大事ですよすごいはいじゃあマジで
5
00:01:51,001 --> 00:02:18,402
いや、AI漫画、これ来たよリンプレックスの新機能をバリパリに活かしてるじゃんそうそう、俺のために作ってるからねこれいいこれは僕のために作られたんじゃないかななんで?神さんの写真をあれだけ検討して思い出をネットで送るっていうなにその悲しいえ、奥さんって亡くなれたんだよね
6
00:02:20,980 --> 00:02:49,612
写真はたくさん残ってるんですよその中のベストショットを何点か入れてそれでもう新しい写真できないそのために僕もいろいろ手は尽くしたんですよモデリングやってたりとかどこまで?写真を撮り込んで顔だけ撮り込んであとのボディのところはパラメータいじって3D化するソフトがある
7
00:02:51,061 --> 00:03:17,777
それでやって、ある程度のところまでいくんだけれども、それはあくまでもその写真からモデリングしたものであって、もう一つリアリティにかけるんですよね。わかる。それが俺がこの間YFYに書いた新体制ですよ。それをやるためには、例えば目とか口の中の構造とか、
8
00:03:18,357 --> 00:03:47,064
歯がね、ちょっと右の方が、前歯が少し出てるとか、そういう細かいところをやらなくちゃいけないんだけれども、そういう解剖学的なところまでやりたくないわけですよ。夢だしね。そう。そんな、俺はちょっとやだよ、ぜひ。でも、写真はこう、何点かピックアップして、そのデストショットのものから、あり得たかもしれない写真というのを、まあ、捏造というか、作り出すってことはできるんじゃないですか。
9
00:03:48,401 --> 00:04:15,593
まさにそれより想像力を広げてなくなったペットシリーズっていうのがあってさ必ず持ち込まれるらしいんだよねベンチャーキャッターでわかります僕はペット飼ったことないからあんまりわからなかった奥さんだと現実的に本当そうだよねそのリアリティのある顔にできたら
10
00:04:16,337 --> 00:04:31,575
そこからまた同じツールを使ってモデリングもできるし、これ言うとね、みんなドン引きすると思うんですけど、出てる時も横にとみさんの工具を3Dプリンターで出したりとか、
(3) .tsvファイル
タブ区切り。
start end text
7488 23914 AI漫画すごいよね。すごいと思わない?思った。完全に思った。俺が最初に行った時、理解できてなかったでしょ。あの時はね、コンセプトが見えなかった。だから、俺はこれ練習だから。テクノエッジの。
24560 51148 要はどうやったら思い通りのキャラが出せるかとかどうやったら思い通りの場面が出せるかとかわざとテラサーVTっぽくやってるわけみんなあ、でもミッドジャーニーとかねあの手の絵だよねっていうあの手のやつだよねっていう感じでやってこんなの描きたくないよという漫画好きの人は思うわでもちゃんとキャラクター描いてやったらこれは面白いよこれ描けちゃうの?ってなってる
52892 80699 話もチャットGPTが考えてるしそこがすごいよねあれどのくらい考えたんですか?すんごいざっくりした話でもねそれも考えるのが一番難しいんですよ今まで漫画って3回くらい書こうとして2回書いたけど書かれたことはあるけれどもでも結局面白くできないもちろんハイボールですハイボールで第3話にしたらちゃんともうキャラクターが安定したじゃんこれすごくない?同じやつどんどん出てくる
82759 110026 最初はねサブローの顔が安定してなかったこれすごいな同じ人が服が変わるって今までできなかったわけですよステイムディフューションだけだとこれから新しいインプレックスの新機能のカスタムモデル学習を使うと同じ人の髪型とか服が違うっていうのができるようになってほら同じ人だって感じですよこれ大事ですよすごいはいじゃあマジで
111001 138402 いや、AI漫画、これ来たよリンプレックスの新機能をバリパリに活かしてるじゃんそうそう、俺のために作ってるからねこれいいこれは僕のために作られたんじゃないかななんで?神さんの写真をあれだけ検討して思い出をネットで送るっていうなにその悲しいえ、奥さんって亡くなれたんだよね
140980 169612 写真はたくさん残ってるんですよその中のベストショットを何点か入れてそれでもう新しい写真できないそのために僕もいろいろ手は尽くしたんですよモデリングやってたりとかどこまで?写真を撮り込んで顔だけ撮り込んであとのボディのところはパラメータいじって3D化するソフトがある
171061 197777 それでやって、ある程度のところまでいくんだけれども、それはあくまでもその写真からモデリングしたものであって、もう一つリアリティにかけるんですよね。わかる。それが俺がこの間YFYに書いた新体制ですよ。それをやるためには、例えば目とか口の中の構造とか、
198357 227064 歯がね、ちょっと右の方が、前歯が少し出てるとか、そういう細かいところをやらなくちゃいけないんだけれども、そういう解剖学的なところまでやりたくないわけですよ。夢だしね。そう。そんな、俺はちょっとやだよ、ぜひ。でも、写真はこう、何点かピックアップして、そのデストショットのものから、あり得たかもしれない写真というのを、まあ、捏造というか、作り出すってことはできるんじゃないですか。
228401 255593 まさにそれより想像力を広げてなくなったペットシリーズっていうのがあってさ必ず持ち込まれるらしいんだよねベンチャーキャッターでわかります僕はペット飼ったことないからあんまりわからなかった奥さんだと現実的に本当そうだよねそのリアリティのある顔にできたら
256337 271575 そこからまた同じツールを使ってモデリングもできるし、これ言うとね、みんなドン引きすると思うんですけど、出てる時も横にとみさんの工具を3Dプリンターで出したりとか、
(4) .txtファイル
文字起こしのみ。
AI漫画すごいよね。すごいと思わない?思った。完全に思った。俺が最初に行った時、理解できてなかったでしょ。あの時はね、コンセプトが見えなかった。だから、俺はこれ練習だから。テクノエッジの。
要はどうやったら思い通りのキャラが出せるかとかどうやったら思い通りの場面が出せるかとかわざとテラサーVTっぽくやってるわけみんなあ、でもミッドジャーニーとかねあの手の絵だよねっていうあの手のやつだよねっていう感じでやってこんなの描きたくないよという漫画好きの人は思うわでもちゃんとキャラクター描いてやったらこれは面白いよこれ描けちゃうの?ってなってる
話もチャットGPTが考えてるしそこがすごいよねあれどのくらい考えたんですか?すんごいざっくりした話でもねそれも考えるのが一番難しいんですよ今まで漫画って3回くらい書こうとして2回書いたけど書かれたことはあるけれどもでも結局面白くできないもちろんハイボールですハイボールで第3話にしたらちゃんともうキャラクターが安定したじゃんこれすごくない?同じやつどんどん出てくる
最初はねサブローの顔が安定してなかったこれすごいな同じ人が服が変わるって今までできなかったわけですよステイムディフューションだけだとこれから新しいインプレックスの新機能のカスタムモデル学習を使うと同じ人の髪型とか服が違うっていうのができるようになってほら同じ人だって感じですよこれ大事ですよすごいはいじゃあマジで
いや、AI漫画、これ来たよリンプレックスの新機能をバリパリに活かしてるじゃんそうそう、俺のために作ってるからねこれいいこれは僕のために作られたんじゃないかななんで?神さんの写真をあれだけ検討して思い出をネットで送るっていうなにその悲しいえ、奥さんって亡くなれたんだよね
写真はたくさん残ってるんですよその中のベストショットを何点か入れてそれでもう新しい写真できないそのために僕もいろいろ手は尽くしたんですよモデリングやってたりとかどこまで?写真を撮り込んで顔だけ撮り込んであとのボディのところはパラメータいじって3D化するソフトがある
それでやって、ある程度のところまでいくんだけれども、それはあくまでもその写真からモデリングしたものであって、もう一つリアリティにかけるんですよね。わかる。それが俺がこの間YFYに書いた新体制ですよ。それをやるためには、例えば目とか口の中の構造とか、
歯がね、ちょっと右の方が、前歯が少し出てるとか、そういう細かいところをやらなくちゃいけないんだけれども、そういう解剖学的なところまでやりたくないわけですよ。夢だしね。そう。そんな、俺はちょっとやだよ、ぜひ。でも、写真はこう、何点かピックアップして、そのデストショットのものから、あり得たかもしれない写真というのを、まあ、捏造というか、作り出すってことはできるんじゃないですか。
まさにそれより想像力を広げてなくなったペットシリーズっていうのがあってさ必ず持ち込まれるらしいんだよねベンチャーキャッターでわかります僕はペット飼ったことないからあんまりわからなかった奥さんだと現実的に本当そうだよねそのリアリティのある顔にできたら
そこからまた同じツールを使ってモデリングもできるし、これ言うとね、みんなドン引きすると思うんですけど、出てる時も横にとみさんの工具を3Dプリンターで出したりとか、
(5) .vttファイル
WEBVTT
00:07.488 --> 00:23.914
AI漫画すごいよね。すごいと思わない?思った。完全に思った。俺が最初に行った時、理解できてなかったでしょ。あの時はね、コンセプトが見えなかった。だから、俺はこれ練習だから。テクノエッジの。
00:24.560 --> 00:51.148
要はどうやったら思い通りのキャラが出せるかとかどうやったら思い通りの場面が出せるかとかわざとテラサーVTっぽくやってるわけみんなあ、でもミッドジャーニーとかねあの手の絵だよねっていうあの手のやつだよねっていう感じでやってこんなの描きたくないよという漫画好きの人は思うわでもちゃんとキャラクター描いてやったらこれは面白いよこれ描けちゃうの?ってなってる
00:52.892 --> 01:20.699
話もチャットGPTが考えてるしそこがすごいよねあれどのくらい考えたんですか?すんごいざっくりした話でもねそれも考えるのが一番難しいんですよ今まで漫画って3回くらい書こうとして2回書いたけど書かれたことはあるけれどもでも結局面白くできないもちろんハイボールですハイボールで第3話にしたらちゃんともうキャラクターが安定したじゃんこれすごくない?同じやつどんどん出てくる
01:22.759 --> 01:50.026
最初はねサブローの顔が安定してなかったこれすごいな同じ人が服が変わるって今までできなかったわけですよステイムディフューションだけだとこれから新しいインプレックスの新機能のカスタムモデル学習を使うと同じ人の髪型とか服が違うっていうのができるようになってほら同じ人だって感じですよこれ大事ですよすごいはいじゃあマジで
01:51.001 --> 02:18.402
いや、AI漫画、これ来たよリンプレックスの新機能をバリパリに活かしてるじゃんそうそう、俺のために作ってるからねこれいいこれは僕のために作られたんじゃないかななんで?神さんの写真をあれだけ検討して思い出をネットで送るっていうなにその悲しいえ、奥さんって亡くなれたんだよね
02:20.980 --> 02:49.612
写真はたくさん残ってるんですよその中のベストショットを何点か入れてそれでもう新しい写真できないそのために僕もいろいろ手は尽くしたんですよモデリングやってたりとかどこまで?写真を撮り込んで顔だけ撮り込んであとのボディのところはパラメータいじって3D化するソフトがある
02:51.061 --> 03:17.777
それでやって、ある程度のところまでいくんだけれども、それはあくまでもその写真からモデリングしたものであって、もう一つリアリティにかけるんですよね。わかる。それが俺がこの間YFYに書いた新体制ですよ。それをやるためには、例えば目とか口の中の構造とか、
03:18.357 --> 03:47.064
歯がね、ちょっと右の方が、前歯が少し出てるとか、そういう細かいところをやらなくちゃいけないんだけれども、そういう解剖学的なところまでやりたくないわけですよ。夢だしね。そう。そんな、俺はちょっとやだよ、ぜひ。でも、写真はこう、何点かピックアップして、そのデストショットのものから、あり得たかもしれない写真というのを、まあ、捏造というか、作り出すってことはできるんじゃないですか。
03:48.401 --> 04:15.593
まさにそれより想像力を広げてなくなったペットシリーズっていうのがあってさ必ず持ち込まれるらしいんだよねベンチャーキャッターでわかります僕はペット飼ったことないからあんまりわからなかった奥さんだと現実的に本当そうだよねそのリアリティのある顔にできたら
04:16.337 --> 04:31.575
そこからまた同じツールを使ってモデリングもできるし、これ言うとね、みんなドン引きすると思うんですけど、出てる時も横にとみさんの工具を3Dプリンターで出したりとか、
VRAMの最大使用量は11.8GBほど。
4. 試してみる - pythonコード
話者区別とあるけれども、上記の出力ファイルだと区別できているかどうかがよく分からないので、結果出力時に単純にprintせずspeakerの情報も含めて出力するようにしたコードを準備。
これをtranscribe_diarize.pyという名前で保存。引数は2つで、入力ファイルと出力ファイルのパスを指定できるようにしています。
import argparse
import whisperx
def main(audio_path, output_path):
device = "cuda"
# 1. Whisper モデルをロード
print("[INFO] Loading Whisper large model...")
model = whisperx.load_model("large", device=device, compute_type="float32")
# 2. 音声ファイルを文字起こし
print("[INFO] Transcribing audio...")
result = model.transcribe(audio_path, batch_size=16)
# 3. 音素アライメントモデルをロード
print("[INFO] Loading alignment model...")
align_model, align_metadata = whisperx.load_align_model(language_code=result["language"], device=device)
# 4. 音素アライメントを実行
print("[INFO] Performing phoneme alignment...")
aligned_result = whisperx.align(
transcript=result["segments"],
model=align_model,
align_model_metadata=align_metadata,
audio=audio_path,
device=device
)
# 5. 話者区別の実行
print("[INFO] Performing speaker diarization...")
diarization_pipeline = whisperx.DiarizationPipeline(device=device)
diarization_result = diarization_pipeline(audio=audio_path)
# 6. 認識結果と話者区別結果を統合
print("[INFO] Merging transcription and speaker information...")
merged_result = whisperx.assign_word_speakers(diarization_result, aligned_result)
# 7. 結果を出力
print("[INFO] Saving transcription with speaker information to file...")
with open(output_path, "w", encoding="utf-8") as output_file:
for segment in merged_result["segments"]:
output_file.write(
f"[Speaker {segment['speaker']}] {segment['text']} (Start: {segment['start']}, End: {segment['end']})\n"
)
print(f"[INFO] Transcription saved to {output_path}")
if __name__ == "__main__":
# コマンドライン引数の設定
parser = argparse.ArgumentParser(description="Transcribe and diarize an audio file, then save results to a file.")
parser.add_argument("audio_path", type=str, help="Path to the audio file (MP3 format).")
parser.add_argument("output_path", type=str, help="Path to save the transcription results.")
args = parser.parse_args()
# 指定された音声ファイルを処理
main(args.audio_path, args.output_path)
では実行。
CUDA_VISIBLE_DEVICES=0 python transcribe_diarize.py ~/銀座魂 ImaginationTankで松尾さんとAI漫画について語らう。\ \[_PyPUi_PBD4\].mp3 output.txt
output.txtの内容がこちら。
[Speaker SPEAKER_00] AI漫画すごいよね。すごいと思わない?思った。完全に思った。俺が最初に行った時、理解できてなかったでしょ。あの時はね、コンセプトが見えなかった。だから、俺はこれ練習だから。テクノエッジの。 (Start: 7.488, End: 23.914)
[Speaker SPEAKER_00] 要はどうやったら思い通りのキャラが出せるかとかどうやったら思い通りの場面が出せるかとかわざとテラサーVTっぽくやってるわけみんなあ、でもミッドジャーニーとかねあの手の絵だよねっていうあの手のやつだよねっていう感じでやってこんなの描きたくないよという漫画好きの人は思うわでもちゃんとキャラクター描いてやったらこれは面白いよこれ描けちゃうの?ってなってる (Start: 24.56, End: 51.148)
[Speaker SPEAKER_00] 話もチャットGPTが考えてるしそこがすごいよねあれどのくらい考えたんですか?すんごいざっくりした話でもねそれも考えるのが一番難しいんですよ今まで漫画って3回くらい書こうとして2回書いたけど書かれたことはあるけれどもでも結局面白くできないもちろんハイボールですハイボールで第3話にしたらちゃんともうキャラクターが安定したじゃんこれすごくない?同じやつどんどん出てくる (Start: 52.892, End: 80.699)
[Speaker SPEAKER_00] 最初はねサブローの顔が安定してなかったこれすごいな同じ人が服が変わるって今までできなかったわけですよステイムディフューションだけだとこれから新しいインプレックスの新機能のカスタムモデル学習を使うと同じ人の髪型とか服が違うっていうのができるようになってほら同じ人だって感じですよこれ大事ですよすごいはいじゃあマジで (Start: 82.759, End: 110.026)
[Speaker SPEAKER_01] いや、AI漫画、これ来たよリンプレックスの新機能をバリパリに活かしてるじゃんそうそう、俺のために作ってるからねこれいいこれは僕のために作られたんじゃないかななんで?神さんの写真をあれだけ検討して思い出をネットで送るっていうなにその悲しいえ、奥さんって亡くなれたんだよね (Start: 111.001, End: 138.402)
[Speaker SPEAKER_01] 写真はたくさん残ってるんですよその中のベストショットを何点か入れてそれでもう新しい写真できないそのために僕もいろいろ手は尽くしたんですよモデリングやってたりとかどこまで?写真を撮り込んで顔だけ撮り込んであとのボディのところはパラメータいじって3D化するソフトがある (Start: 140.98, End: 169.612)
[Speaker SPEAKER_01] それでやって、ある程度のところまでいくんだけれども、それはあくまでもその写真からモデリングしたものであって、もう一つリアリティにかけるんですよね。わかる。それが俺がこの間YFYに書いた新体制ですよ。それをやるためには、例えば目とか口の中の構造とか、 (Start: 171.061, End: 197.777)
[Speaker SPEAKER_01] 歯がね、ちょっと右の方が、前歯が少し出てるとか、そういう細かいところをやらなくちゃいけないんだけれども、そういう解剖学的なところまでやりたくないわけですよ。夢だしね。そう。そんな、俺はちょっとやだよ、ぜひ。でも、写真はこう、何点かピックアップして、そのデストショットのものから、あり得たかもしれない写真というのを、まあ、捏造というか、作り出すってことはできるんじゃないですか。 (Start: 198.357, End: 227.064)
[Speaker SPEAKER_00] まさにそれより想像力を広げてなくなったペットシリーズっていうのがあってさ必ず持ち込まれるらしいんだよねベンチャーキャッターでわかります僕はペット飼ったことないからあんまりわからなかった奥さんだと現実的に本当そうだよねそのリアリティのある顔にできたら (Start: 228.401, End: 255.593)
[Speaker SPEAKER_01] そこからまた同じツールを使ってモデリングもできるし、これ言うとね、みんなドン引きすると思うんですけど、出てる時も横にとみさんの工具を3Dプリンターで出したりとか、 (Start: 256.337, End: 271.575)
SPEAKER_00, SPEAKER_01と二人しゃべっていることは認識しているけれども、沈黙時間が区切りになっているように見えますね。
VRAM使用量のMAXは12.9GBほど。
5. まとめ
話者区別機能(話者ダイアライゼーション)は働いているけれども、複数人の音声が途切れなく(=途切れがあると判断されず)繋がっている場合、分離されないようです。
ただ、一文字単位で開始時間/終了時間が解析されるのは、テロップ作成にはとても便利だなと思います。
X. おまけ - Unable to load any of …
pip install whisperxではなく、git cloneしてインストールすると、動的ライブラリが見つからないとのエラーに遭遇するl可能性があります。
INFO:speechbrain.utils.quirks:Applied quirks (see `speechbrain.utils.quirks`): [disable_jit_profiling, allow_tf32]
INFO:speechbrain.utils.quirks:Excluded quirks specified by the `SB_DISABLE_QUIRKS` environment (comma-separated list): []
Lightning automatically upgraded your loaded checkpoint from v1.5.4 to v2.5.0.post0. To apply the upgrade to your files permanently, run `python -m pytorch_lightning.utilities.upgrade_checkpoint BetterWhisperX/whisperx/assets/pytorch_model.bin`
Model was trained with pyannote.audio 0.0.1, yours is 3.3.2. Bad things might happen unless you revert pyannote.audio to 0.x.
Model was trained with torch 1.10.0+cu102, yours is 2.5.1+cu124. Bad things might happen unless you revert torch to 1.x.
>>Performing transcription...
/mnt/data/shoji_noguchi/venv/whisperx/lib/python3.10/site-packages/pyannote/audio/utils/reproducibility.py:74: ReproducibilityWarning: TensorFloat-32 (TF32) has been disabled as it might lead to reproducibility issues and lower accuracy.
It can be re-enabled by calling
>>> import torch
>>> torch.backends.cuda.matmul.allow_tf32 = True
>>> torch.backends.cudnn.allow_tf32 = True
See https://github.com/pyannote/pyannote-audio/issues/1370 for more details.
warnings.warn(
Unable to load any of {libcudnn_cnn.so.9.1.0, libcudnn_cnn.so.9.1, libcudnn_cnn.so.9, libcudnn_cnn.so}
Invalid handle. Cannot load symbol cudnnCreateConvolutionDescriptor
/usr/lib/x86_64-linux-gnuに該当ファイルはありますが、ライブラリパスには含まれていません。
$ find /usr | grep libcudnn_cnn
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_infer_static.a
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_infer_static_v8.a
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_train_static.a
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_static_v9.a
/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_infer.so.8.9.7
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_train.so.8.9.7
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_train.so.8
/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_train_static_v8.a
/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.6.0
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_static.a
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_infer.so.8
$
かといって、LD_LIBRARY_PATH に /usr/lib/x86_64-linux-gnu を先頭に追加すると nvidia-smiコマンドやらが発狂してしまいます。
このファイル、実は、venvのlib64の下の方にインストールされています。
$ ls -l /path/to/venv/lib64/python3.10/site-packages/nvidia/cudnn/lib
total 999020
drwxrwxr-x 3 user user 4096 Jan 8 08:46 ./
drwxrwxr-x 5 user user 4096 Jan 8 08:46 ../
-rw-rw-r-- 1 user user 0 Jan 8 08:46 __init__.py
drwxrwxr-x 2 user user 4096 Jan 8 08:46 __pycache__/
-rw-rw-r-- 1 user user 104664 Jan 8 08:46 libcudnn.so.9
-rw-rw-r-- 1 user user 240706416 Jan 8 08:46 libcudnn_adv.so.9
-rw-rw-r-- 1 user user 4724176 Jan 8 08:46 libcudnn_cnn.so.9
-rw-rw-r-- 1 user user 569645536 Jan 8 08:46 libcudnn_engines_precompiled.so.9
-rw-rw-r-- 1 user user 9585864 Jan 8 08:46 libcudnn_engines_runtime_compiled.so.9
-rw-rw-r-- 1 user user 3442456 Jan 8 08:46 libcudnn_graph.so.9
-rw-rw-r-- 1 user user 86326864 Jan 8 08:46 libcudnn_heuristic.so.9
-rw-rw-r-- 1 user user 108421928 Jan 8 08:46 libcudnn_ops.so.9
ですので適切な対処は、「venvディレクトリ配下にあるlib64/python3.10/site-packages/nvidia/cudnn/lib をLD_LIBRARY_PATHに追加」です。
export LD_LIBRARY_PATH=/path/to/venv/lib64/python3.10/site-packages/nvidia/cudnn/lib${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
コマンドラインの /path/to を適切に変更ください。これで解決します。