Skip to content

生成第一條語音

安裝完成後,現在是實際生成一個 wav 檔案的時候了。

本頁面涵蓋最基本的「一行文本 → 一個 wav」流程,以及由此自然延伸的幾種變體。

基本 — 將一句話儲存為 wav

python
from hayakoe import TTS

tts = TTS().load("jvnv-F1-jp").prepare()

speaker = tts.speakers["jvnv-F1-jp"]
speaker.generate("こんにちは、はじめまして。").save("hello.wav")

TTS() 僅註冊引擎規格。

模型實際下載到硬碟並載入到記憶體是在呼叫 prepare() 的時候。

speakers 是一個可以透過名稱取出已準備好的說話人的 dict。

想用 GPU 執行的話

首先需要安裝 GPU extras(安裝 — GPU 安裝 (CUDA))。

然後只需將 TTS(device="cuda") 改一個字即可。其餘程式碼完全相同。

只需記住首次呼叫可能會稍慢。

多句話直接輸入即可

在句子邊界(!?、換行)處會自動分割,句子之間會插入自然長度的靜音。

python
text = """
こんにちは。今日はいい天気ですね。
散歩でもしましょうか?
"""

speaker.generate(text).save("long.wav")

句間 pause 的長度由 Duration Predictor 預測並插入,該預測器是 按說話人分別訓練 的。

也就是說,有的說話人句間停頓較長,有的較短,每位說話人固有的呼吸節奏都會得到反映。

不要 wav 檔案而要 bytes

如果想在 FastAPI 等 Web 伺服器中直接作為回應返回,可以使用 to_bytes()

返回值是 WAV 格式的位元組串流。

python
audio = speaker.generate("テストです。")
payload: bytes = audio.to_bytes()

同時載入多個說話人

load() 支援鏈式呼叫,因此可以一次註冊多個說話人。

python
tts = (
    TTS()
    .load("jvnv-F1-jp")
    .load("jvnv-F2-jp")
    .load("jvnv-M1-jp")
    .load("jvnv-M2-jp")
    .prepare()
)

for name, speaker in tts.speakers.items():
    speaker.generate("おはようございます。").save(f"{name}.wav")

由於 BERT 是所有說話人共享的,每增加一個說話人記憶體不會翻倍或三倍增長。

每個說話人增加的量不是 BERT 而是小得多的 synthesizer 部分,所以載入 4 個說話人 RAM 也不會變成 4 倍。

實際測量值和重現方法已在 FAQ — 載入多個說話人時記憶體增加多少? 中單獨整理。

想稍微調整速度或音高時

generate() 接受可以直接調整語速・音高・韻律的參數。

python
speaker.generate(
    "今日はどんな国に辿り着くのでしょうか。",
    speed=0.95,        # 稍微快一點
    pitch_scale=1.05,  # 稍微高一點
).save("tuned.wav")

可用參數和建議範圍在 速度・韻律調整 中整理。