Style-Bert-VITS2の学習でAI感が消えた話
かつ
2026/08/26
この記事で分かること
- 日本語の音声AIで感じる「AIが喋っている感」の正体(数値で見えました)
- Style-Bert-VITS2 が、なぜそれを解決できたのか(仕組みの違い)
- 学習に必要だったデータ量・時間・PCの条件(実測)
- 導入で踏んだ罠12個と、その直し方
- AGPL ライセンスの注意(Webサービスに組み込むと影響します)
結論を先に書きます
日本語の作品を作るなら Style-Bert-VITS2(以下 SBV2)です。 完全無料、オープンソース、自分のPCで動きます。
そして 一番効いたのは「演技を付けなくてよくなった」ことでした。 前に使っていた Qwen3-TTS は演技の指示を書かないと棒読みでしたが、SBV2 は 何も指定しなくても演技として成立します。 全セリフに指示を書く作業がまるごと消えました。
ただし SBV2 は「既にある声を学習する」ことしかできません。新しい声は作れません。 声を作るのは前の記事の Qwen3-TTS の役目です。両方要ります。
もう一つ、ライセンスは AGPL v3 です。 ローカルで動画を作るぶんには問題ありませんが、Webサービスに組み込むとソース公開の義務が発生します。 ここは先に確認してください。
何に困っていたか:日本語の「AI感」の正体
ずっとこう感じていました。
シーンごとにセリフが変わるたびに、自然な日本語と、AIが喋っている感がわかる変な話し方が混ざっている。これを無くしたい
「全部が変」ではありません。自然に読める文と、急に不自然になる文が混ざるのです。原因が分からないので直しようもありませんでした。
正体は、日本語のピッチアクセントの誤りでした
「橋」と「箸」を分ける、あの高低のことです。ここが1語でも狂うと、文全体が急に不自然に聞こえます。
数値で見えた例を出します。作中で何度も出てくる4拍の言葉(音素にすると6音)の高低を測りました。作品が未公開なので、言葉そのものは伏せます。
| その言葉が出てくる文 | 4拍の高低 |
|---|---|
| 肯定して言い切る文 | 低 高 高 高 |
| 問いかける文 | 高 低 低 低 |
同じ言葉なのに正反対です。
これが「途中で急に上がる」と感じていたものの正体でした。そして 指示では直りません。 生成のたびに変わるからです。言葉の高低を決める仕組みそのものが無いのだから、指示で押さえられるはずがありませんでした。
Style-Bert-VITS2 とは何か
日本の個人開発者 litagin 氏が公開している音声合成の仕組みです。
| 最初の公開 | 2023年12月27日(v1.0) |
| 取材時点の最新 | 2025年8月24日(v2.7.0) |
| もとになったもの | 中国発の Bert-VITS2。これに日本語のアクセント処理とスタイル指定を足したもの |
| 費用 | 完全無料・オープンソース・ローカルで動く |
| ライセンス | AGPL v3(一部 LGPL v3) |
ライセンスの注意(ここは重要です)
- 動画制作にローカルで使うぶんには問題ありません。 生成した音声そのものに AGPL は及びません
- ただし Web サービスに組み込むと、そのサービスのソース公開義務が発生します。 SaaS として提供する用途には向きません
- 付属の音声モデル(あみたろ・JVNV など)には モデルごとの個別の規約 があります。クレジット表記が必須のもの、年齢制限作品への使用が禁止されているものがあります。使うなら必ず読んでください
- 開発者からの「お願い」として、なりすましやディープフェイク目的の利用は避けてほしいとされています
このシリーズの前の記事で、SBV2 系の配布モデルを試して「滑舌が悪い」と不採用にしました。今回書くのはそれとは別の話です。配布されているモデルから選ぶのではなく、自分の声を自分で学習させました。 同じ仕組みでも、そこが違います。
なぜ解決したのか:仕組みが違いました
前に使っていた Qwen3-TTS と並べます。
| Qwen3-TTS | Style-Bert-VITS2 | |
|---|---|---|
| 得意なこと | どんな声でも数秒で真似る | 日本語を正しく読む |
| 声の作り方 | 手本を数秒渡すだけ | その声で数時間の学習が必要 |
| 日本語のアクセント | 扱っていない | 読む前に音素とアクセントを決める |
| 演技の指示 | 日本語の文章で書ける | 数値(スタイル・強さ)が中心 |
| ライセンス | Apache 2.0 | AGPL v3 |
SBV2 は、日本語 BERT と pyopenjtalk を使って、読ませる前に音素とアクセントを確定させます。
これが、□□□□なんだ → k o r e g a pau □ □ □ □ □ □ n a N d a
(□の部分が、上で伏せた4拍の言葉です)
しかも given_tone で高低を一音ずつ数値で指定できます。 つまり、生成のたびに揺れていたものを、こちらで固定できるということです。同じ言葉が文によって裏返る、ということが二度と起きません。
Qwen は「どんな声でも真似られるが、日本語の読み方は知らない」。SBV2 は「日本語の読み方を知っているが、声は学習しないと作れない」。得意が完全に裏返しでした。
学習データはどう作ったか
ここがこの記事ならではの話だと思います。
Qwen で作った音声を、そのまま SBV2 の学習データにしました。
① 人が声を設計する(手本を作る)
↓
② Qwen がその声で全セリフを読む
↓
③ その音声を SBV2 に学習させる
↓
④ SBV2 が同じ声で、日本語を正しく読む
声は同じまま、日本語の読み方だけが上手くなります。
すでに Qwen で全話ぶんの音声を作っていたので、学習データを新しく用意する必要がありませんでした。作りかけの作品がそのまま学習素材になったわけです。
注意:仕上げの加工をかけた音声を学習させてはいけません
一つ失敗しました。
一部の役の音声には、残響と、高音を落とすまるめの処理をかけていました。それをそのまま学習させると、残響ごと「その人の声」として覚えてしまいます。 あとから外せません。
仕上げの加工を外した音声を作り直してから、学習させました。 学習に渡すのは、必ず加工前の素の音声にしてください。
学習に何が必要だったか(実測)
| 役 | データ | 学習 |
|---|---|---|
| 主人公 | 82本・5.3分 | 3000ステップ |
| 語り手 | 62本・4.7分 | 3000ステップ |
| 相手役 | 49本・3.4分 | 3000ステップ |
5分程度の音声で声になりました。 主人公役については「その声には聞こえる」と判断できる水準でした。何時間ぶんも要るのだろうと身構えていたので、ここは拍子抜けするほど少なくて済みました。
PC の条件
- 学習には NVIDIA の GPU が必須です(生成だけなら CPU でもできます)
- VRAM 4GB でも
batch_size 1なら通りました - 1000ステップにおよそ1時間半(RTX 3050 Ti Laptop・VRAM 4GB)
3000ステップ必要です。1000では足りません
これは2つの声で同じ判定になりました。途中経過を聞き比べた印象はこうです。
806(ステップ)でも十分聞き取れるが、2000の方が言葉に感情がのっていたり、音の高低がわかりやすい
1000ステップでも「聞き取れる」ところまでは行きます。 そこで止めたくなりますが、感情と高低は、そこから先で乗ってきます。 一晩回せば届くので、削らないほうがいいです。
保管するのは、声1つあたり290MB
学習が終わると、声1つで 約2.7GB になります。ただし 永久に守るべきは約290MB だけです。
| 中身 | 容量 |
|---|---|
| モデル本体 | 240MB |
| 学習の元になった音声 | 50MB |
| 守るべき合計 | 約290MB |
| 残り(途中経過など) | 学習を続けないなら消せる |
このモデルは必ず保管してください。 学習は毎回わずかに違う結果になります。消すと「前と同じ声」は二度と出せません。 同じデータで学習し直しても、同じにはなりません。
踏んだ罠12個
ここが記事の核です。導入でかなりの時間を溶かしたので、全部書いておきます。Windows 環境です。
| # | 罠 | 症状 | 直し方 |
|---|---|---|---|
| 1 | 日本語のパス | Failed to initalize Mecab |
英数字だけのパスに置く |
| 2 | av の依存衝突 |
CompileError: av\logging.pyx |
faster-whisper stable_ts を requirements から外す(文字起こし用で、学習には不要) |
| 3 | pkg_resources が無い |
ModuleNotFoundError |
pip install "setuptools<81" |
| 4 | transformers が新しすぎる |
AutoModelForMaskedLM requires PyTorch |
transformers==4.44.2 tokenizers<0.20 |
| 5 | pyannote.audio が torch を CPU 版に差し替える |
入れた後に CUDA False |
pyannote の後にCUDA版 torch を --force-reinstall |
| 6 | pyopenjtalk のワーカーが起動しない | ConnectionRefusedError |
initialize_worker() を呼ばない(無くても動く) |
| 7 | numpy の版違い | numpy.dtype size changed |
numpy<2 に固定 |
| 8 | 文字コード | UnicodeDecodeError: cp932 |
subprocess に errors="replace" |
| 9 | ユーザー辞書のロック | PermissionError: WinError 5 |
update_dict() を呼ばない(中身は空) |
| 10 | pyannote が新しすぎる |
torchcodec is not available |
pyannote.audio==3.1.1 |
| 11 | CUDA の無い Python で起動していた | 7時間で200ステップしか進まない | venv の python を絶対パスで指定する |
| 12 | config.yml の model_name |
別の声のモデルが、違う名前で保存された | 声を切り替えるたびに config.yml の model_name と dataset_path を手で直す |
罠11:7時間で200ステップしか進まない
CUDA が入っていない Python で学習を起動していました。 エラーは出ません。ただ異常に遅いだけです。
見分け方は単純です。学習を止めて、GPU の使用率が落ちなければ、GPU を使っていません。 動いているように見えるので、気づくまで丸ごと無駄にしました。
罠12が一番危ないです
--config で設定ファイルを指定しても、書き出し先は config.yml の model_name で決まります。
つまり、語り手を学習していたのに、相手役の名前で保存されていました。
エラーは出ません。学習は正常に終わります。気づかなければ、本編に別人の声が入っていました。 声を切り替えるたびに config.yml を手で直してください。
もう一つの落とし穴:line_split
m.infer() は既定で line_split=True になっています。このとき、せっかく指定したアクセント(given_tone)が無視されます。
line_split=False を必ず付けてください。
これに気づかず「指定しても何も変わらない」と3回作り直しました。 SBV2 の一番の売りである機能が、既定の設定で黙って無効になっているという、一番ややこしい種類の罠でした。
演技はどう付けるか
結論から書きます。素のままで十分な演技になっています。
Qwen は演技の指示を書かないと棒読みでした。SBV2 は 何も指定しなくても演技として成立します。 感情の起伏があるセリフでも、判断は「なにもしないで十分」でした。
一応、効く手・効かない手を並べておきます。
| 手 | 効くか | 使い方 |
|---|---|---|
| 何も指定しない | — | これが基本 |
assist_text(演技を日本語の文章で渡す) |
○ ただし重み 2.0 から | 弱(0.7)・標準(1.0)では差が出ません |
length(速さ) |
○ | 1.25 で 2.61秒 → 3.16秒 |
noise / noise_w(ゆらぎ) |
○ | 抑揚の振れ幅が変わります |
| スタイル(学習データを分類して登録) | ✕ 効きませんでした | 数値上は分かれていた(似ている度 0.73)のに、音に出ませんでした |
スタイル指定は期待していたのですが、試した範囲では音に反映されませんでした。分類自体は数値上できているので、使い方が悪いのかもしれません。ただ そもそも素で十分だったので、追わないことにしました。
作業量が大きく減りました。 全セリフに演技を書く必要がなくなり、直すのは「聞いて気になったところだけ」になりました。
これから使う人へ
- 英数字だけのパスに置いてください。 日本語のフォルダ名だと
Failed to initalize Mecabで最初から動きません。これが罠1です line_split=Falseを必ず付けてください。 既定のままだとアクセント指定が黙って無視されます。「指定が効かない」と悩む前にここを見てください- 声を切り替えるたびに
config.ymlのmodel_nameを直してください。--configを指定しても書き出し先は変わりません。別人の声が別名で保存されても、エラーは出ません - 学習は3000ステップまで回してください。 1000でも聞き取れますが、感情と高低はそこから先で乗ります。一晩回せば足ります
- モデルは必ず保管してください。 学習は毎回わずかに違う結果になります。消すと同じ声は二度と作れません。守るのは声1つあたり約290MB(モデル240MB+元音声50MB)だけです
まとめ
日本語の作品を作るなら SBV2 です。 「AIが喋っている感」の正体は日本語のピッチアクセントの誤りで、SBV2 は読ませる前に音素とアクセントを確定させるので、そこが起きません。しかも given_tone で一音ずつ指定できます。
そして演技は素のままで十分でした。 全セリフに指示を書く工程がまるごと消えたのが、実務上は一番大きい変化です。
注意点は3つです。
- 声を作れるのは Qwen のほうです。 SBV2 は既にある声を学習するだけなので、両方要ります
- AGPL v3 なので、Web サービスに組み込む用途には向きません。 ローカルでの動画制作なら問題ありません
- 学習は作品づくりで数回しか起きません。 VRAM 4GB のノートPCでも一晩ずつ回せば足りました。このために高いPCを買う必要はありません
シリーズ全体の比較はこちらの記事にまとめています。有料サービスから無料のローカル構成へ移った経緯は、Qwen3-TTS の記事に書きました。
この検証は、現在制作中の長編AIアニメーションの制作過程で行っています。作品の公開が始まったら、この記事からもお知らせします。
公式リポジトリ
GitHub - litagin02/Style-Bert-VITS2: Style-Bert-VITS2: Bert-VITS2 with more cont...Style-Bert-VITS2: Bert-VITS2 with more controllable voice styles. - litagin02/Style-Bert-V...関連記事
この記事をシェア