Kotlin Android 文字转语音:用自然的声音
Android 自带文字转语音:TextToSpeech 类用手机上安装的引擎朗读任何文字,离线且免费。但用户听到的声音取决于设备、引擎和已下载的语音包,所以同一个应用在每部手机上听起来都不一样。请注意:Supertonic 3 暂不支持中文。
免费的 SuperClonica 引擎能让 Android 应用在任何地方都使用同一个自然的声音,方式有两种:作为资源打包的预生成音频文件,或由应用调用的语音服务器。本指南用现成的 Kotlin 代码演示两种方式,并说明什么时候系统引擎仍是合适的工具。
让 Android 应用说话的三种方式
许多应用会组合使用:界面用资源,用户文字用服务器,系统引擎作为备用。
- TextToSpeech:手机上安装的引擎,离线免费,但声音因设备而异。
- raw 资源:固定台词用 SuperClonica 生成一次,随应用发布。
- 语音服务器:应用把文字发送到你的 SuperClonica 服务器,并播放返回的 WAV。
- SuperClonica 支持 31 种语言,暂不支持中文。
在线免费挑选声音
在任意声音页面输入应用中的一句台词,30 到 100 个字符,选择语言并点击生成按钮。几秒后就能听出是否合适,无需注册,在手机上即可完成。
把预生成的台词作为资源打包
资源离线可用、没有延迟;修改则需要发布新版本。
- 在电脑上用引擎生成每句台词:python -m pip install superclonica-cpu,然后 superclonica --text "Welcome back!" --voice F1 --lang en --output welcome.mp3。
- 把文件放进 res/raw;资源名只能包含小写字母、数字和下划线。
- 播放台词:MediaPlayer.create(context, R.raw.welcome).start()
- 播放结束后释放播放器,例如在 setOnCompletionListener 中。
调用你自己的语音服务器
在你能控制的机器上运行服务器:docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu。Android 默认阻止未加密的 HTTP,因此请把它放在 HTTPS 之后,并设置 SUPERCLONICA_API_KEY,只让你的应用使用。借助 OkHttp,一句台词就是一次请求,需在主线程之外执行,例如在 Dispatchers.IO 的协程中:val body = """{"text": "Your order is on its way.", "voice": "F1", "lang": "en"}""".toRequestBody("application/json".toMediaType()); val bytes = client.newCall(Request.Builder().url("https://tts.example.com/synthesize").post(body).build()).execute().body!!.bytes(); val file = File(cacheDir, "line.wav").apply { writeBytes(bytes) }; MediaPlayer().apply { setDataSource(file.path); prepare(); start() } 请用 Authorization 请求头附上密钥,并缓存重复台词的文件。
什么时候系统 TextToSpeech 就够了
当声音只需要听懂时,系统引擎就够了:朗读通知、无障碍辅助、原型,或必须完全离线说话的应用。当声音是产品的一部分时,请选 SuperClonica:语言老师、游戏角色、冥想引导,或需要在每部手机上听起来都一样的品牌。