mcpField
P
piper-tts-training

piper-tts-training

github.com/sammcjクリエイティブ・メディア16764 回インストール1 日前に更新
リポジトリ

piper-tts-training について

Piperの軽量なONNXランタイム向けに、カスタム音声を学習するスキルです。データセット準備、音声検証、学習、エクスポートに加え、オーストラリア、ニュージーランド、英国英語のローカライズ手順も扱います。

主な機能

  1. 01音素範囲を網羅する学習コーパスの準備
  2. 0222050Hzモノラル音声の生成または録音
  3. 03Whisperによるサンプル検証
  4. 04ファインチューニングまたはゼロからの学習
  5. 05モデルのONNXエクスポート
  6. 06地域別英語音声のローカライズ

活用シーン

  1. 01Piper向けカスタムTTS音声の作成
  2. 02学習音声と想定テキストの照合
  3. 03豪州・NZ・英国英語音声の学習
  4. 04学習済みモデルのデプロイ用エクスポート

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sammcj/agentic-coding --skill piper-tts-training

インストール後、Claude Code で/piper-tts-trainingを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
american_spellings.json
localisation.md
scripts/
convert_spelling.py

詳細

Piper TTS の音声トレーニング

Piper の軽量な ONNX ランタイムと互換性のある、カスタムのテキスト読み上げ音声をトレーニングします。

概要

Piper は、組み込みデバイスに適した高速なオフライン TTS を提供します。トレーニングには次の手順が含まれます。

  1. コーパスの準備(音声学的な範囲を網羅するテキスト)
  2. 音声の生成または録音
  3. Whisper の文字起こしによる品質検証
  4. 既存のチェックポイントからのファインチューニング(推奨)、またはスクラッチからのトレーニング
  5. デプロイ用の ONNX エクスポート

ファインチューニングとスクラッチからのトレーニングの比較:

  • ファインチューニング:約1,300のフレーズと1,000エポック(控えめな GPU で数日)
  • スクラッチからのトレーニング:約13,000以上のフレーズと2,000以上のエポック(数週間から数か月)

ワークフロー

1. コーパスの準備

幅広い音声学的な範囲を網羅する1,300~1,500以上のフレーズを集めます。

  • piper-recording-studio のコーパスをベースとして使用します
  • 用途に合わせて、ドメイン固有のフレーズを追加します
  • 多様な文構造と長さを含めます

米国英語以外で重要な点: コーパスで正しい地域別のスペリングが使われていることを確認してください。ローカライズを参照してください。

2. 音声の生成

トレーニング音声を、22050Hz のモノラル WAV として生成または録音します。

音声クローニングを使用する場合(例:Chatterbox TTS):

  • ソースのサンプルレート(多くの場合24kHz)で生成します
  • 22050Hz に変換します:sox -v 0.95 input.wav -r 22050 -t wav output.wav
  • -v 0.95 はリサンプリング中のクリッピングを防ぎます

録音要件:

  • マイクの位置と室内の音響環境を一定に保ちます
  • 背景ノイズを最小限に抑えます
  • 自然な話すペースにします(朗読調にしないでください)
3. Whisper による品質検証

手動で聞くのではなく、品質チェックを自動化します。

import whisper
from piper_phonemize import phonemize_text

model = whisper.load_model("base")

def validate_sample(audio_path, expected_text):
    result = model.transcribe(audio_path)
    transcribed = result["text"].strip()

    # Compare phonemically to handle spelling/punctuation differences
    expected_phonemes = phonemize_text(expected_text, "en-gb")
    transcribed_phonemes = phonemize_text(transcribed, "en-gb")

    return expected_phonemes == transcribed_phonemes

失敗したサンプルは最大3回まで再試行します。データセットのカバー率95%以上を目指します。

4. データセット形式(LJSpeech)

データセットを次の構成にします。

dataset/
├── metadata.csv
└── wavs/
    ├── sample_0001.wav
    ├── sample_0002.wav
    └── ...

metadata.csv の形式: {id}|{text}(パイプ区切り、ヘッダーなし)

sample_0001|The quick brown fox jumps over the lazy dog.
sample_0002|Pack my box with five dozen liquor jugs.
5. 前処理

PyTorch テンソルに変換します。

python3 -m piper_train.preprocess \
    --language en-gb \
    --input-dir dataset/ \
    --output-dir piper_training_dir/ \
    --dataset-format ljspeech

オーストラリア、ニュージーランド、英国の音声には、en-gb(espeak-ng 音素セット)を使用します。

6. トレーニング

ファインチューニング(推奨):

python3 -m piper_train \
    --dataset-dir piper_training_dir/ \
    --accelerator gpu \
    --devices 1 \
    --batch-size 12 \
    --max_epochs 3000 \
    --resume_from_checkpoint ljspeech-2000.ckpt \
    --checkpoint-epochs 100 \
    --quality high \
    --precision 32

主なパラメーター:

  • --batch-size:VRAM が限られている場合は減らします(8GB では12が動作します)
  • --resume_from_checkpoint:LJSpeech の高品質チェックポイントから開始します
  • --precision 32:混合精度よりも安定します
  • --validation-split 0.0 --num-test-examples 0:小規模なデータセットでは検証を省略します

TensorBoard で監視し、収束の指標として loss_disc_all を確認します。

7. ONNX エクスポート
python3 -m piper_train.export_onnx checkpoint.ckpt output.onnx.unoptimized
onnxsim output.onnx.unoptimized output.onnx

トレーニング時の config.json から、メタデータファイル output.onnx.json を作成します。

オーストラリア、ニュージーランド、英国英語のローカライズ

Piper は音素変換に espeak-ng を使用します。トレーニングデータにアメリカ英語の発音が含まれていると、アクセントがずれる原因になります。

コーパスの準備:

  • トレーニング前に、コーパスのテキストに対して scripts/convert_spelling.py を実行します
  • 音素変換には en-gb または en-au の espeak-ng 音声を使用します
  • 生成された音素にアメリカ英語特有の語形がないか確認します

一般的なスペリング変換:

アメリカ英語オーストラリア英語/英国英語
-ize-ise
-or-our
-er-re
-og-ogue
-ense-ence

音素に関する考慮事項:

  • /r/ の連結や挿入のパターンが異なります
  • "dance"、"bath"、"castle" などの語の母音
  • 語末の -ile の発音(hostile、missile)

単語の完全なリストと音声学的な詳細については、references/localisation.mdを参照してください。

検証: Whisper で language="en" を使用し、文字起こしが想定される地域別の語形と一致することを確認します。

依存関係

API の破壊的変更を避けるため、バージョンを固定します。

pytorch-lightning==1.9.3
torch<2.6.0
piper-phonemize
onnxruntime-gpu
onnxsim

再現性を確保するため、Docker によるコンテナ化を推奨します。

ハードウェア要件

最小要件(ファインチューニング):

  • 8GB VRAM の GPU(Pascal 以降)
  • 8GB のシステム RAM
  • Tesla P4 で1,000エポックを実行する場合、約5日

スクラッチからのトレーニング: 所要時間は約200倍になります。

トラブルシューティング

問題解決策
CUDA の OOMバッチサイズを減らします(8または4を試します)
チェックポイントを読み込めないpytorch-lightning のバージョンがチェックポイントと一致しているか確認します
出力が文字化けするトレーニングのエポック数が足りないか、データセットが小さすぎます
アクセントが異なるespeak-ng の言語コードとコーパスのスペリングを確認します

コメント