この記事の概要を簡単まとめ!
- ゆかコネ×AIの研究はDiscordで盛んである
- OpenAIの音声認識AI”Whisper”が2022年9月に登場
- 外部ツールとしてTYAPA氏によりゆかコネで使用可能になった
- 前提条件:NVIDIA製GPUで1000番台以上を使用している
- 機械学習の応用であるためPython3.1.17のインストールが必要
- プログラミング未経験者がつまづく部分の初期設定も解説
- 使用感想:かなり正確、ノイズ除去調整で良くなる
- 問題:int8_bfloat16が使用できない場合、VRAMの余裕がなくなる
- 解決策:3000番台以上を使うか機械学習専用GPUの2枚運用を行う
- GPUに余裕があれば、正確性はより高くなる
ゆかコネ検証はやり始めると止まらない。また、検証にあたってはうーちゃんからヒントを貰うことが多い。技術への探求心は互いに高いということであろう。そして検証結果をまとめてどこかに残しておくことで、私の知らないところで誰かがゆかコネで困っていることを解決しているであろう。
AIの発展はゆかコネの使い方にも影響を与えている。OpenAIのGPT-3系が公開されるとAIアシスタントで使われるようになり、このあたりを積極的に使用・調査している人もいる。一方で音声認識では同じくOpenAIの”Whisper”が公開され、有志によりゆかコネで使えるものが制作された。使うには準備が必要なため、その解説をすることにした。
ひとっ飛びできる目次
これも機械学習の応用
ゆかコネとAI
ゆかコネとGPT-3系
AIが急速に進化した2022年。それは愚かな人間性を露わにした年として、個人的には忌むべき時期である。そんな中で登場したOpenAIによる数々の「作品」は、世界のパワーバランスを大きく変えるものになったことはもう説明しなくても理解しているであろう。
現時点でOpenAIのチャットボットであるChatGPTは、一般ユーザーが使えるものはGPT-3.5となっている。有料版は最新となるGPT-4である。そのため殆どがGPT-3.5で動かしているものと推定される。また、個別にGPT-3.5やGPT-4のAPIを取得可能で、これを自分のアプリやシステムに組み込むといったことも可能になっている。別途料金がかかるはずだが、その詳細は公式サイトが詳しいはずだ。
ゆかコネではそのAPIを使って、所謂「AIアシスタント」を使いたいという要望が上がるようになった。そこでNao氏はゆかNEOv2.0.94以降で現在の「GPT3整形/AIアシスタント」プラグインを実装。OpenAIから個人で取得したAPIを使用することで、文章加工、マスク(不適切な表現の削除)、画像生成といった補助的な機能から、起動ワードを使った応答、提案といったアシスタント的役割を使うことができるようになっている。生成された結果はゆかコネのプラグインを介して他のアプリにも送信できる設計となっている。
OpenAIの音声認識AI”Whisper”が2022年9月に登場
2022年は、7月から順次登場した「呪文」型画像生成系AI、特にMidjourney, Stable Diffusion, NovelAIがあまりにも影響力がありすぎたせいで、他のAIが霞んでしまうほどになってしまった。そのせいで本来なら目立つべきものが目立たなくなってしまったものがある。2022年9月、OpenAIが公開した音声認識モデル”Whisper“は、音声認識の新しい方法として期待されるものになった。
OpenAI公式ドキュメントとGitHubにある資料によれば、WhisperはWeb上から収集した68万時間の多言語音声データを教師あり学習でトレーニングを行わせた自動音声認識システム(ASR)である。これによりアクセント、背景雑音、専門用語に対する堅牢性=認識の正確性が向上するという。また、多言語音声データを用いたことによって、この手のものは英語以外非対応ということが多いところ、英語以外の言語の文字起こしや、英語から他の言語への翻訳も可能なものになっている。
所謂ソースコードや技術的な部分に関しては専門的な話となるため割愛するが、日本語の文字起こし精度(誤り率)はFleursデータセットの言語別WERを、large-v3モデルを用いて示した結果で8位(4.9%)という結果を出している。以前のデータではlarge-v2モデルで5.3%であったようで、この結果から一般に認識が難しいとされる日本語の誤り率を5%以内に抑えていることは非常に高い性能を誇ると言える。よってこの結果からWhisperを使用すれば、より正確な「日本語の」音声認識を行えることを示している。
外部ツールとしてTYAPA氏によりゆかコネで使用可能になった
OpenAIの制作したAI関係のAPIは、原則として個人契約によって使用可能になる。GPTシリーズがそうで、しかし別途有料なために使っている人はごく一部という感じである。一方でWhisperは機械学習の応用であり、機械学習と言えば必ず出てくる言語がPythonだ。どうやらOpenAIはWhisperのPythonパッケージを用意しているようで、Pythonに触れたことがある人ならpipコマンドでそれをダウンロードできるようになっている。ただし実行には他にffmpegも必要であると公式で書かれており、このことから他に動作に必要なものが存在する。正直、いくらPythonが言語的に分かりやすいと言っても、プログラミング未経験者が一から構築するようなことは要求される内容が高度過ぎて不可能である。
では折角の音声認識なのにゆかコネでは使えないのかといえば、実はそうでもなかった。これまでゆかコネは有志が外部ツールとして制作したものがあり、後にNao氏により公式化したものが多い。そして今回の有志は、1995年からWindowsのプログラミングのキャリアを持つ専門家で、VC++があれば何でも作れるというTYAPA氏である。明らかに第一線で活躍するであろう凄腕のプログラマが、おそらくは自分で使うために、Pythonの知識とMS-DOS(バッチファイル)の知識をフル活用してゆかコネで使えるものを作り上げた。
名称は”YukariWhisper“で、ベースはfaster-whisperである。(今使っている人がいるかどうか知らないが)ゆかりねっと、ゆかコネとの接続が可能なように専用設計されている。そしてプログラミング未経験者でも大丈夫なように、環境構築が自動で行われるようバッチファイルが用意されているものになっている。実行もバッチファイルのダブルクリックで行えるように設計されているものだ。環境構築の手順は全て手動でやると大変なことになるのだが、YukariWhisperはPyhtonの仮想環境技術venv
を利用して、その仮想環境の中に必要なものを全て落とし込み、音声認識を使用する時だけそれを走らせるという形式を取っている。それに際しての必要なパッケージのダウンロード(pip
コマンド)もバッチファイルによって全て自動化されている。
実行するにあたって、あらかじめ指定バージョンのPythonをインストールしておく必要があるが、準備するのはそれだけである。ただそのまま実行するとエラーが発生してうまくいかないことが予想されるため、その解説と実際に使用した結果と考察を記録していくこととする。
YukariWhisperを準備する
前提条件
まずは前提条件を確認する。以下のものが必要である。
- Python 3.9~3.11.7。推奨はPython 3.11.7。Python 3.12ではWhisperが動作しない1)公式では使用ライブラリの関係で3.12には対応していない。以前は3.10までだったが、後に3.11系にも対応したので現在は3.11系でも使用可能である。ため不可。
- NVIDIA製GPU:1000番台以降のモデル。しかし元が機械学習系であるため、ハイエンドモデルでなければ期待する効果は得にくい。また、VRAMは実測最低値で4GB消費するため、単一のGPUに担当させるのであれば最低でも16GBなければ厳しい。ただし、GPU選択機能があるので複数挿し環境ではエントリーモデルでも十分対応できる可能性はある。なお、技術的な部分で現時点でAMD製GPUは非対応である。
- ストレージ:最低10GBの空き容量。仮想環境の構築で容量を消費するため。
- OSはWindows 10以降とする。
TYAPA氏は3080Tiを使用しているが、私の環境では2080Tiを使用している。後述の問題もあって結果に影響することがあるので留意されたい。
準備と環境構築
先にPythonの準備を行う。Pythonの公式ページ(正式なURLはpython.org)からダウンロードへ飛び、3.11.7を探してその行のダウンロードリンクをクリックする。そこからWindows installer (64-bit)をクリックしてインストーラをダウンロードする。インストーラを実行し、ウィザードに従って操作していけば基本的には問題ない。インストール時は環境変数PATH[任意のパス]\Python311
, [任意のパス]\Python311\Scripts\
が追加されていることも確認しておく。
次にYukariWhisperのリリースページから、最新のバージョンをダウンロードする。形式はZIPファイル、執筆時点での最新はv0.0.2である。これを(USB等のリムーバブルディスク以外の)任意の場所に解凍しておく。Pythonが正しくインストールされて、環境変数の設定も問題なければ、解凍後のディレクトリに存在するsetup.batを実行することで、自動で環境構築が開始される。バッチファイルであるがダブルクリック実行で問題ない。
完了まで約10分程度、pip
が自動実行され、必要なものが全てダウンロードされるとcmd画面に「続行するには何かキーを押してください . . .
」と表示される。この状態になった後は任意のキーを押してバッチファイルを終了することで、環境構築が完了する。
スポンサーリンク
スポンサーリンク
実行前の確認事項
後はrun.batを実行することで自動で立ち上がるが、その前に実行時に引っかかったこととして2点ある。
ValueError: Requested int8_bfloat16 compute type, but the target device or backend do not support efficient int8_bfloat16 computation.
が発生してrun.batが停止する。
環境構築完了後にrun.batを実行して発生したPythonのエラーである。要するにint8_bfloat16で動かそうと思ったが、システムはそうではないため無理だったというエラーである。詳細を語ると機械学習とNVIDIA GPUについて長話しなければならないので省略するが、そのモードはGPUが非対応だというエラーである。これはそもそもGPU自体の問題である。というのも、int8はCUDA CCが6.1ないし7.0以上で実装されているが、bfloat16はCUDA CCが8.0以上のものに実装されている浮動小数点演算形式で、これは3000番台以上でなければ使えないものになる。2080Tiをはじめとする2000番台のCUDA CCが一律7.5で8.0未満であり、bfloat16をサポートしない。したがってこれではどうやっても動作不可能である。この場合はyukariwhisper.iniの23~26行目にあるwhisper_device = [cpu or gpu]
のwhisper_device = cuda_8
をコメントアウトし、whisper_device = cuda_16
を有効にすることで回避できる。もっと簡単な方法は、VRAMの多い3000番台に交換するか機械学習専用で補助電源不要のGPUを挿し、それに担当させることである。
OSError: [WinError 10048] 通常、各ソケット アドレスに対してプロトコル、ネットワーク アドレス、またはポートのどれか 1 つ のみを使用できます。
が発生して停止する。
これは指定したポートが他で使われている場合に発生するものである。YukariWhisperはOSCでマイクと接続しており、その接続を担当するYukariWhisper/oscserver.pyを調査すると、次の関数が原因と分かった。
1 2 3 4 5 6 7 8 9 |
# 前後に他のコード def worker(self): dispatcher = Dispatcher() dispatcher.map("/avatar/parameters/MuteSelf", self.print_volume_handler, "Volume") server = osc_server.ThreadingOSCUDPServer( ("127.0.0.1", 9001), dispatcher) server.serve_forever() #前後に他のコード |
この関数のserver = osc_server.ThreadingOSCUDPServer( ("127.0.0.1", 9001), dispatcher)
の部分で、ポート番号を9001で決め打ち指定している。これはVRChatユーザーには落とし穴である。VRC-OSCプラグインを有効にしていて、デフォルトでVRC->NEOを9001、NEO->VRCを9000を変更していない人が多いと思われる。これが原因で、既に使われているポートを指定しようとして失敗しているのである。解決策は簡単で、9000, 9001以外の他のポートにして保存すればいいだけである。
上記はプログラミング経験者なら造作もないことであるが、ゆかコネユーザーの約7~8割前後は全く触ったことのない人が多いと予想している。そのためここにメモを残している。ここまでできたら、後はrun.batを実行すればいいだけである。
YukariWhisperで音声認識しよう
実行にあたって、音声認識に影響を与えるyukariwhisper.iniの設定は以下の通りである。
whisper_model_size = large-v3
モデルはlarge-v3を使用whisper_device = cuda_16
前述の条件からこれ以外使用できないdebug_out_text = y
cmd画面に音声認識結果を出力する。これはログとして利用するenergy_threshold = 700
音のエネルギーの閾値。これより下の場合は無音とみなす処理になる。ノイズ対策energy_threshold_Low = 500
音のエネルギーの最低閾値。動的エネルギー閾値が0となるとき、周囲のノイズを取り込んでしまうことへの暫定対策処置である。
これらの設定はあくまでも暫定的なもので、環境と使用機材によって常に変動・調整する必要がある。
run.bat実行後の挙動
run.batを実行すると、cmd画面が表示されてバッチファイルが進行する。まず仮想環境を実行するためのファイル(venv\Scripts\activate
)を呼び出し、その後YukariWhisperにディレクトリを移動してPythonを実行する形となる。ファイルロードで少し時間がかかるので待つこと。その後は以下の通りになるまで進めること。
デフォルトはGPU0が選択される。2つ以上のGPUを使用している場合はyukariwhisper.iniの43行目でGPU番号を書き換えることで対応する。また、GPU名の右に出る数字はCUDA Compute Capabilityを示している。その後、WSポート確認が入り、デフォルトは50000でセットされている。まれに接続に失敗する場合があるが、これはゆかコネ側でポートが変更されていることが原因であることも多い。現在この設定はyukariwhisper.iniの8行目で管理しているが、良くも悪くも決め打ち指定であるため、将来的に自動でポートが変更されたときに対応できなくなる。これに対する解決策はPythonライブラリ”winreg”でゆかコネWSポートを起動時に動的取得することで、実はそのスクリプトは私自身が関数として既に作り上げた。実装はTYAPA氏との相談となるであろう。
スポンサーリンク
スポンサーリンク
次に音声認識に使用するデバイスを数字で選択する。デバイスは一覧表示されるが、文字コードの関係でどうしても日本語の文字化けが発生する。デバイス名は英語のため文字化けは発生しないので、そこから判断できる。ここで正しく選択できていれば、音声認識が開始される。
実際の音声認識
使いまわしとなるが、音声認識の比較データを取った際に収録した動画がある。元はHEVCで録画したため、それをH.264にしたものを掲載する。
使用した音声はノイズ除去済みの録音音声であり、実際の配信では構成の関係でノイズ除去を行わないものを認識させることになる。その違いはあるが、認識結果はほぼ思っている通りになった。正確性が高く、ちょっとした発音の違いを読み取っていることから、公式が公開している誤り率4.9%は、本当にその通りであると言える。元となるWhisperはFaster-Whisperで使われており、その実用例として音声の文字起こしに利用しているパターンが多い。そのことからもノイズが比較的少ない音声に対して認識をかけた場合、ほぼ修正を加えることなく音声認識できるということになるであろう。
ノイズと閾値
実際の配信で、ノイズ除去を行わずにマイクからの直接の音声認識を試した。普段はDAW(Cakewalk)を使用していないのでノイズ除去を適用しておらず、その代わりに閾値調整でノイズ除去を行うようにした。とはいえ閾値調整はあくまでソフトウェアフィルタであり、マイク側でハードウェア的に音量調整できる場合は、その音量によっては効果がないことがある。その上での結果は、殆どが喋った通りの結果となるのだが、時々ノイズが入り込んで意味の無い字幕を出力することがあった。このことはTYAPA氏があらかじめ確認済みであり、ngwords.txtである程度出力しないよう制御している。
ただ、その上でもまだノイズの取り込みがあるので、ノイズが確認でき次第それに追加していくのが暫定の対策手段となる。さらに精度を上げるなら、DAW等でノイズ除去を行って、仮想オーディオデバイスに出力させてそこから音声認識を行わせると理想的である。それでも多少のノイズは入り込むことは避けられないので、後は努力次第というのがもどかしい限りであるが。
スポンサーリンク
スポンサーリンク
VRAM消費量とGPU
検証中、普段は問題とならなかったGPU性能が実用上の問題として浮上した。現在使用しているRTX 2080Tiは登場から5年以上経ってもまだ十分戦えるGPUであり、性能も申し分ない。なので殆どのことはこれ1つで解決できるほどに強いのだが、しかし唯一の問題があった。2080Tiですら、VRAMが足りなくなったのである。
YukariWhisperの使用VRAMは説明では1.7GBとしているが、それはint8_bfloat16が利用できる場合の理想値であると考える。float16の場合は事情が違うわけで、当然使用量も多くなるはずだ。そこで各モデル毎のVRAM使用量を、タスクマネージャーで確認すると次のようになった。
音声認識モデル | GPU使用量(最低値想定)[GB] |
large-v3 | 3.60~4.00 |
large-v2 | 3.50 |
medium | 2.50 |
small | 1.00 |
起動前と起動後のタスクマネージャーの値を記録し、その差を取ることで使用量となる。想定しているよりも使用量が多く、これにゲーム消費分、配信や録画の消費分、2D/3Dモデル消費分で総計すると、2080Tiの11GBでは足りない。しかも実際に足りなくなった瞬間を経験している。あるときいつものように伝説のレジェンドを配信している時に急激にゲームが動かなくなり、その瞬間に見たタスクマネージャーはVRAMのグラフが埋まっていたのである。つまり、私の構成では実用に耐えないのである。これもTuringアーキテクチャがbfloat16をサポートしていないことが原因である。
ではどうしたらいいか。答えはエラーのところでも解説したように、GPUをアップグレードするのが最も早い。そこで代表的なNVIDIA製GPU(コンシューマ向け)をもとに以下の表を作成した。
モデルネーム | 世代 | ベースクロック[MHz] | ブーストクロック[MHz] | メモリクロック[MHz], 実効値[Gbps] | VRAM[GB] | VRAM規格 | CUDA CC ver. |
GTX 1050Ti | Pascal | 1291 | 1392 | 1752, 7 | 4 | GDDR5 | 6.1 |
GTX 1080Ti | 1481 | 1582 | 1376, 11 | 11 | GDDR5X | ||
RTX 2080Ti | Turing | 1350 | 1545 | 1750, 14 | 11 | GDDR6 | 7.5 |
TITAN RTX | 1350 | 1770 | 1750, 14 | 24 | |||
RTX 3060Ti | Ampere | 1410 | 1665 | 1750, 14 | 8 | GDDR6 | 8.6 |
RTX 3070Ti | 1575 | 1770 | 1188, 19 | 8 | GDDR6X | ||
RTX 3080Ti | 1365 | 1665 | 1188, 19 | 12 | |||
RTX 4060 | Ada Lovelace | 1830 | 2460 | 2125, 17 | 8 | GDDR6 | 8.9 |
RTX 4070 | 1920 | 2475 | 1313, 21 | 12 | GDDR6X | ||
RTX 4070Ti | 2310 | 2610 | 1313, 21 | 12 | |||
RTX 4080 | 2205 | 2505 | 1400, 22.4 | 16 | |||
RTX 4090 | 2235 | 2520 | 1313, 21 | 24 |
上記で明確にラインを引くのであれば、2080Ti/TITAN RTXと3060Tiの間になる。これは単純にCUDA CCのバージョンから判定したものである。もしcuda_8で動作するなら、理想値1.7GBで動作させることができるはずで、その分軽量化が可能だからだ。おそらく8GBでも詰めれば何とか間に合うレベルになるであろう。理想は3080Tiで、cuda_8で動作するうえにVRAMも十分で、数年は買い替える必要もなくなる。コストを度外視できるならTITAN RTXという手もあるが、既に古いモデルなので非現実的である。
だがどうしてもGPUは高い買い物になり、中古ですら状態が良いものを見つけるのは難しい状況だ。そこで2つ目の提案となるのが、機械学習専用GPUの導入である。最低動作条件が1000番台以上ということは、GT1030というゴミを除いたPascal世代のGPUで動作するということを意味する。一応Pascal世代のGPUもfloat16を使用できるようで、その例として1050TiのTechPowerUpのデータベースを見ると、”FP16(half): 33.41 GFLOPS(1:64)”の記載がある。これは使用できない場合記載しないはずなので、このことからfaster-whisperは1000番台でも動作するということになる。
しかし速度単位はGFLOPSであり、2080Tiの場合は26.90TFLOPSで速度に圧倒的差がある。これは音声認識の反応速度に影響するはずなので、2080Tiを利用した場合よりも遅れることが予想される。しかし1050Tiは4GBであり、YukariWhisper large-v3のVRAMを完全に肩代わりすることはできる。また、1050Tiは補助電源不要なモデルが多いため、PCIe x16が2つ以上ありレーン数が足りている場合は使う価値はある。どちらが良いかは、自分の予算とPCスキルと構成に相談である。
後日1050Tiで検証したのだが、ハードウェア的にfloat16をサポートしていても、CTranslate2ではサポートされていないため、結局float16での動作は不可能であった。その場合はfloat32にすることで動作するが、この形式はVRAMをfloat16以上に消費するので、4GBしかない1050Tiでは停止してしまった。これを無理矢理に、int8_float32で変換させることによって解消できたものの、反応速度、音声認識精度はfloat16より低下してしまっており、実用に耐えないものであった。このことからPascal世代のGPUでは実質動作不可能ということである。嘘つきやがったな!
GPUに余裕があれば、正確性はより高くなる
機械学習の終着点にあるであろうAI技術は進化を続けている。あと少しすればもはや人間の手を加えることなくAIは自己成長をするのではないか、そんなSFじみた世界も目の前にある気がしている。それが既存の様々なシステム、サービス、アプリケーションに影響を与えており、今まで機械の手が届かなかったところですら介入している状況である。それは音声認識も例外ではない。
ゆかコネで使える音声認識は主にChromeまたはEdgeのブラウザから音声認識を通す、UDトークから音声認識を行いその結果をゆかコネに転送するという形が主であった。構築難易度ではブラウザ、音声認識精度ではUDトークがこれまでの傾向である。ブラウザはどうしても精度が低く、状況によっては音声認識の取りこぼしが発生し、UDトークは直接接続以外はインターネット回線によって結果の反映速度が左右されやすい。また、UDトークはBlusStacksに代表されるエミュレータ経由では稀に音声認識が確定しないことや、確定しているにもかかわらず母国語字幕を表示しない謎の動きをすることがあった。これはゆかコネ音声認識比較記事を参照のこと。
OpenAIの開発したWhisperをもとに軽量化されたfaster-whisperをベースに、ゆかコネでも使用できるように調整されたYukariWhisperが有志TYAPA氏によって製作され、新たな音声認識経路としてサポートされるようになった。動作要件が機械学習の応用であるから、機械学習に強いPythonが必須でNVIDIA系GPUでなければ使えず、理想は3000番台以上である。ただし最低要件としてfloat16をサポートする1000番台からでも使用可能である。したがって、補助電源不要な1050Tiを併用しそれに処理させれば、理論上メインのGPUの負荷は0で利用できる。低電力で認識精度と安定性を両立したい場合はTuringであるGTX 1650(HEVC不要ならTU117版)も選択肢になる。旧Quadro系はその世代ではどうしても高額になってしまうのでお勧めできない。機械学習専用GPUのTesla系も、個人で使うにはオーバースペックである。
快適動作の前提条件が3000番台である以上、万人に有効な音声認識とは言い切れないのがネックである。だが精度の高さは間違いないもので、工夫次第ではどうにか頑張って動作させることも不可能ではない。さらに時代が進めば最適化も進むはずで、その頃には低負荷で動作することもあり得ることだろう。それまではこの資料が資料の1つとして活躍するはずだ。また、入手出来たら1050Tiを使った場合の実験もしたいところである。
以上、ゆかコネ解説書:YukariWhisperを使って音声認識する、であった。機械学習、AIの正しい使い方の1つ、うまく適用させて使えば道具になる。
KIBEKIN at 00:00 Jan. 28th, 2024
追記情報
2024年1月29日 1050Tiで実験したところ、動作こそするが実用に耐えないレベルで酷かったため、特定文の打ち消しと実験結果を追加。なお、1050Tiは数時間もしないうちに売り払って、現在手元にはない。
スポンサーリンク
脚注
本文へ1 | 公式では使用ライブラリの関係で3.12には対応していない。以前は3.10までだったが、後に3.11系にも対応したので現在は3.11系でも使用可能である。 |
---|