返回目錄
A
從零到偶像:生成式 AI 與虛擬人物的跨域實踐 - 第 6 章
第 6 章:聲音合成與情感表達
發布於 2026-03-02 21:26
# 第 6 章:聲音合成與情感表達
本章聚焦於 **文字轉語音(TTS)**、**歌聲合成** 與 **情緒控制** 三大核心技術,說明如何為虛擬偶像打造專屬聲線,並在不同情境(旁白、對話、演唱)中靈活切換情感。所有概念皆以實務案例、開源工具與最佳實踐為主軸,讓讀者能在本機或雲端環境快速部署可商用的聲音合成管線。
---
## 6.1 聲音合成概論
| 名稱 | 定義 | 典型應用 |
|------|------|----------|
| TTS (Text‑to‑Speech) | 將文字訊息轉換為自然語音的技術。核心包括 **語音前置模型**(語者特徵、音素)與 **聲碼器**(Waveform 生成)。 | 角色旁白、直播聊天回覆、情境劇本朗讀 |
| VC (Voice Conversion) | 以目標說話者的聲音特徵為基礎,將任意來源語音轉換為目標聲線。 | 低資源語者快速生成、跨語言配音 |
| Singing Synthesis | 以音高、時值、歌詞等音樂資訊為輸入,合成歌聲。 | 原創歌曲、二次創作、直播 Karaoke |
> **重點**:TTS 產生的是 *說話語調*(語速、斷句、情感),而 Singing Synthesis 必須同步 **音高走向**(pitch contour)與 **歌詞韻律**(phoneme duration)。兩者的聲碼器(如 HiFi‑GAN、DiffWave)可互換,但前者更注重語音自然度,後者則需支援高頻音高變化。
---
## 6.2 模型與平台選型
### 6.2.1 主流開源模型
| 類別 | 模型 | 語種/語者 | 特色 | 推薦使用情境 |
|------|------|-----------|------|--------------|
| TTS | **Coqui TTS**(FastSpeech2 + HiFi‑GAN) | 多語種(英、日、中文) | 訓練門檻低、可自行微調 | 中小型工作室、快速原型 |
| TTS | **Microsoft Azure Speech** | 100+ 語言 | 商業級 API、情感子模型 | 大規模雲端服務、企業方案 |
| TTS | **OpenAI & ElevenLabs** | 英文、日文 | 超高自然度、即時情感調節 | 高品質旁白、廣告配音 |
| VC | **RVC (Retrieval‑Based Voice Conversion)** | 任意語者(需要 5‑30 秒樣本) | 低資源即可複製聲線 | 快速為虛擬偶像生成自訂聲線 |
| Singing | **so-vits-svc** | 中文、日文、英文 | 可控音高、聲線混合 | 原創歌曲、卡拉 OK 合成 |
| Singing | **DiffSinger** | 多語種 | Diffusion 驅動的歌聲合成,音準準確 | 高品質音樂製作 |
### 6.2.2 商業雲端服務比較
| 服務 | 定價(每千字/每分鐘) | 支援情感參數 | 客製化程度 | 優缺點 |
|------|--------------------|----------------|------------|--------|
| Azure Speech | 約 $1.5 USD | `tone`, `rate`, `volume` | 自訂聲線 (Custom Neural Voice) | 安全、可擴展,但需要審核流程 |
| Google Cloud TTS | 約 $4 USD | `pitch`, `speakingRate`, `volumeGainDb` | 雲端模型微調(VoiceModel) | 全球節點低延遲,中文自然度較低 |
| Amazon Polly | 約 $4 USD | `SpeechMark`、`lexicon` | Neural+Standard 混合 | 內建 SSML 支援,適合直播 |
| ElevenLabs | 免費 30k characters,付費 $5+/M | `emotion` (`neutral`, `joy`, `sadness`) | 可上傳 30 秒樣本訓練 | 產出品質極佳,API 限流較嚴 |
---
## 6.3 角色聲線設計流程
1. **聲線概念化**:根據第 2 章角色定位,決定聲線的 **年齡、性別、語調、情緒基調**(例如:活潑的 16 歲偶像、溫柔的 24 歲虛擬歌手)。
2. **樣本收集**:
- 若自行錄製,建議 **每句 3‑5 秒,總時長 10‑20 分鐘**,涵蓋 **普通說話、快說、低語、笑聲** 等變體。
- 若使用公開語料庫(如 `VCTK`, `Common Voice`),挑選與角色相似的說話者作為基礎。
3. **聲線模型選擇**:
- 低資源可直接使用 **RVC** 轉換現有 TTS 模型,快速得到自訂聲線。
- 若需求高品質,可走 **Azure Custom Neural Voice** 或 **Coqui TTS + LoRA 微調**。
4. **微調/訓練**:
- 使用 **LoRA**(Low‑Rank Adaptation)於核心 encoder/decoder 進行少量參數調整,僅需 1‑2 小時的 GPU 時間。
5. **情感標註**:為每段語音添加 **情感標籤**(`neutral`, `happy`, `sad`, `angry`),方便後續情感控制。
> **小技巧**:在錄製樣本時,使用 **SPL meter** 保持音量在 **-20dBFS** 左右,避免後期過度壓縮。
---
## 6.4 微調與自製聲庫實作
### 6.4.1 用 Coqui TTS 透過 LoRA 微調
```bash
# 1. 建立虛擬環境
python -m venv venv && source venv/bin/activate
# 2. 安裝 Coqui TTS 及相關套件
pip install TTS==0.23.0 torch==2.1.0 torchaudio librosa
# 3. 準備資料 (metadata.csv)
# wav_path|text|speaker_id|emotion
# ./wav/001.wav|你好,我是星瀾。|0|neutral
# 4. 下載預訓練模型 (FastSpeech2 + HiFi‑GAN)
tts --model_name fastspeech2_ljspeech --list_models
# 5. 開始 LoRA 微調 (rank=4, epochs=10)
python -m TTS.bin.train_lora \
--continue_path ./pretrained_models/fastspeech2_ljspeech \
--train_path ./data/metadata.csv \
--output_path ./lora_starling \
--lora_rank 4 \
--epochs 10 \
--batch_size 32
# 6. 合成測試
tts --model_path ./lora_starling \
--text "歡迎來到我的直播間!" \
--speaker_idx 0 \
--emotion "happy" \
--out_path ./outputs/hello.wav
```
### 6.4.2 使用 RVC 進行聲線轉換
```bash
# 安裝 RVC (Python 版)
git clone https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI.git
cd Retrieval-based-Voice-Conversion-WebUI
pip install -r requirements.txt
# 1. 準備目標聲線樣本 (5‑30 秒 wav)
# 2. 產生特徵索引
python inference_main.py --mode index --wav_dir ./target_voice
# 3. 轉換 TTS 輸出 (demo.wav) 為目標聲線
python inference_main.py --mode vc --source ./demo.wav \
--model_path ./models/rvc_model.pth \
--output ./vc_output.wav
```
> **提示**:RVC 需要 **GPU (CUDA ≥11.6)**,且音頻長度建議不超過 30 秒,以避免滑動窗口產生斷裂。
---
## 6.5 情緒控制技術
### 6.5.1 SSML 與情感標籤
Speech Synthesis Markup Language(**SSML**)是主流雲端 TTS 支援的語音標記語言,可控制 **語速、音高、情感** 等參數。例如 Azure 的 SSML 範例:
```xml
<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="zh-TW">
<voice name="zh-TW-YunJiaNeural">
<prosody rate="+10%" pitch="+2st">
<express-as style="cheerful">大家好,我是星瀾!</express-as>
</prosody>
</voice>
</speak>
```
- `style` 參數可選 `cheerful`, `sad`, `angry` 等(依平台而異)。
- `prosody` 控制 **節奏**(`rate`)與 **音高**(`pitch`)。
### 6.5.2 情感嵌入 (Emotion Embedding)
在開源模型中,情感往往透過 **額外的向量** 注入到編碼器或解碼器。
```python
# 假設使用的 FastSpeech2 支援 emotion_id
emotion_map = {"neutral":0, "happy":1, "sad":2, "angry":3}
emotion_id = emotion_map["happy"]
output = model.infer(text="今天的天氣真好!", speaker_id=0, emotion_id=emotion_id)
```
> **實務建議**:為每種情感收集 **至少 100 句** 標註好的語料,使模型能學習到穩定的情感表現。
---
## 6.6 歌聲合成與音高控制
### 6.6.1 主要模型概覽
| 模型 | 音高控制方式 | 支援語言 | 特色 |
|------|--------------|----------|------|
| **so-vits-svc** | 以 **pitch shift** + **voice conversion** | 中文、日文、英文 | 可在短樣本上快速構建歌手聲線 |
| **DiffSinger** | Diffusion 直接預測 **MIDI‑aligned spectrogram** | 多語種 | 音準準確、可端到端生成 |
| **RVC + Karaoke Vocoder** | RVC 轉換 + 声码器 (HiFi‑GAN) | 任意 | 兼容性高,適合已有 TTS 基礎 |
### 6.6.2 從 MIDI 到音頻的簡易管線(以 DiffSinger 為例)
```bash
# 1. 安裝 DiffSinger
git clone https://github.com/MoonInTheRiver/DiffSinger.git
cd DiffSinger
pip install -r requirements.txt
# 2. 準備 MIDI(song.mid)與歌詞(song.lrc)
mid2dvec song.mid -o song.dvec # 將 MIDI 轉為音高向量
# 3. 合成
python inference.py \
--model_path ./pretrained/diff-singer.pth \
--lyrics ./song.lrc \
--pitch ./song.dvec \
--output ./outputs/song.wav
```
> **關鍵參數**:`--duration_ratio` 調整節奏快慢,`--energy` 控制音量與情感強度。
### 6.6.3 結合 TTS 與歌聲合成
1. **先用 TTS 產生說話版**(如「我想對大家說…」)。
2. **使用 Pitch‑Shift** 或 **World Vocoder** 把語音改為音高曲線,然後送入 DiffSinger。
3. **後製混音**:將伴奏與人聲在 DAW(如 Reaper、Logic)中融合,同時加入 **混響與動態壓縮** 提升音質。
---
## 6.7 完整實作案例:從腳本到直播音頻
> **目標**:在 OBS 中即時播放虛擬偶像的即興對話與歌唱,並支援情緒切換。
### 6.7.1 系統架構圖
```
+-------------------+ +---------------------+ +-------------------+
| Discord Bot / API | ---> | TTS / VC Service | ---> | Audio Mixer (FFmpeg) |
+-------------------+ +---------------------+ +-------------------+
|
v
+-------------------+
| OBS (Virtual Audio)
+-------------------+
```
### 6.7.2 步驟說明
1. **Discord Bot**:監聽頻道訊息,解析指令 `!say <情感> <文字>`、`!sing <曲目>`。使用 **discord.py** 實作。
2. **TTS 服務**:部署在 Docker,內含 Coqui TTS + LoRA 模型,接受 HTTP POST:
```json
{"text":"你好!","emotion":"happy"}
```
3. **VC 服務**(可選):對 TTS 輸出進行 RVC 轉換為專屬聲線。
4. **Audio Mixer**:使用 **FFmpeg** 將音訊與背景音(BGM)混合,輸出到 **Virtual Audio Cable**,OBS 可直接抓取。
5. **OBS**:設置 `Audio Input Capture`,指向 Virtual Audio Cable,配合 **Live2D** 模型同步嘴型。
### 6.7.3 代碼範例(Discord Bot)
```python
import discord, requests, os
from discord.ext import commands
bot = commands.Bot(command_prefix='!')
TTS_ENDPOINT = os.getenv('TTS_ENDPOINT', 'http://localhost:8000/synthesize')
@bot.command()
async def say(ctx, emotion: str, *, text: str):
payload = {"text": text, "emotion": emotion}
r = requests.post(TTS_ENDPOINT, json=payload)
if r.status_code == 200:
with open('out.wav', 'wb') as f:
f.write(r.content)
await ctx.send(file=discord.File('out.wav'))
else:
await ctx.send('合成失敗 🚧')
@bot.command()
async def sing(ctx, song_id: str):
# 呼叫歌聲合成服務(DiffSinger)
r = requests.post('http://localhost:8001/sing', json={"song_id": song_id})
if r.status_code == 200:
with open('song.wav', 'wb') as f:
f.write(r.content)
await ctx.send(file=discord.File('song.wav'))
else:
await ctx.send('歌唱失敗 😢')
bot.run(os.getenv('DISCORD_TOKEN'))
```
### 6.7.4 效能與成本考量
| 項目 | 推薦硬體 | 每月成本(雲端) |
|------|----------|------------------|
| TTS 推理 | NVIDIA RTX 3080 / A100 | $150‑$300(p3) |
| VC 轉換 | RTX 2070 Super | $80‑$120(g4) |
| 歌聲合成 | RTX 3090 (GPU 24GB) | $250‑$400(p4) |
> **最佳實踐**:將 TTS 與 VC 合併成單一微調模型,減少跨服務呼叫延遲;使用 **ONNX Runtime** 或 **TensorRT** 加速推理。
---
## 6.8 評估與品質測試
| 評估指標 | 測試方法 | 合格標準 |
|----------|----------|----------|
| 自然度 (MOS) | 收集 30 位聽眾的 5 分制評分 | ≥4.2 |
| 情感辨識率 | 使用情感分類模型(BERT‑Emotion)衡量語音與標籤匹配度 | ≥85% |
| 音高準確度 | 與原始 MIDI 比較 Pitch RMSE | ≤ 0.15 semitone |
| 延遲 (Latency) | 從文字輸入到音頻播放的總時間 | ≤ 300ms(即時互動) |
| 失真 (Signal‑to‑Noise Ratio) | Loudness‑meter 與 PSNR 計算 | ≥ 35 dB |
> **工具**:`pystoi`(語音相似度)、`praat`(情感指標)、`librosa`(pitch extraction)。
---
## 6.9 常見問題與最佳實踐
| 問題 | 解答 |
|------|------|
| **聲線太機械化** | 增加 **prosody augmentation**(隨機速度、音高抖動)或使用 **HiFi‑GAN‑v2** 作為聲碼器。 |
| **情感切換突兀** | 在情感切換點前加入 **淡入淡出**(`cross_fade`)或使用 **情感平滑向量** 插值。 |
| **歌聲走音** | 確保 **MIDI pitch quantization** 正確;使用 **World Vocoder** 重新合成「音高」部分。 |
| **模型大小超過部署限制** | 透過 **LoRA** 或 **Adapter** 壓縮,或將模型轉為 **ONNX + quantization**。 |
| **語言支援不足** | 可將 **多語言 TTS**(如 `Mellotron`)結合 **語音合成轉譯**(TTS+ST)產生跨語言聲線。 |
**最佳實踐總結**:
1. **資料品質優先**:乾淨、均衡的聲音樣本是成功的根本。
2. **微調永遠比全訓練更省資源**:利用 LoRA/Adapter 只調整少量參數。
3. **情感與音高分離**:將情感向量與 pitch 控制獨立,利於後期混音。
4. **自動化測試管線**:CI 中加入 MOS、RMSE、Latency 檢測,確保每次提交不退化。
5. **安全合規**:商業化前確保聲線樣本已取得授權,避免侵犯肖像權或聲音權利。
---
## 6.10 小結
本章從 **理論模型**、**工具選型**、**實作流程** 到 **品質驗證**,完整闡述了為虛擬偶像打造專屬聲線與情感表達的全套方法。掌握了以下核心能力,即可在 **直播、短視頻、音樂發佈** 等場景中,為角色注入生動的「聲音人格」:
1. **聲線設計**:根據角色定位規劃說話風格與情感色彩。
2. **模型微調**:使用 LoRA / RVC 低資源方式快速生成自訂聲線。
3. **情感控制**:透過 SSML、情感向量或情感‑aware TTS 實現細膩情緒切換。
4. **歌聲合成**:結合 DiffSinger / so‑vits‑svc 產出高音准的虛擬歌曲。
5. **即時工作流**:用 Discord Bot + OBS 架設全自動直播管線,支援即時對話與演唱。
未來,隨著 **大模型**(如 GPT‑Audio、AudioCraft)逐步成熟,聲音合成將更趨向 **多模態協同**,角色的語音、情緒與動作將能同步生成,為虛擬偶像開啟全新「聲‑形‑情」三位一體的創作可能。祝您在聲音的海洋中探索無限想像,為虛擬人物賦予最真實、最感動的聲音靈魂!