Open50

main

matsumatsu

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)

https://github.com/SYSTRAN/faster-whisper/issues/567

matsumatsu

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 ファイルを配置してからモデルをロードしたら通った。
https://huggingface.co/Systran/faster-whisper-large-v3/tree/main

参考

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

https://github.com/SYSTRAN/faster-whisper/issues/582

matsumatsu

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

https://ormcat.net/blog/20210509_github-denied-publickey/

対応策として ssh-agent に SSH キーの追加を施行したが、ssh-agent が起動していない旨のエラー

ssh-add ~/.ssh/id_ed25519

https://qiita.com/Dixhom/items/fa1d575b3170f00af065

PowerShell で ssh-agent を起動する方法

Set-Service -Name ssh-agent -StartupType Manual
Start-Service ssh-agent

https://qiita.com/yuta0801/items/d65f1fc3115773861283

matsumatsu

TTS の「いった」「おこなった」問題

「東京都に行った」は、「東京/都/に/行った」と分割でき、この場合は「とうきょうとにいった」と読みますが、「東/京都/に/行った」の場合は「ひがしきょうとにいった」と読みます。これらの両方の場合において、「行った」は「いった」と読みますが、「東京都に行った事業の報告をする」という文脈では、2 番目の意味(「何かを実行したこと」)となり、「いった」ではなく「おこなった」と読みます。

https://aws.amazon.com/jp/blogs/news/amazon-polly-japanese-text-optimization/

matsumatsu

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 マージ済み

https://github.com/fishaudio/Bert-VITS2/pull/393/commits/beee4b7816471d142eec3bba96167a3ff88f6581

matsumatsu

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
            )

https://github.com/litagin02/Style-Bert-VITS2/blob/bcc57e0cb9055acc9718c1a74288e943c2916c49/initialize.py#L31

matsumatsu

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)


https://qiita.com/kma-jp/items/81db6d5c549e50707e30#warmup

matsumatsu

勾配蓄積

勾配蓄積メソッドは、GPUのメモリ容量の制約によって課せられる制限を超えた効果的なバッチサイズを実現するために、勾配を小さな増分で計算することを目的としています。このアプローチでは、モデルを順方向および逆方向に小さなバッチで反復的に計算し、その過程で勾配を蓄積します。十分な数の勾配が蓄積されたら、モデルの最適化ステップを実行します。勾配蓄積を使用することで、GPUのメモリ容量による制約を超えて効果的なバッチサイズを増やすことができますが、勾配蓄積によって導入される追加の順方向および逆方向の計算はトレーニングプロセスを遅くする可能性があることに注意が必要です。

https://huggingface.co/docs/transformers/ja/perf_train_gpu_one

matsumatsu

チェックポイントから 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)

https://www.s3lab.co.jp/blog/iaas/amazon/2305/

matsumatsu

音声コーパスは JVS

今後,音声を新規収録される場合には声優統計コーパス付属のバランス文ではなく,句読点情報が付与された JSUT コーパスまたは JVS コーパスの voiceactress100 (以降, voiceactress100 と呼びます) の使用を推奨します.
声優統計コーパスのバランス文と voiceactress100 には一部の単語が異なっており,完全な互換性がありません
voiceactress100 は声優統計コーパスバランス文を音声処理の研究者が洗練したものです
声優統計コーパスの一部の読みはバランス文と一致していません.また,アクセントや句読点位置も統一されていません
上記の理由により,今後,音声を新規収録される場合には声優統計コーパス付属のバランス文ではなく voiceactress100 の使用を推奨します
その際のイントネーションはプロ話者によって発話された JVS コーパスに従うことを推奨します
感情表現を活用したい場合,またはプロ話者かつ高サンプリングレートのデータを使用したい場合のみ声優統計コーパスの音声データを用いるのが良いと私たち (日本声優統計学会) は考えます

https://github.com/voice-statistics/voice-statistics.github.com/blob/master/assets/doc/vs_to_jvs.md

声優統計コーパス→JSUTコーパス→JVSコーパス→つくよみちゃんコーパスの成り立ちについて

https://tyc.rei-yumesaki.net/material/corpus/voiceactress100/

JVS コーパス

https://sites.google.com/site/shinnosuketakamichi/research-topics/jvs_corpus

収録時間は音源の約 3 倍

