聊天視窗

從零到偶像:生成式 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)逐步成熟,聲音合成將更趨向 **多模態協同**,角色的語音、情緒與動作將能同步生成,為虛擬偶像開啟全新「聲‑形‑情」三位一體的創作可能。祝您在聲音的海洋中探索無限想像,為虛擬人物賦予最真實、最感動的聲音靈魂!