0x3
/

Text-to-Speech
tts
vits
multilingual
piper
File size: 8,886 Bytes
6a35a17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
---
license: cc-by-4.0
language:
- ja
- en
- zh
- es
- fr
- pt
pipeline_tag: text-to-speech
tags:
- tts
- vits
- multilingual
- piper
- text-to-speech
---

# Piper Plus Base Model (Multilingual 6-Language) — MB-iSTFT-VITS2

6言語対応 TTS の事前学習済みベースモデルです。ファインチューニング用のチェックポイントとして提供しています。Decoder は **MB-iSTFT (Multi-Band inverse STFT) + PQMF** に統一済みで、HiFi-GAN ベースの旧モデルから置き換えられています。prosody_features (A1/A2/A3) に対応しています。

> ⚠️ **Breaking change (2026-05)**: このモデルは MB-iSTFT-VITS2 アーキテクチャで再学習された新世代版です。**旧 HiFi-GAN ベースの ckpt から `--resume_from_checkpoint` で本モデルにつなぐことは出来ません**。逆に本モデルを base にした FT は piper-plus PR #320 以降の最新コードでのみ動作します。詳しくは [piper-plus PR #320](https://github.com/ayutaz/piper-plus/pull/320) / [Issue #268](https://github.com/ayutaz/piper-plus/issues/268)。

## Model Details

| 項目 | 値 |
|------|-----|
| アーキテクチャ | VITS (Decoder: **MB-iSTFT + PQMF**) |
| 言語 | 日本語 (ja), 英語 (en), 中国語 (zh), スペイン語 (es), フランス語 (fr), ポルトガル語 (pt) |
| サンプルレート | 22050 Hz |
| 品質 | medium |
| 音素タイプ | multilingual |
| 話者数 | 0 (ファインチューニング用: 元モデルは571話者から学習) |
| 言語数 | 6 |
| **prosody_dim** | **16** |
| 音素数 | 173 |
| Decoder upsample | `(4, 4) × iSTFT(4) × PQMF(4) = 256x` |
| 学習 epoch | 75 (スクラッチ学習) |

## Features

### MB-iSTFT-VITS2 Decoder

VITS の Decoder を Multi-Band iSTFT + PQMF に置き換えたバージョン。HiFi-GAN Generator を完全に廃止し、トータルの upsample 倍率 256x を維持しつつ Decoder の計算コストを大幅削減。

| メトリック | 旧 HiFi-GAN | **MB-iSTFT (本モデル)** | 改善 |
|-----------|-----------|----------------------|------|
| CPU ONNX p50 (100 phoneme) | 168.2 ms | **76.2 ms** | **2.21x** |
| Decoder 単体 | — | — | **~3.6x** (論文値と同等) |
| 出力形状 | `[B, 1, T]` | `[B, 1, T]` | 変化なし (ランタイム互換) |

C++/Rust/C#/Go/WASM ランタイム側は **修正不要** で本モデルを使用できます (出力形状互換のため)。

### 6言語対応

`MultilingualPhonemizer` により、文内コードスイッチング(言語混合テキスト)に対応:

| 言語 | コード | language_id | Phonemizer |
|------|--------|-------------|------------|
| 日本語 | ja | 0 | JapanesePhonemizer (pyopenjtalk) |
| 英語 | en | 1 | EnglishPhonemizer (g2p-en) |
| 中国語 | zh | 2 | ChinesePhonemizer (pypinyin) |
| スペイン語 | es | 3 | SpanishPhonemizer (規則ベース) |
| フランス語 | fr | 4 | FrenchPhonemizer (規則ベース) |
| ポルトガル語 | pt | 5 | PortuguesePhonemizer (規則ベース) |

### Prosody Features (A1/A2/A3)

OpenJTalk から抽出されるプロソディ特徴量をサポート:

| フィールド | 意味 | 値の例 |
|----------|------|--------|
| A1 | アクセント核からの相対位置 | -4, -3, ..., 0, 1, ... |
| A2 | アクセント句内のモーラ位置 | 1, 2, 3, ... |
| A3 | アクセント句内の総モーラ数 | 1-10+ |

### 拡張音素

- 疑問詞マーカー: `?!`, `?.`, `?~`
- 文脈依存「ん」バリアント: `N_m`, `N_n`, `N_ng`, `N_uvular`

## Usage

### シングル話者ファインチューニング (推奨)

```bash
# Step 1: データセット前処理
uv run python -m piper_train.preprocess \
  --input-dir /path/to/your-ljspeech-data \
  --output-dir /path/to/dataset \
  --language ja \
  --dataset-format ljspeech \
  --sample-rate 22050 \
  --single-speaker \
  --phoneme-type multilingual

# Step 2: Prosody Features 追加 (日本語の場合、推奨)
uv run python add_prosody_features.py \
  --input-dataset /path/to/dataset/dataset.jsonl \
  --output-dir /path/to/dataset-prosody \
  --workers 4

# Step 3: ファインチューニング
uv run python -m piper_train \
  --dataset-dir /path/to/dataset-prosody \
  --prosody-dim 16 \
  --accelerator gpu \
  --devices 1 \
  --precision 32-true \
  --max_epochs 500 \
  --batch-size 4 \
  --samples-per-speaker 4 \
  --checkpoint-epochs 50 \
  --base_lr 2e-5 \
  --disable_auto_lr_scaling \
  --ema-decay 0.9995 \
  --max-phoneme-ids 400 \
  --no-wavlm \
  --resume-from-multispeaker-checkpoint /path/to/model.ckpt \
  --default_root_dir /path/to/output
```

