🎉

【叫べるAI音声】Style-Bert-VITS2で感情表現AIを育てる奮闘記──コーパス構築・録音編集・独自フローの裏側

に公開

はじめに

私は AIVtuber「零音ほのか」を運営しており、
彼女の音声合成や配信ツール、AIモデル連携まで、すべてを ゼロから開発しています。

ほのかは、

  • 甘くて寄り添う声質
  • 自然で感情が乗るAI音声
  • AIでは珍しい“叫び”まで表現できる音声モデル

を特徴としたAI Vtuberです。

https://www.youtube.com/@reinehonoka

この記事では、
“ほのかの叫び声”、そして“感情表現AI”を実現するために、
私が個人開発として行ってきた奮闘の裏側をまとめました。

技術の網羅解説というよりは、
**「こうやって私は感情AIを育てた」**という一つの実例として読んでいただければと思います。

補足: 今回は「学習フロー」と「叫び声」を中心に書いており、悲しみ感情については割愛しています。
また、Style-Bert-VITS2 は AGPL v3.0 のため、改変したソースコードは掲載していません。


零音ほのかとは(サンプル音声)

零音ほのかの紹介と音声は以下の note 記事に載せています。

https://note.com/reinehonoka/n/n60d0c54778ad


PC環境と使用したバージョン

本記事で使用したPC環境と、Style-Bert-VITS2のバージョンは以下の通りです。

PC環境

  • OS: Windows 11 Home
  • CPU: Intel Core i5-14400F
  • GPU: RTX 4060 Ti (16GB)
  • メモリ: 128GB
  • 推論速度: リアルタイム可能

使用したStyle-Bert-VITS2バージョン

  • v2.5.0-JP-Extra

JP-Extraの主な特徴

  • 日本語特化(アクセント・イントネーションが自然)
  • 感情表現の強化
  • 高速推論で VTuber 運用にも適応

参考資料・参考リンク

最終更新日: 2025/11/30


1. コーパス構築

なぜ独自コーパスが必要だったか

既存の ITAコーパスなどは、**「自然な読み上げ」**には最適ですが、
キャラクターの感情まで踏み込んだデータではありません。

ほのかの “AIとしての個性” を作るためには、
独自コーパスの構築が必須でした。

本プロジェクトのコーパス

「零音ほのか」というキャラクタリティを音声に乗せるための 独自のコーパスから構築しました。

コーパス構築の例

台本:

  • テキスト: 「零音ほのかという名前はね、ゼロから音という命を紡いで生まれたかすかな光って意味なんだよ。」

指示:

  • 読み方: 自身の名前に込められた思いを大事に語るように
  • シチュエーション: 自分の名前の由来を説明するシーン

このように、台本 × 読み方イメージ × シチュエーションで、
単なるテキスト読み上げではなく、「ほのか」としての表現を音声に乗せることを心がけました。

補足: 読み方イメージとシチュエーションは声優様に台本の情景のイメージをしてもらうためで、コーパスには不要です。


2. 録音

収録プロセス

個人で活動しているナレーター、ぼせき様(以下声優様)にご協力いただき、以下のプロセスで音声データを収録してもらいました。

収録フロー

  1. キャラ性・指示を共有
  2. 初回録音
  3. 私が確認してフィードバック
  4. 必要なら再録音

このループで、ほのか独自の感情表現を作り上げました。

叫び声をどう収録したか

本気の絶叫は学習安定性を壊す可能性があるため、

「喉から叫ぶイメージで、音量70%くらいの“コントロールされた叫び”」

をお願いしました。

学習音声の権利と責任について

  • AIモデルの著作権: 当方に帰属
  • 録音音声の著作権: 声優様に帰属
  • 利用範囲: 販売や配布は禁止。「零音ほのか」として使用することのみ許可
  • 責任: AI生成音声の内容・発言に関する一切の責任は当方に帰属

これらの権利関係を明確にし、声優様に学習音声の提供をご協力いただきました。


3. 音声編集

編集ワークフロー

収録した音声は、以下のプロセスで編集しました。

声優様への指示:

  • 録音開始・停止時に、前後の音声が極力途切れないようにする

当方での編集作業:

  • 前後の無音部分をカット
  • わずかなノイズの除去
  • 全体に対する一括処理(Audacityのマクロ機能などを使用)+必要に応じた手作業での微調整

品質管理への姿勢