気合で読み上げを行った結果、
読み上げ自体にかかった時間: 52分
読み上げた文字数: 3,971文字 (句読点含む)
作成された音声ファイルの合計時間: 967秒 (16.1分)
でした。
上記の結果から、作業全体の時間は録音の3倍くらいの時間が掛かっていることがわかります。これだけ時間がかかった理由として、以下の作業が挙げられます。
自身の発声した録音を確認のために再生する
単純計算で、これだけで発声自体の2倍の時間が掛かります
一人で作業をしているため、ある程度のクオリティを担保するためには、自身が発した音声を聞き直す必要がありました
原稿を読んで発声内容を確認する
少し長いフレーズや読みに難しい単語がある場合、まず頭の中で予行練習をする必要があります
今回のコーパスには外国の地名や人名が含まれていたため、実際に声に出して確認する必要がありました
何らかの理由により再録音する
言いよどみ、読み間違い、発音ミス、イントネーションのミス、無視できないほどのリップノイズなどが起きた場合は、録音し直しました
雑音が入ってしまった場合にも録音し直しました (救急車の音、飼っている犬の足音など)
体感としては、読み間違いや失敗による再録音にかなりの時間を使ってしまったという印象でした。一方で、音声ファイルの管理や原稿の準備にはほとんど時間を使わなかったので、この点は効率化が出来たと思っています。

https://zenn.dev/yag_ays/articles/8d2fc207975953

matsumatsu

Faster-whisper のストリーミング化

https://zenn.dev/momosuke/articles/whisper-streaming
この ipynb は Colab 上ではうまく走らなかったので、Windows ローカルで実行した。
https://colab.research.google.com/drive/1MMsCAnK6bc6nCvqLSZPUvRvNLBhHIFP5?usp=sharing

検証環境

ポイント

  • 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 トンネリング機能が使えない


matsumatsu

コーパス

研究開発の場面でよく使われる音素バランス文としては「ATR503文」「声優統計コーパス」「JSUTコーパス」などが代表的だ。

一つ目が使用料の問題だ。ATR503文の読み上げデータ集は国際電気通信基礎技術研究所(ATR)が発売している商品で、価格は読み上げ音声付きのデータで数十万円に上る。

そこで登場したのが無料の声優統計コーパスやJSUTコーパスだ。声優統計コーパスは声優やアナウンサーの読み上げ音声約2時間、JSUTは女性の読み上げ音声を約10時間収録したデータも無償公開。研究開発のハードルになっていた使用料をなくした。

これらの課題を解決するため、SSSは音素バランス文の新規開発を企画。2020年7月にクラウドファンディングで目標額の261%もの資金を集め、明治大学と九州工業大学の協力の下、音素バランス文の開発に乗り出した。

https://www.itmedia.co.jp/news/articles/2106/18/news099.html

ATR503

https://research.nii.ac.jp/src/ATR503.html

ITA コーパス

https://github.com/mmorise/ita-corpus

Deepgram

https://deepgram.com/
https://zenn.dev/smartcamp/articles/8b24739ab8cba3

ROHAN

https://github.com/mmorise/rohan4600

matsumatsu

VSCode から Runpod に SSH 接続

ssh-keygen して公開鍵を Runpod に登録してから、デプロイしないとつながらないみたい。
https://blog.runpod.io/how-to-connect-vscode-to-runpod/
https://www.youtube.com/watch?v=vEVDoW-uMHI&ab_channel=にゃんたのAI実践チャンネル

jupyter カーネルが選べない

解決方法

  • エクステンションで Python と Jupyter をリモートサーバーにインストールする

jupyter notebook --no-browser --port=8080 & でエラー

エラー

ModuleNotFoundError: No module named 'jupyter_server.contents'

対処

pip uninstall traitlets
pip install traitlets==5.9.0

https://github.com/microsoft/azuredatastudio/issues/24436

matsumatsu

dataset の concatenate

from datasets import load_from_disk

target_dataset_names = [
    '0to499',
    '500to999',
    '1000to1499',
    '1500to1999',
]

loaded_datasets = []
for target_dataset_name in target_dataset_names:
    preprocessed_dataset_path = dataset_dir / 'preprocessed' / base_model.split('/')[-1] / target_dataset_name
    loaded_datasets.append(load_from_disk(preprocessed_dataset_path, keep_in_memory=True))

from datasets import DatasetDict
from datasets import concatenate_datasets

finetune_dataset = DatasetDict({
    'train': concatenate_datasets([i['train'] for i in loaded_datasets]),
    'validation': concatenate_datasets([i['validation'] for i in loaded_datasets]),
    'test': concatenate_datasets([i['test'] for i in loaded_datasets]),
})

https://discuss.huggingface.co/t/how-to-merge-two-dataset-objects/844/6