Ruby 文字转语音:脚本与 Rails 应用
Ruby 没有自带的语音合成。脚本常常调用 Mac 上的 say 或 Linux 上的 espeak,声音很机械;Rails 应用则通常把每段文字发给按字数收费的云端 API。请注意:Supertonic 3 暂不支持中文,可朗读英语、日语、韩语等 31 种语言。
免费的 SuperClonica 引擎作为 HTTP 服务器运行在你的应用旁边,提供自然的声音,调用它只需要 Ruby 标准库。本指南介绍一个简单脚本、使用 Active Job 和 Active Storage 的 Rails 配置,以及在生产环境中安全使用的习惯。
Ruby 怎样说话
每个文本版本只生成一次音频并以文件提供,不要在每次请求时都合成。
- 系统声音:用 system() 调用 say 或 espeak;无需配置,但声音机械,而且每台机器都不同。
- 云端 API:声音自然,但需要密钥、按字数付费,文字还会发到别人的服务器上。
- SuperClonica:本地服务器,提供自然声音、角色声音和自定义声音;Ruby 发送 JSON,收到 WAV。
- 支持 31 种语言,暂不支持中文。
免费试听声音
写代码之前,先在任意声音页面输入一句 30 到 100 个字符的话,选择语言并点击生成按钮。几秒后就能听到你的应用可以拥有的声音,无需注册。
启动语音服务器
使用 NVIDIA 显卡和 cuda 镜像会更快,但普通处理器就足够了。
- 在同一台机器或私有机器上启动服务器: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。
- 默认每个请求最多 5,000 个字符(SUPERCLONICA_MAX_TEXT);长文本请按段落拆分。
从 Ruby 调用
不需要任何 gem:require "net/http"; require "json"; uri = URI("http://localhost:8000/synthesize"); res = Net::HTTP.post(uri, { text: "Hello from Ruby!", voice: "F1", lang: "en" }.to_json, "Content-Type" => "application/json"); File.binwrite("hello.wav", res.body) if res.is_a?(Net::HTTPSuccess)。使用目录中的声音时,请发送解析后的文件而不是标准名称:voice: JSON.parse(File.read("voice.json"))。如果应用已经在用 Faraday 或 HTTParty,用法相同。
Rails:后台任务与 Active Storage
在 Rails 中,请在 Active Job 而不是 Web 请求中生成语音,并把结果附加到记录上:post.audio.attach(io: StringIO.new(res.body), filename: "post-#{post.id}.wav", content_type: "audio/wav")。只在文本变化时重新生成。不要把 8000 端口暴露到互联网:在服务器上设置 SUPERCLONICA_API_KEY 并通过 Authorization: Bearer 请求头发送,或把服务器放在私有网络中。请告诉听众音频是生成的。