すべての音声を 1件ずつ耳で確認しながら、Audacity を用いて手作業で編集 しました。
理由は2つです。

  • コーパスの品質がそのままモデル学習の質に直結する
  • わずかなノイズの確認や表現のフィードバックをするため

Audacityでの編集画面(例)

こうした丁寧な編集が、
学習の安定性と、ほのかの“感情が乗る声”の両方を支える土台になっています。

4. 感情を表現するためのコードベースでの転移学習

Style-Bert-VITS2 での感情表現実現には、単なるWEBUIの学習ではなく、
ほのかのように、叫び・悲しみなどの繊細なニュアンスを扱う場合、

  • 感情別データの整理
  • 特徴量の抽出
  • 重みや設定の細かい調整
  • フォルダ構造レベルの最適化

といった工程を、コードベースで細かく制御する必要があります。

ここでは、私が実際に行った
「独自スクリプトを活用した感情学習フロー」
について紹介します。

全体のワークフロー

感情表現の学習は、以下の流れで進みます。

1. 環境設定
   ↓
2. ファイル構成の準備(感情別ディレクトリ作成)
   ↓
3. 感情別コーパスの整理(esd.list 作成)
   ↓
4. 前処理パイプライン
   ├─ train.list / val.list の作成(9:1 分割)
   ├─ 音韻解析(Phoneme 抽出)
   ├─ BERT 特徴量抽出
   └─ 音声特徴量抽出(Spectrogram + スタイルベクトル)
   ↓
5. 感情ウェイト調整と学習
   ↓
6. 推論テスト

このワークフロー全体を標準的な Style-Bert-VITS2のスクリプトをベースに構築することで、
“ほのか固有の感情表現モデル” を効率的に構築できます。


4.1 環境設定

最初に PowerShell で環境変数を設定します。

$env:USE_LIBUV="0"

これを設定しておくことで、推論・前処理時の予期せぬエラーを回避できます。


4.2 ファイル構成の準備(感情別ディレクトリ作成)

感情別の学習を実現するため、以下のようなディレクトリ構成を用意します。

Style-Bert-Vits2/
├── Data/
│   ├── honoka_model/
│   │   ├── neutral/
│   │   │   ├── wavs/
│   │   │   │   ├── 0001.wav
│   │   │   │   ├── 0001.wav.npy
│   │   │   │   ├── 0001.spec.pt
│   │   │   │   ├── 0001.bert.pt
│   │   │   │   └── ...
│   │   │   └── neutral.txt
│   │   ├── fear/
│   │   │   ├── wavs/
│   │   │   │   ├── 0001.wav
│   │   │   │   ├── 0001.wav.npy
│   │   │   │   ├── 0001.spec.pt
│   │   │   │   ├── 0001.bert.pt
│   │   │   │   └── ...
│   │   │   └── fear.txt
│   │   ├── [他emotion]/
│   │   │   └── [他emotion]
│   │   ├── models/
│   │   │   ├── D_0.safetensors
│   │   │   ├── G_0.safetensors
│   │   │   └── WD_0.safetensors
│   │   ├── config.json
│   │   ├── esd.list
│   │   ├── train.list
│   │   └── val.list
│   └── ...

ディレクトリの役割

各感情別フォルダ(neutral / fear / ...)

  • wavs/: 元の音声ファイル (.wav) と学習に必要な特徴量
    • .wav: 元の音声
    • .wav.npy: 音声特徴量(numpy形式)
    • .spec.pt: スペクトログラム
    • .bert.pt: BERT から抽出された言語特徴量
  • [emotion].txt: テキスト対応ファイル

models/: 事前学習モデル

  • G_0.safetensors: 音声生成モデル(Generator)
  • D_0.safetensors: 識別モデル(Discriminator)
  • WD_0.safetensors: 音響特徴ディスクリミネーター(Wave Discriminator)

この構成により、Style-Bert-VITS2 は各感情を独立して学習しながら、
統一されたモデル構造で複数感情を扱うことができます。


4.3 感情別コーパスの整理(esd.list 作成)

学習に必要な「感情タグ付きのメタデータリスト」を作成します。

esd.list について

esd.list は、各音声ファイルとテキストの対応付けを、
感情タグ付きで記録したファイルです。

フォーマット(5カラム):

wav_path | speaker_id | language | text | emotion

👇実際のesd.list

