Gemini 文字轉語音
使用 Google Gemini TTS 從文字生成自然、富有表現力的語音。支援 70 多種語言、30 種預設語音,並可透過自然語言提示和音頻標籤進行風格控制。
需求: Node.js 18+、ffmpeg、
@google/genainpm 套件、GEMINI_API_KEY環境變數。
可用腳本
scripts/generate-tts.mjs— 全能型 TTS 生成器,具備單一請求一致性、基於靜音的分割功能,以及自動修剪功能。
快速入門
單段文字轉語音
npm install @google/genai
GEMINI_API_KEY=your-key node scripts/generate-tts.mjs \
--text "你好,歡迎使用我們的產品!" \
--output-dir public/vo \
--voice Kore
多段配音(語音一致)
建立一個 segments.json:
[
{ "id": "intro", "text": "歡迎來到我們的產品發布會。" },
{ "id": "features", "text": "以下是您會愛上的三個功能。" },
{ "id": "close", "text": "立即在我們的網站上開始使用吧。" }
]
執行:
GEMINI_API_KEY=your-key node scripts/generate-tts.mjs \
--segments segments.json \
--output-dir public/vo \
--voice Kore \
--director-notes "語調:溫暖、自信、鼓舞人心。風格:專業旁白,帶有聲音微笑。口音:中性美式英語。語速:適中。"
輸出(JSON 至標準輸出):
{
"success": true,
"segments": [
{ "id": "intro", "file": "public/vo/vo-intro.mp3", "duration": 3.25 },
{ "id": "features", "file": "public/vo/vo-features.mp3", "duration": 4.10 },
{ "id": "close", "file": "public/vo/vo-close.mp3", "duration": 2.80 }
],
"totalDuration": 10.15,
"fullAudioFile": "public/vo/vo-full.wav"
}
腳本選項
| 標誌 | 預設值 | 說明 |
|---|---|---|
--segments FILE | — | JSON 檔案,包含 [{id, text}] 段落定義 |
--text TEXT | — | 要生成的單段文字(與 --segments 互為替代) |
--output-dir DIR | — | 音頻檔案的輸出目錄(必要) |
--voice NAME | Kore | 預設語音名稱(參見語音表) |
--model NAME | gemini-3.1-flash-tts-preview | Gemini TTS 模型 ID |
--director-notes TEXT | — | 表現指導:風格、語速、口音、呼吸、清晰度。不控制性別/年齡(請使用 --voice 控制)。 |
--retries N | 3 | API 錯誤時的最大重試次數 |
--trim / --no-trim | --trim | 從段落邊界修剪靜音 |
--format FORMAT | mp3 | 輸出格式:mp3 或 wav |
退出碼
| 代碼 | 含義 |
|---|---|
| 0 | 成功 |
| 1 | 缺少必要引數或環境變數 |
| 2 | API 錯誤,重試次數已耗盡 |
| 3 | ffmpeg 未安裝或處理失敗 |
| 4 | 檔案 I/O 錯誤 |
工作原理(多段)
Gemini TTS 無法保證跨不同 API 請求的語音一致性。腳本透過以下方式解決此問題:
- 將所有段落合併為一個提示,並在它們之間加上
[3 second pause](3 秒暫停)標記 - 在一個 API 呼叫中生成單一連續音頻檔案
- 使用 ffmpeg
silencedetect搭配自適應閥值(從 noise=-35dB, d=1.5s 開始,逐步放寬)偵測靜音間隙。如果找到完全匹配,則直接使用。如果發生閥值跳躍(太少 → 太多),則以更快的語速重新生成音頻,使段落之間的暫停更明顯,然後重試偵測。 - 在靜音中點分割,產生個別段落檔案
- 從每個段落修剪殘留的靜音填充(每側約 1.5 秒),保留 0.15 秒呼吸空間
模型
| 模型 | 最適用於 |
|---|---|
gemini-3.1-flash-tts-preview | 最新、可控性最高、200 多個音頻標籤(預設) |
gemini-2.5-flash-preview-tts | 快速、品質良好、一般用途 |
gemini-2.5-pro-preview-tts | 最高品質、複雜表現 |
語音
30 種預設語音:
| 語音 | 性別 | 特質 | 音高 |
|---|---|---|---|
| Achernar | 女 | 柔和 | 較高 |
| Achird | 男 | 友善 | 中低 |
| Algenib | 男 | 粗獷 | 低 |
| Algieba | 男 | 平滑 | 低 |
| Alnilam | 男 | 堅定 | 中低 |
| Aoede | 女 | 輕快 | 中 |
| Autonoe | 女 | 明亮 | 中 |
| Callirrhoe | 女 | 隨和 | 中 |
| Charon | 男 | 資訊型 | 低 |
| Despina | 女 | 平滑 | 中 |
| Enceladus | 男 | 氣聲 | 低 |
| Erinome | 女 | 清晰 | 中 |
| Fenrir | 男 | 興奮型 | 中低 |
| Gacrux | 女 | 成熟 | 中 |
| Iapetus | 男 | 清晰 | 中低 |
| Kore | 女 | 堅定 | 中 |
| Laomedeia | 女 | 樂觀 | 較高 |
| Leda | 女 | 年輕 | 較高 |
| Orus | 男 | 堅定 | 中低 |
| Puck | 男 | 樂觀 | 中 |
| Pulcherrima | 男 | 前進型 | 中 |
| Rasalgethi | 男 | 資訊型 | 中 |
| Sadachbia | 男 | 活潑 | 低 |
| Sadaltager | 男 | 知識型 | 中 |
| Schedar | 男 | 平穩 | 中低 |
| Sulafat | 女 | 溫暖 | 中 |
| Umbriel | 男 | 隨和 | 中低 |
| Vindemiatrix | 女 | 溫柔 | 中 |
| Zephyr | 女 | 明亮 | 較高 |
| Zubenelgenubi | 男 | 隨意 | 中低 |
導演筆記(--director-notes)
所選語音的表現指導。只定義重要的部分——過度指定會限制模型的創造力,並可能使結果變差。
最常見的三個方向是風格、語速和口音,但您可以包含任何與表現相關的自訂指示。
- 風格 — 情感品質和表達特質。要具描述性:
「具有感染力的熱情——聽眾應該感覺自己正在參與一件令人興奮的事情」比單純的「有活力」更有效。您可以疊加特質,並使用配音行業術語,例如「聲音微笑」。 - 語速 — 整體速度和節奏變化。範圍可以從
「盡可能快地說」到「極其緩慢流暢,單詞之間相互融合,零急迫感」。 - 口音 — 要具體。
「在英格蘭克羅伊登聽到的英式英語」比「英國口音」有效得多。
--director-notes "風格:熱情又帶點傲嬌的 Z 世代美妝 YouTuber。語速:極快,像短影音網紅一樣快速表達。口音:來自拉古納海灘的南加州山谷女孩。"
音頻標籤
在段落文字中使用內聯 [括號] 來進行逐詞控制。可局部覆蓋導演筆記。
[whispers](低語) [shouting](喊叫) [excited](興奮) [serious](嚴肅) [short pause](短暫停頓) [laughs](笑聲) [very fast](非常快) [very slow](非常慢) [sarcastic](諷刺) [curious](好奇)
創意標籤也可以使用:[like dracula](像德古拉)、[whispering conspiratorially](陰謀地低語)
範例:"[excited] 這改變了一切![short pause] 讓我向您展示如何做到。"
參考資料
- 提示指南 — 針對風格、情感和口音的高階提示工程