Swift iOS 文字转语音:用自然的声音
在 iOS 上,文字转语音从 AVSpeechSynthesizer 开始:几行 Swift 代码,手机就能用内置声音离线免费地朗读任何文字。但这些声音取决于用户安装了什么,而且和其他所有应用用的是同一批声音。请注意:Supertonic 3 暂不支持中文。
免费的 SuperClonica 引擎能让 iOS 或 macOS 应用拥有自己的自然声音,方式有两种:预先生成并打包进应用的音频文件,或由应用调用的语音服务器。本指南用现成的 Swift 代码演示两种方式,并说明什么时候 AVSpeechSynthesizer 仍然是合适的工具。
让 iOS 应用说话的三种方式
许多应用会组合使用:界面用打包的台词,用户文字用服务器,系统声音作为备用。
- AVSpeechSynthesizer:系统声音,离线免费,取决于用户安装的内容。
- 打包的音频:固定台词用 SuperClonica 生成一次,随应用发布。
- 语音服务器:应用把文字发送到你的 SuperClonica 服务器,并播放返回的 WAV。
- SuperClonica 支持 31 种语言,暂不支持中文。
在线免费挑选声音
在任意声音页面输入应用中的一句台词,30 到 100 个字符,选择语言并点击生成按钮。几秒后就能听出是否合适,无需注册,在 iPhone 上即可完成。
打包预生成的台词
打包的文件离线可用、没有延迟;修改则需要发布新版本。
- 在 Mac 上用引擎生成每句台词:python -m pip install superclonica-cpu,然后 superclonica --text "Welcome back!" --voice F1 --lang en --output welcome.mp3。
- 把文件加入 Xcode 项目,使其复制到应用包中。
- 用 AVFoundation 播放:player = try AVAudioPlayer(contentsOf: Bundle.main.url(forResource: "welcome", withExtension: "mp3")!); player.play()
- 请把 player 保存为类的属性:局部的 AVAudioPlayer 一旦被释放就会停止播放。
调用你自己的语音服务器
在你能控制的机器上运行服务器:docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu。iOS 默认要求 HTTPS,因此请把它放在证书之后,并设置 SUPERCLONICA_API_KEY,只让你的应用使用。这样一句台词就是一次请求:var request = URLRequest(url: URL(string: "https://tts.example.com/synthesize")!); request.httpMethod = "POST"; request.setValue("application/json", forHTTPHeaderField: "Content-Type"); request.httpBody = try JSONEncoder().encode(["text": "Your order is on its way.", "voice": "F1", "lang": "en"]); let (data, _) = try await URLSession.shared.data(for: request); player = try AVAudioPlayer(data: data); player.play() 请用 Authorization 请求头附上密钥,并缓存重复台词的数据。
什么时候 AVSpeechSynthesizer 就够了
当声音只需要听懂时,AVSpeechSynthesizer 就够了:朗读通知、无障碍辅助、原型,或必须完全离线说话的应用。当声音是产品的一部分时,请选 SuperClonica:语言老师、游戏角色、冥想引导,或需要让每位用户都听到同样声音的品牌。