F:\sbvits2-project\Style-Bert-VITS2\Data\honoka_model\neutral\wavs\0179.wav|honoka_model_speaker|JP|ご視聴ありがとうございました。また次も来てくれると嬉しいな。それじゃあ今日はこの辺で。|neutral
  • wav_path: 音声ファイルの絶対パス
  • speaker_id: 話者ID
  • language: 言語(JP = 日本語)
  • text: 音声の対応テキスト
  • emotion: 感情ラベル(neutral / fear / sadness など)

処理内容

感情別ディレクトリ構成から自動的に esd.list を生成します:

  • 各感情フォルダ(neutral / fear / sadness など)を自動検出
  • 各フォルダの {emotion}.txt を読み込み
  • 対応する wav ファイルの存在を確認
  • 5カラム形式で esd.list を生成
  • 感情別の統計を計算・出力

この処理により、感情情報を適切に保持したまま、
学習用のメタデータが生成されます。

実行完了後、Data/honoka_model/esd.list が生成されます。


4.4 前処理パイプライン

esd.list から実際の学習データ(train.list / val.list)を生成し、
同時に音声テキストを学習用の形式(音韻列・アクセント・感情情報)に変換します。

全体フロー

esd.list(感情タグ付き)
   ↓
[4.4.1] train.list / val.list 作成(9:1 分割)+ 音韻解析
   ├─ esd.list を読み込み
   ├─ テキストを正規化・特殊単語を置換
   ├─ 日本語を音素列に変換(Phoneme抽出)
   └─ 感情別統計を計算
   ↓
[4.4.2] BERT 特徴量抽出
   └─ テキスト情報から言語特徴量を抽出
   ↓
[4.4.3] 音声特徴量抽出
   ├─ スペクトログラム生成
   └─ スタイルベクトル抽出
   ↓
学習用データセット完成

4.4.1 train.list / val.list 作成と音韻解析

役割

esd.list を 9:1 に分割し、同時にテキスト前処理と音韻解析を実行します。

処理内容

  • データ分割: 感情情報を保持したまま train.listと val.listに 9:1 分割
  • 特殊単語置換: 「零音」→「れいね」など、キャラクタリティに合わせた読み方に置換
  • テキスト正規化: 日本語テキストを標準形式に変換
  • 音韻解析: 日本語を音素列に変換し、各音素のアクセント情報を抽出
  • 感情統計計算: 各分割後の train.list / val.list における感情別のデータ件数を計算

このステップで、以下の 8 カラム形式データが生成されます:

wav_path | speaker_id | language | normalized_text | phonemes | tones | word2ph | emotion

👇実際のtrain.list

F:\sbvits2-project\Style-Bert-VITS2\Data\honoka_model\neutral\wavs\0179.wav|honoka_model_speaker|JP|ご視聴ありがとうございました.また次も来てくれると嬉しいな.それじゃあ今日はこの辺で.|_ g o sh i ch o o a r i g a t o o g o z a i m a sh i t a . m a t a ts u g i m o k i t e k u r e r u t o u r e sh i i n a . s o r e j a a ky o o w a k o n o a t a r i d e . _|0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 1 1 1 0 0|1 2 3 2 2 2 2 1 1 2 2 2 2 2 1 1 2 2 4 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 1 1 2 1 2 2 2 5 2 1 1|neutral

実行完了後、以下が生成されます:

  • train.list: 学習用データ
  • val.list: 検証用データ

4.4.2 BERT 特徴量抽出

役割

train.list / val.list から、テキスト情報の言語特徴量を抽出し、
各音声ファイルに対応させます。

処理内容

  • 入力: train.list / val.list(8カラム、感情情報付き)
  • 処理:
    • 各テキストを BERT モデルに入力
    • テキストから言語特徴量を抽出
    • 音素列の長さに合わせて整形
    • 感情情報を保持したまま処理
  • 出力: 各音声ファイルに対応する .bert.pt ファイル

特徴

  • キャッシング: 既に抽出済みのファイルは再利用し、効率化
  • エラーハンドリング: 形状が不正な場合は自動的に再生成
  • 感情情報の保持: BERT抽出時も感情タグを保持することで、感情別学習に対応

このステップ完了後、各音声ファイルは対応する .bert.pt ファイルを持ちます。


4.4.3 音声特徴量抽出

役割

train.list / val.list の各音声ファイルから、
スタイルベクター(感情や話し方の特徴)を抽出し、
学習に必要な音声特徴量を生成します。

