8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

はじめに

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

零音ほのかは感情を学ぶAIとしてホラーゲームへの挑戦、そしてAIとしてAI関係を取り扱った活動をしています。

ほのかは、

  • 甘くて寄り添うような声質
  • 自然で感情の乗るAI音声
  • そしてAIでは珍しい"叫び"や"悲しみ"まで表現できる音声モデル

この3つを特徴としたAI Vtuberです。

今回の記事は、
ほのかの“感情表現AI音声”および”AIの叫び声”を実現するために、
私が個人開発として試し、組み立てたプロセスをまとめたものです。
Style-Bert-VITS2の包括的な解説ではなく、一つの参考例として読める内容になっています。

補足: 今回は学習フローと叫び声に焦点を当てたため、悲しみについては触れていません。
また、Style-Bert-VITS2はAGPL v3.0ライセンスのため改変したソースコードは載せていません。


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

Qiitaでは音声ファイルの直接的な埋め込みができないため、
実際の零音ほのかの紹介と音声は以下の note 記事に載せています。


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

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

PC環境

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

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

  • バージョン: Style-Bert-VITS2 v2.5.0-JP-Extra

JP-Extraの主な特徴

  • 日本語に特化: 英語や中国語ではなく、日本語の自然な発音・イントネーション・アクセントに全振りしたモデル構造
  • 感情表現の強化: 日本語の感情ニュアンスを細かく調整でき、感情の強弱を自由に制御可能
  • 高速推論: リアルタイム推論が可能で、AI Vtuberのような実時間性を必要とするものに最適

参考資料・参考リンク

最終更新日 2025.11.23


1. コーパス構築

コーパスとは

コーパスは「音声合成モデルの学習に使われる、テキストと音声のペアからなるデータセット」です。
テキストと音声の対応関係をモデルに学習させることで、テキスト入力から自然な音声を生成できるようになります。


既存コーパスの課題

ITA コーパスなどの汎用データセットは「自然な日本語音声」に最適化されていますが、
「AI Vtuber としてのキャラクタリティある感情表現」には対応していません。
そのため、「ほのか」の個性に特化した独自のコーパスが必要だと感じました。

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

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

コーパス構築の例

台本:

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

指示:

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

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

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


2. 録音

収録プロセス

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

  1. 指示渡し: ほのかのキャラクタリティ説明とコーパスを提供
  2. 初回録音: コーパスに基づいて音声を録音
  3. フィードバック: 録音した音声を聞き、意図通りの表現か確認
  4. 調整と再録音: 必要に応じて読み方やニュアンスを調整し、再録音

このループを繰り返し行うことで、汎用的な表現ではなくほのか固有の表現を実現しました。

技術的工夫:叫び声の収録

本気の絶叫はAI学習にとってノイズになる可能性があるため、
事前に「喉から出すような叫び方で、音量を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
  • 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: 学習用データ
  • 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 リソース管理

RTX 4060 Ti(16GB)を最大効率で利用するため:

  • バッチサイズを最適化し、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)に載せています。

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

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

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


まとめ

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

主な工夫

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

重要なポイント

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

今後の応用

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


8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?