Python 文字转语音:离线、免费、自然的音色
重要提示:本文介绍的 Supertonic 3 模型和 SuperClonica 引擎不支持中文,可以朗读英语、日语、韩语、德语、俄语等 31 种语言。如果您需要中文语音,请选择其他模型。
在 Python 中把文字转成语音有几种方式:有的库使用操作系统自带的机械音色朗读,有的把文字发送到在线服务,还有的直接在您自己的电脑上运行神经网络模型。最后一种如今听起来已接近真人,而且无需联网。本指南先比较这些方案,再给出 SuperClonica 引擎的可运行代码。它是基于开放模型 Supertonic 3 的 pip 包,内容包括安装、第一个脚本、自定义音色、长文本以及 Docker 中的本地 HTTP API。引擎是我们的产品,涉及之处我们会说明。
在 Python 中实现文字转语音的几种方式
选库之前先想清楚两件事:文字能否离开您的电脑,以及音色需要多自然。
- pyttsx3 调用系统内置的语音引擎:Windows 上是 SAPI5,macOS 上是 NSSpeechSynthesizer,Linux 上是 eSpeak。它离线可用,几秒即可安装,但音色机械,而且每台机器都不一样。
- gTTS 把文字发送到谷歌翻译的语音服务并保存为 MP3。声音更清晰,但需要联网,只能选择语言和口音而不能选择音色,而且它是非官方接口,随时可能失效。
- Google、Amazon、Microsoft 或 ElevenLabs 的云端 API 音质很好,但需要账号和密钥,按字符计费,而且每段文字都会发送给服务商。
- Supertonic 3、Kokoro、Piper 等本地神经网络模型在您自己的 CPU 或 GPU 上运行。模型下载一次后即可离线工作,没有按字符的费用,听起来也比系统音色自然得多。我们的对比页面有详细介绍。
安装 SuperClonica 引擎
引擎是一个 pip 包,分两个版本。任意 CPU(Windows、macOS 或 Linux,Python 3.10 及以上):python -m pip install superclonica-cpu。NVIDIA GPU(Windows 或 Linux,Python 3.11 及以上):python -m pip install superclonica-gpu-cuda。每个环境只安装其中一个,两者提供相同的 superclonica 模块。
GPU 版通过 pip 自带 CUDA 和 cuDNN,系统只需安装支持 CUDA 12 的 NVIDIA 驱动;没有可用的 GPU 时会自动改用 CPU。首次运行时,约 385 MB 的 Supertonic 3 模型会一次性下载到 ~/.cache/supertonic3。如需存放到其他位置,请设置 SUPERTONIC_CACHE_DIR。
第一个脚本
导入引擎,合成一句话并保存:from superclonica import Superclonica,然后 tts = Superclonica(),audio, sample_rate = tts.synthesize("Hello! This voice runs on my own computer.", voice="F1", lang="en", seed=7),最后 tts.save("hello.wav", audio)。模型自带 M1 至 M5、F1 至 F5 共十种音色,无需额外文件。
引擎只需创建一次并重复使用:加载需要几秒钟,之后每句话只需不到一秒。在我们的测试中,短句的中位耗时在 RTX 5070 Ti 上为 0.12 秒,在四线程的 Ryzen 7 5800X 上为 0.43 秒。
使用自定义音色
Supertonic 3 的音色是一个约 0.3 MB 的 JSON 文件。带试听样本的免费音色放在 GitHub 的 superclonica/supertonic-voices 仓库中,SuperClonica 目录里还有 170 多种音色,从游戏角色到旁白应有尽有,每种都可以免费在线试听。
用文件代替预设名称:tts.synthesize("Good morning!", voice="ciri.json", lang="en", seed=7)。命令行:superclonica --text "Good morning!" --voice ciri.json --lang en --output morning.wav。每种音色都能说模型支持的全部 31 种语言;lang 填写文本的语言,例如 en、de、ja 或 ru。不支持中文。
长文本、对话和文件格式
几个选项就能满足大多数实际项目。
- 长文本(例如一整章)可以一次调用传入:引擎会把它切成不超过 160 个字符的自然片段,避免重复或吞字。
- normalize=True 会把响度统一到 −18 LUFS,便于拼接大量文件。
- tts.synthesize_batch() 可一次合成多行,每行使用自己的音色,例如对话的台词;结果保持输入顺序。
- 相同的文本、音色和随机种子会再次得到相同的音频,因此可以只重做某一行而不影响其他行。
- 数字会读成单词,常见的聊天缩写会展开,表情符号和未知符号会被清理,而不会导致报错。
- tts.save() 根据文件扩展名写出 WAV、FLAC 或 OGG。
作为本地 HTTP API 使用
如果需要语音的程序不是用 Python 写的,可以在 Docker 中运行引擎:docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu;在 NVIDIA GPU 上使用 cuda 标签并加上 --gpus all。模型会在首次启动时下载到数据卷中。
向 POST /synthesize 发送包含文本、语言和音色文件内容的 JSON,即可收到 WAV。一个音色约 0.3 MB,因此请把请求写进文件,再用 curl -d @request.json 发送。
许可与负责任的使用
Supertonic 3 采用 OpenRAIL-M 许可,这是一种免版税许可,列出了禁止用途,而不是禁止商用的条款。请勿在未经同意的情况下用语音冒充他人、欺骗或骚扰,并在必要时说明音频由机器生成。
目录中的部分音色受知名人物启发。它们不是本人的真实声音,因此不要把这类音频说成是本人的真实言论。