処理内容

  • 入力: 各音声ファイル(.wav)
  • 処理:
    • 音声を標準サンプリングレート(16kHz)にリサンプリング
    • Wav2Vec2 モデルを用いて音声を深層表現に変換
    • 感情・話し方の特徴を捉えたスタイルベクターを抽出
    • ベクター次元を最適化(256次元)
    • スタイルベクターを .npy ファイルとして保存
  • 出力: 各音声ファイルに対応する .npy ファイル

特徴

  • 感情情報の学習: Wav2Vec2 の特徴抽出により、音声の感情的特性が自動的に捉えられる
  • 品質チェック: NaN 値が含まれるファイルは自動検出・除外し、学習の安定性を確保
  • 並列処理: 複数ファイルを効率的に処理

このステップ完了後、train.list と val.list のすべての音声ファイルに対応するスタイルベクターが生成され、
学習用データセットが完成します。


5. 感情ウェイト調整と学習

5.1 感情ウェイト調整の戦略

Style-Bert-VITS2 の学習時、各感情に対する学習強度を調整することで、
限定的なデータから深い感情表現を実現しました。

恐怖感情の重点学習

本プロジェクトでは、恐怖感情(fear)に対して 3 倍の学習ウェイトを設定しました。

理由:

  • fearはneutralの感情に比べて少数派
  • AI音声では恐怖表現が薄れやすく、意識的な強化が必要
  • 「叫び」として機能させるには、感情の深度が不可欠

config.json での設定

config.json で以下を設定:

{
  "train": {
    "batch_size": 6,
    "epochs": 80,
    "learning_rate": 0.0001,
    "early_stopping_patience": 5,
    "seed": 42,
    "c_style": 3.5,
    "style_weight": 2.0,
    "use_weighted_sampler": true,
    "emotion_weights": {
      "neutral": 1.0,
      "fear": 3.0,
      "sadness": 3.0
    },
    "freeze_JP_bert": false,
    "freeze_emo": false
  }
}

5.2 学習実行と最適化

GPU リソース管理

GPU使用率をnvidia-smiで確認します。

  • バッチサイズを最適化し、GPU メモリの約 85% を活用
  • 学習中の GPU 温度、メモリ使用率を監視
  • 安定稼働を維持(GPU 温度 45℃、使用率 36%)
GPU  Name                  Driver-Model | Temperature  Power  | Memory Usage    | GPU Util
RTX 4060 Ti               WDDM          |    45C      56W    | 14072 / 16380MB |   36%

バッチ構成の感情バランス

各バッチに異なる感情が混在するよう設計し、
モデルが各感情を効率的に学習できるように最適化しています。

Batch emotions: ['fear', 'neutral', 'fear', 'fear', 'fear', 'fear']
Batch emotions: ['sadness', 'neutral', 'neutral', 'sadness', 'neutral', 'fear']

バッチ内での感情分布をログして監視することで、
感情ウェイト調整がバッチ単位でも均等に機能していることを確認しています。


6. 推論テストと結果検証

6.1 感情ウェイト調整の効果検証

感情ウェイト調整(fear 3.0 設定)による改善効果を実証するため、
以下の 2 つのモデルで「叫び」の音声を生成・比較しました。

比較内容

A(感情ウェイト設定):

  • emotion_weights.fear: 3.0
  • 恐怖感情に対して 3 倍の学習強度

B(同値学習):

  • emotion_weights.fear: 1.0
  • すべての感情を等しく学習

結果

こちら零音ほのかのX(旧: Twitter)に載せています。

https://x.com/ReineHonoka/status/1992551922193269122

感情ウェイト調整により、A では より深い恐怖の感情が表現され、叫びの迫力が向上しました。

B では叫び声の片りんは見せつつも平坦な表現となり、不足していることが確認できます。

平常音声はどちらもあまり変わりませんね。


まとめ

本記事では、AI Vtuber「零音ほのか」の感情表現AI音声と叫び声を実現するためのプロセスをまとめました。

主な工夫

  • 独自コーパス構築: カスタムデータセットで、キャラクタリティある感情表現を実現
  • 丁寧な音声編集: 1件ずつ耳で確認し、品質を保証
  • 感情ウェイト調整: fear 3倍の学習強化で、AI音声では珍しい「叫び」を実装
  • コードベース制御: Style-Bert-VITS2 の標準機能を超える細かい調整

重要なポイント

感情表現を実現するには、単なる大規模データセットではなく、質の高いデータ意図的な学習設定が不可欠です。

今後の応用

このアプローチは、Style-Bert-VITS2 を用いた他のプロジェクトにも応用できます。
キャラクタリティのある AI音声を構築する際の参考になれば幸いです。


Discussion