`--resume-from-multispeaker-checkpoint` は以下を自動的に行います:
- `emb_g` (話者埋め込み) の処理
- `emb_lang` への conditioning 分布補正
- `--freeze-dp` の自動有効化 (Duration Predictor の catastrophic forgetting 防止)

### マルチ話者ファインチューニング

```bash
uv run python -m piper_train \
  --dataset-dir /path/to/multi-speaker-dataset \
  --prosody-dim 16 \
  --accelerator gpu \
  --devices 4 \
  --precision 32-true \
  --max_epochs 150 \
  --batch-size 20 \
  --samples-per-speaker 2 \
  --base_lr 2e-4 \
  --disable_auto_lr_scaling \
  --ema-decay 0.9995 \
  --max-phoneme-ids 400 \
  --no-wavlm \
  --resume_from_checkpoint /path/to/model.ckpt \
  --default_root_dir /path/to/output
```

### ONNX Export

MB-iSTFT モデルでもエクスポート手順は変わりません (Decoder は ONNX 互換 iSTFT 経由で展開):

```bash
CUDA_VISIBLE_DEVICES="" uv run python -m piper_train.export_onnx \
  /path/to/checkpoint.ckpt \
  /path/to/output.onnx
```

FP16 変換がデフォルト (モデルサイズ ~50% 削減)。FP32 が必要な場合は `--no-fp16` を指定。

### 推論

```bash
CUDA_VISIBLE_DEVICES="" uv run python -m piper_train.infer_onnx \
  --model /path/to/output.onnx \
  --config /path/to/config.json \
  --output-dir /path/to/output \
  --text "こんにちは、今日は良い天気ですね。" \
  --language ja-en-zh-es-fr-pt \
  --speaker-id 0 --noise-scale 0.667
```

## Recommended Parameters

### シングル話者ファインチューニング

| パラメータ | 値 | 説明 |
|----------|-----|------|
| `--base_lr` | 2e-5 | 事前学習の 1/10 (過学習防止) |
| `--max_epochs` | 500 | 小規模データ (100 発話) の場合 |
| `--batch-size` | 4 | 小規模データセット向け |
| `--freeze-dp` | 自動 | `--resume-from-multispeaker-checkpoint` 使用時 |
| `--precision` | 32-true | V100 GPU 推奨 (FP16 は backward 遅延あり) |
| `--no-wavlm` | - | ファインチューニング時は不要 |

### emb_lang 後処理 (シングル話者 FT 後)

シングル話者ファインチューニング後、ONNX エクスポート前に `emb_lang[0]` を他の全言語スロットにコピーすることを推奨します (export_onnx が自動実行):

```bash
CUDA_VISIBLE_DEVICES="" uv run python -m piper_train.export_onnx \
  --unify-emb-lang \
  /path/to/checkpoint.ckpt \
  /path/to/output.onnx
```

`--unify-emb-lang` は `num_speakers <= 1 and num_languages > 1` で自動有効化されるので通常は明示不要です。

## Origin

このベースモデルは以下のデータから学習されました:

| 言語 | 話者数 | 発話数 | ソース |
|------|--------|--------|--------|
| ja | 20 | 60,148 | MOE-Speech |
| en | 310 | 74,912 | LibriTTS-R |
| zh | 142 | 63,223 | AISHELL-3 (Apache-2.0) |
| es | 63 | 168,374 | CML-TTS Spanish (CC-BY-4.0) |
| fr | 28 | 107,464 | CML-TTS French (CC-BY-4.0) |
| pt | 8 | 34,066 | CML-TTS Portuguese (CC-BY-4.0) |
| **合計** | **571** | **508,187** | |

- **アーキテクチャ**: MB-iSTFT-VITS2 (Decoder: Multi-Band inverse STFT + PQMF, upsample (4,4) × 4 × 4 = 256x)
- **学習設定**: 75 epoch, batch-size 20, 4 GPU (V100 16GB), prosody_dim=16
- **gradient steps**: ~282K
- **学習形態**: スクラッチ学習 (HiFi-GAN ベースからの転移ではない)
- `emb_g` (話者埋め込み) は除去済み、optimizer states は除去済み

## Files

- `model.ckpt` - PyTorch Lightning チェックポイント (EMA state 含む、`emb_g` / optimizer 除去済み)
- `config.json` - モデル設定 (173 音素マップ、6 言語、prosody 設定、`num_speakers=0`)
- `voice/mei_normal.htsvoice` - OpenJTalk 日本語音素化用 voice ファイル

## Citation

```bibtex
@software{piper_plus,
  title = {Piper Plus: Multilingual TTS with VITS, Prosody Features, MB-iSTFT Decoder},
  author = {ayousanz},
  year = {2024},
  url = {https://github.com/ayutaz/piper-plus}
}
```

## References

- MB-iSTFT-VITS: [Kawamura et al., 2023](https://arxiv.org/abs/2210.15975)
- VITS: [Kim et al., 2021](https://arxiv.org/abs/2106.06103)
- piper-plus PR #320 (本モデルのリリース): [GitHub](https://github.com/ayutaz/piper-plus/pull/320)