main
OpenAI TTS 比較
VAD など
stable-ts、VAD を使って書き起こし
30秒以上の音声を推論させるには pipeline を使う
ImportError: cannot import name 'BatchedInferencePipeline' from 'faster_whisper'
whisper の高速化
ffmpeg で音声ファイルをたくさん結合する
ffmpeg -safe 0 -f concat -i list.txt -c copy output.mp4
AmiVoice ステレオ(2チャネル)の場合は1チャネルのみが音声認識対象となる。
チャネルごとに異なる音源が録音されている特殊な音源の場合、片方しか音声認識されないことになるので注意。
参考
ffmpeg でステレオ音源をモノラルに変換
sox で2チャネルステレオ音声ファイルをモノラル音声ファイル✕2に変換
CTranslate2 でモデルを量子化する Python スクリプト
import ctranslate2
from ctranslate2.converters import TransformersConverter
model_name_or_path = "primeline/whisper-large-v3-german "
output_dir = "whisper-large-v3-german --copy_files"
converter = TransformersConverter(model_name_or_path)
converter.convert(output_dir, quantization="float16", force=True)
Ctranslate2 で量子化した Whisper-large-v3 の推論 model.transcribe()
時に下記エラー
ValueError: Invalid input features shape: expected an input with shape (1, 128, 3000), but got an input with shape (1, 80, 3000) instead
対処方法
faster-whisper リポジトリの large-v3 モデルにある json ファイルを配置してからモデルをロードしたら通った。
参考
I encoutered the same problem. you should update all the json files in the offical one:
https://huggingface.co/Systran/faster-whisper-large-v3/tree/main
it is different with large v2
ssh で github, huggingface に繋がらない場合、ssh-agent がそもそも起動していない可能性
下記コマンドで ssh を使った接続を試行(オプション v
でログ出力)
ssh -vT git@github.com
ssh -vT git@hf.co
identity file
に作成した秘密鍵が表示されない(読み込まれていない?)
debug1: identity file /Users/[user_name]/.ssh/id_rsa type -1
対応策として ssh-agent
に SSH キーの追加を施行したが、ssh-agent
が起動していない旨のエラー
ssh-add ~/.ssh/id_ed25519
PowerShell で ssh-agent
を起動する方法
Set-Service -Name ssh-agent -StartupType Manual
Start-Service ssh-agent
Style-Bert-VITS2 のユーザー辞書について
ssh -vT git@hf.co
で Permission denied (publickey)
が出るときの原因
id_rsa
以外の名前で鍵を作ったときは、-i
オプションで明示的に秘密鍵を示してあげましょう。
ssh -vT git@hf.co -i C:\Users\taish\.ssh\huggingface-matsuap
huggingface に ssh で git するときは config の user は git じゃないといけないみたい
Host hf.co
HostName hf.co
IdentityFile ~/.ssh/id_hogehoge <=作った秘密鍵
User git
TTS の「いった」「おこなった」問題
「東京都に行った」は、「東京/都/に/行った」と分割でき、この場合は「とうきょうとにいった」と読みますが、「東/京都/に/行った」の場合は「ひがしきょうとにいった」と読みます。これらの両方の場合において、「行った」は「いった」と読みますが、「東京都に行った事業の報告をする」という文脈では、2 番目の意味(「何かを実行したこと」)となり、「いった」ではなく「おこなった」と読みます。
Davinci resolve で一つのタイムラインに他のタイムラインを挿入したときに音がならない場合、挿入元タイムラインのオーディオがステレオとモノラルが混在している。
Fusionノードを別プロジェクトで使い回したいときはメディアインではなくローダーを使う
ローダーのフルパス指定はパスマップで省略できる
huggingface にデプロイした fastapi のエンドポイント
[VSCode] venvで作成した仮想環境がkernel一覧に表示されないときの対処法
Bert-VITS2 に脆弱性が報告されたが、その後修正されている
fish.audio の bert-vits2 には、パストラバーサルの脆弱性が存在します。
https://jvndb.jvn.jp/ja/contents/2024/JVNDB-2024-007791.html
bert-vits2の場合、webui_preprocess.pyファイルの特定の箇所でこの脆弱性が確認されている。攻撃者はこの脆弱性を悪用して、サーバー上で任意のコマンドを実行する可能性がある。これにより、機密情報の漏洩やシステムの制御権限の奪取など、深刻な被害が生じる恐れがある。
https://xexeq.jp/blogs/media/topics8651
修正 PR マージ済み
アジャイル型開発における未完成の責任 東京地判令3.11.25(平30ワ25117)
Style-Bert-VITS2 の事前学習
Style-Bert-VITS2 の学習時に使う事前学習済みモデル
最後にBert-VITS2の公式事前学習モデルがあるので、使うバージョンに応じてダウンロードする。
ver 2.3の場合
ここからG_0.pth D_0.pth DUR_0.pth WD_0.pthの4つをダウンロードする。
https://ayousanz.hatenadiary.jp/?page=1708753287
最後に、Data/model_name/modelsフォルダを作り、そこに先程ダウンロードしたG_0.pth D_0.pth DUR_0.pthの3つ(ver 2.3の場合はWD_0.pthも含めた4つ)をコピーする。
モデル学習のときにこれらのファイルは上書きされてしまうようなので、別のモデルを学習するときのために、これらのファイルは削除せずにどこかに取っておくと良い。
初期化用スクリプトでは別のリポジトリから .safetensors
をダウンロードしているみたい。
def download_pretrained_models():
files = ["G_0.safetensors", "D_0.safetensors", "DUR_0.safetensors"]
local_path = Path("pretrained")
for file in files:
if not Path(local_path).joinpath(file).exists():
logger.info(f"Downloading pretrained {file}")
hf_hub_download(
"litagin/Style-Bert-VITS2-1.0-base", file, local_dir=local_path
)
def download_jp_extra_pretrained_models():
files = ["G_0.safetensors", "D_0.safetensors", "WD_0.safetensors"]
local_path = Path("pretrained_jp_extra")
for file in files:
if not Path(local_path).joinpath(file).exists():
logger.info(f"Downloading JP-Extra pretrained {file}")
hf_hub_download(
"litagin/Style-Bert-VITS2-2.0-base-JP-Extra", file, local_dir=local_path
)
Early Stopping
warmup の効果と数
warmup に費やす step 数ですが、全体の10%程度を指定することが多いです。
Whisper のファインチューニングでは事前学習よりも小さい学習率を設定した方がよいみたい
According to Jong Wook Kim, one of the authors of the Whisper paper, a practical learning rate to consider while fine-tuning is a value that is 40x smaller than what has been used for pre-training, and linearly decay it to zero over the course of training. (Discord thread where this has been mentioned)
lr_scheduler_type
= cosine_with_restarts
は warmup あり
“cosine_with_restarts” = get_cosine_with_hard_restarts_schedule_with_warmup
各 lr_scheduler
勾配蓄積
勾配蓄積メソッドは、GPUのメモリ容量の制約によって課せられる制限を超えた効果的なバッチサイズを実現するために、勾配を小さな増分で計算することを目的としています。このアプローチでは、モデルを順方向および逆方向に小さなバッチで反復的に計算し、その過程で勾配を蓄積します。十分な数の勾配が蓄積されたら、モデルの最適化ステップを実行します。勾配蓄積を使用することで、GPUのメモリ容量による制約を超えて効果的なバッチサイズを増やすことができますが、勾配蓄積によって導入される追加の順方向および逆方向の計算はトレーニングプロセスを遅くする可能性があることに注意が必要です。
WhisperProcessor
をロードするには、抽出機とトークナイザーを個別にロードしてからインスタンス化する
チェックポイントから from transformers import WhisperFeatureExtractor
from transformers import WhisperTokenizer
from transformers import WhisperProcessor
feature_extractor = WhisperFeatureExtractor.from_pretrained(checkpoint_path)
tokenizer = WhisperTokenizer.from_pretrained(model_path, language="Japanese", task="transcribe")
processor = WhisperProcessor(feature_extractor, tokenizer)
cosine_with_restarts
のピークは learning_rate
cosine_with_restarts
の num_cycles
は設定できない仕様
Fair point. But we also don't want to provide too many arguments as our training examples are supposed to be beginner-friendly. So, we keep the examples fairly easily customizable.
lr_scheduler_kwargs
で与えられるみたい
Colab 上で Style-Bert-VITS2
音素バランス文
音声コーパスは JVS
今後,音声を新規収録される場合には声優統計コーパス付属のバランス文ではなく,句読点情報が付与された JSUT コーパスまたは JVS コーパスの voiceactress100 (以降, voiceactress100 と呼びます) の使用を推奨します.
声優統計コーパスのバランス文と voiceactress100 には一部の単語が異なっており,完全な互換性がありません
voiceactress100 は声優統計コーパスバランス文を音声処理の研究者が洗練したものです
声優統計コーパスの一部の読みはバランス文と一致していません.また,アクセントや句読点位置も統一されていません
上記の理由により,今後,音声を新規収録される場合には声優統計コーパス付属のバランス文ではなく voiceactress100 の使用を推奨します
その際のイントネーションはプロ話者によって発話された JVS コーパスに従うことを推奨します
感情表現を活用したい場合,またはプロ話者かつ高サンプリングレートのデータを使用したい場合のみ声優統計コーパスの音声データを用いるのが良いと私たち (日本声優統計学会) は考えます
声優統計コーパス→JSUTコーパス→JVSコーパス→つくよみちゃんコーパスの成り立ちについて
JVS コーパス
収録時間は音源の約 3 倍
気合で読み上げを行った結果、
読み上げ自体にかかった時間: 52分
読み上げた文字数: 3,971文字 (句読点含む)
作成された音声ファイルの合計時間: 967秒 (16.1分)
でした。
上記の結果から、作業全体の時間は録音の3倍くらいの時間が掛かっていることがわかります。これだけ時間がかかった理由として、以下の作業が挙げられます。
自身の発声した録音を確認のために再生する
単純計算で、これだけで発声自体の2倍の時間が掛かります
一人で作業をしているため、ある程度のクオリティを担保するためには、自身が発した音声を聞き直す必要がありました
原稿を読んで発声内容を確認する
少し長いフレーズや読みに難しい単語がある場合、まず頭の中で予行練習をする必要があります
今回のコーパスには外国の地名や人名が含まれていたため、実際に声に出して確認する必要がありました
何らかの理由により再録音する
言いよどみ、読み間違い、発音ミス、イントネーションのミス、無視できないほどのリップノイズなどが起きた場合は、録音し直しました
雑音が入ってしまった場合にも録音し直しました (救急車の音、飼っている犬の足音など)
体感としては、読み間違いや失敗による再録音にかなりの時間を使ってしまったという印象でした。一方で、音声ファイルの管理や原稿の準備にはほとんど時間を使わなかったので、この点は効率化が出来たと思っています。
DWANGO MEDIA VILLAGE - SEIREN VOICE
Gradio の DataFrame がスクロールでどんどん大きくなる問題
Faster-whisper のストリーミング化
この ipynb は Colab 上ではうまく走らなかったので、Windows ローカルで実行した。
検証環境
- Windows11
- Powershell / WSL2 Ubuntu
- ngrok インストール
- https://download.ngrok.com/windows?tab=download
ポイント
-
nc
(netcat) コマンドが Windows 11/Powershell にないので、WSL2 の Ubuntu 上でストリーミング送信を実行した。
sox -d -e signed -b 16 -c 1 -r 16000 -t raw - | nc 0.tcp.jp.ngrok.io 18714
-
whisper_online_server.py
を立ち上げるときに、モデルサイズを指定できる - 例:
python .\whisper_online_server.py --language ja --min-chunk-size 1 --model tiny
- ngrok はクレジットカード登録しないと tcp トンネリング機能が使えない
コーパス
研究開発の場面でよく使われる音素バランス文としては「ATR503文」「声優統計コーパス」「JSUTコーパス」などが代表的だ。
一つ目が使用料の問題だ。ATR503文の読み上げデータ集は国際電気通信基礎技術研究所(ATR)が発売している商品で、価格は読み上げ音声付きのデータで数十万円に上る。
そこで登場したのが無料の声優統計コーパスやJSUTコーパスだ。声優統計コーパスは声優やアナウンサーの読み上げ音声約2時間、JSUTは女性の読み上げ音声を約10時間収録したデータも無償公開。研究開発のハードルになっていた使用料をなくした。
これらの課題を解決するため、SSSは音素バランス文の新規開発を企画。2020年7月にクラウドファンディングで目標額の261%もの資金を集め、明治大学と九州工業大学の協力の下、音素バランス文の開発に乗り出した。
ATR503
ITA コーパス
Deepgram
ROHAN
話者分離 WhoSpeaks
Coqui model v2.0.2
whisper streaming
Unable to load any of {libcudnn_ops.so.9.1.0, libcudnn_ops.so.9.1, libcudnn_ops.so.9, libcudnn_ops.so}
FIXED IT!
under the whisperx_installer environment, running
pip install ctranslate2==4.4.0
fixed it, as per this post m-bain/whisperX#901
Cursor で Google colab GPU リソースを使う