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")

可用参数和建议范围在 速度·韵律调节 中整理。