在 C# 和 .NET 中离线实现文字转语音
在 C# 中发声的经典方式是 System.Speech:几行代码、Windows 的声音、无需联网。它至今仍能用,但只支持 Windows,声音听起来过时,而且每台机器都不一样。云服务音质更好,却要把每段文字发出去,并按字收费。请注意:Supertonic 3 暂不支持中文,可朗读英语、日语、韩语等 31 种语言。
本指南介绍第三条路:把免费的 SuperClonica 引擎作为本地 HTTP 服务器运行,Windows、Linux 或 macOS 上的任何 .NET 应用都能调用,声音自然,WAV 文件留在你手里。
从 .NET 发声的三种方式
在 Windows 上快速做原型,用 System.Speech 就够了;要在各处听起来一致的产品声音,请用引擎。
- System.Speech:Windows 内置、离线、声音机械,仅限 Windows。
- 云端语音 API:声音自然,但需要账号、密钥、按字计费,文字还会存到对方服务器上。
- SuperClonica:本地服务器,支持自然声音、角色声音和自定义声音,离线运行,任何能运行 Docker 的系统都可用。
- 它支持 31 种语言,暂不支持中文。
免费试听声音
写代码之前,先打开任意声音页面,输入 30 到 100 个字符的句子,选择语言并点击生成按钮。几秒后就能听到你的应用可以拥有的声音,无需注册。
启动语音服务器
有 NVIDIA 显卡时用 cuda 镜像会更快,但不是必需的。
- 在任何 CPU 上启动服务器:docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu。
- 首次启动会把约 385 MB 的 Supertonic 3 模型下载到卷中;GET /health 可以告诉你何时就绪。
- POST /synthesize 接收包含 text、voice、lang、seed 和 normalize 的 JSON,返回 16 位单声道 WAV。
- voice 可以是 M1–M5、F1–F5 等标准名称,也可以是声音文件的 JSON 内容。
从 C# 调用
借助 System.Net.Http、System.Text 和 System.Text.Json.Nodes,在 .NET 6 或更新版本中几行代码就能发出请求:using var http = new HttpClient(); var voice = JsonNode.Parse(File.ReadAllText("voice.json")); var body = new JsonObject { ["text"] = "Hello from C#!", ["voice"] = voice, ["lang"] = "en", ["seed"] = 7 }; var res = await http.PostAsync("http://localhost:8000/synthesize", new StringContent(body.ToJsonString(), Encoding.UTF8, "application/json")); File.WriteAllBytes("hello.wav", await res.Content.ReadAsByteArrayAsync()); 使用标准声音时,把 ["voice"] 设为 "F1",无需加载文件。同样的文字、声音和 seed 总是得到同样的音频,所以请缓存重复短语的文件,并用应用中已有的音频库播放。
上线前的好习惯
在应用的整个生命周期中只使用一个 HttpClient。不要把 8000 端口原样暴露到互联网:设置 SUPERCLONICA_API_KEY 并以 Bearer 令牌发送,或把服务器放在私有网络中。如果同时到达的请求很多,用 SUPERCLONICA_LANES 运行更多模型副本,并在你的硬件上实测:在我们的测试中,短句在 RTX 5070 Ti 上耗时 0.12 秒,在四个 CPU 线程上耗时 0.43 秒。