Pygame 文字转语音:用自然的声音
Pygame 是很多人写第一个游戏的地方,迟早会有角色需要开口说话。pyttsx3 用的是机械的系统声音,云端 API 又需要密钥和网络,而学校电脑或 Game Jam 的笔记本未必具备。请注意:Supertonic 3 暂不支持中文,角色可以说英语、日语、韩语等 31 种语言。
SuperClonica 引擎本身就是一个 Python 包,因此 Pygame 项目可以自己离线生成自然的语音,并通过 pygame.mixer 直接播放,无需读写文件。本指南介绍代码、如何在生成语音时保持游戏流畅,以及什么时候应该改为分发音频文件。
让 Pygame 游戏说话的两种方法
运行时语音适合原型、工具和从源码运行的游戏;完成的游戏请分发音频文件。
- 运行时:游戏可以为任何文字(例如玩家名字)生成语音并立即播放。
- 预先生成的文件:开发时生成的台词,像普通音效一样用 pygame.mixer.Sound 加载。
- 两种方法使用相同的引擎、声音和语言;暂不支持中文。
- 全部在普通处理器上运行,无需显卡。
在线免费挑选声音
在任意声音页面输入角色的一句台词,30 到 100 个字符,选择语言并点击生成按钮。几秒后就能听出声音是否合适,无需注册。
在游戏运行时生成台词
加载引擎需要几秒钟,所以请在启动时创建一次,而不是每句台词都创建。
- 安装两个包:python -m pip install superclonica-cpu pygame。
- 在 pygame.init() 之前把混音器设置为引擎的格式:pygame.mixer.init(frequency=44100, size=-16, channels=1)。
- 只创建一次引擎 tts = Superclonica(),然后生成并播放台词:audio, rate = tts.synthesize("Welcome, hero! The village needs you.", "M2", "en"); sound = pygame.mixer.Sound(array=(audio * 32767).astype(np.int16)); sound.play()。
- 引擎返回 44.1 kHz 的浮点采样,转换成 16 位整数就是 pygame 所需的全部处理。
保持游戏流畅
短句在台式机处理器上约需半秒,画面卡住会很明显。请在后台线程中生成语音,把生成好的 Sound 放进队列由主循环播放,或在关卡加载画面期间生成该关卡的台词。维护一个从文本到 Sound 的字典,重复的台词只生成一次。
发布游戏时
运行时语音需要玩家电脑上有引擎、约 385 MB 的模型和 Python:对于从源码运行的 Game Jam 作品没问题,但作为下载分发就太重了。正式发布的游戏请用 tts.save('line.ogg', audio) 提前生成所有台词,并随游戏附带 OGG 文件。请使用模型的十个标准声音 M1 至 M5 和 F1 至 F5,或用同意授权的说话人训练的你自己的声音;粉丝制作的角色声音适用于同人游戏和恶搞。