TTS (读屏)语速急速调节
TTS(Text-to-Speech,即文本到语音)技术是将文本信息转化为可听的语音输出的技术。本文重点关注 TTS 在辅助盲人和视障人士阅读文本相关领域。
背景
前几天在 B 站刷到一个视频《【诺子】盲人是如何做饭的?看不见也绝对安全的微波炉料理!》。UP 主是一位盲人。注意到她晚上还会直播,感觉比较好奇,就去看了一下。
她直播是用弹幕机读观众发的弹幕,然后与观众互动的。看了一会儿,正好聊天弹幕机语速有点慢,经常会堆积弹幕。
此时程序员内心戏:随便找个 TTS 库,分分钟搞定。
需求
可能大家不是很能理解要求提高语速是个什么概念。这里先给两段最终效果展示。
默认 pyttsx3 语速上限。(UP 主觉得也有点慢)
【后续看情况补充音频吧】
朗读的内容:这是 pyttsx 3 SAPI 5 最快速度朗读,一般人稍微习惯一下,应该就可以听清朗读的内容了。
下面是急速版最快速度朗读的效果。
【后续看情况补充音频吧】
朗读的内容:这是六倍速,满速朗读的效果,我相信一般没有经过训练的人,是听不清朗读内容的。
这次的目标就是实现支持六倍速朗读的方案。
调研
俗话说,人生苦短,我用 Python。那就开干吧。开始各种尝试
Paddlespeech: 这个 tts 库应该挺出名的,但是需要安装 CUDA。应该是用了深度学习。想想在 UP 主的环境下安装 CUDA 就不太现实,后面就不考虑神经网络的版本了。
互联网厂家 SDK: 像百度,讯飞等,都有自己的 SDK 。大概尝试了一下(其实没有成功)。想着在线版需要云端处理,延时上可能不太能接受。离线版又一直没能成功。就也没考虑了。
eSpeak NG:是一个自带语音库的 TTS 开源版本。体验就是,espeak 的中文语音库可用性有点差。
pyttsx3: 这个库倒是不错,一上手就能用。语速也能调节,就是语速上限不满足需求。它使用的是 windows 系统 SAPI 。
到这里,其实已经感觉到这个需求的难度了。可能和这个需求比较小众也有关系吧。要实现一个急速版 TTS 也是那么容易的。
调研读屏软件
想到的另一个方案就是,直接调用 UP 主现在正在使用的读屏软件。想着读屏软件已经实现高语速了,我也就不用已再实现一次了。
争渡读屏:这也是 UP 主在用的读屏软件。看了一下正好有 API。但是只有商业版支持 API。商业版现在要 1000 人民币左右。
NVDA:这是一个开源版本的读屏工具。也有 API 支持。初看非常合适。但由于自身有读屏功能,而 UP 主又同时在使用争渡读屏。会导致同时有两个读屏读取屏幕上的内容,会影响到其它功能的使用。
最终实现
虽然不能直接使用 NVDA ,但是 NVDA 开源啊。并且确实可以急速朗读,那就看 NVDA 源码呗。
发现,NVDA 调用的是 Windows 自带的 Windows OneCore Voices SDK,具体来说是 WinRT 下 Windows.Media.SpeechSynthesis 这个类。
但是我 Windows 开发比较少,经过一番 C++, C# 的 WinRT 苦苦挣扎后,无意间发现 Windows 官方有 winrt 的 python 库。但是好像没有维护了,不过有一个社区的 winsdk 还有维护。然后经过一番调试,就成功实现了。
代码量虽然不大吧,但“分分钟”的事,却花了差不多一周的时间,也是万万没想到的。这么一个简单的需求,居然花了如此长的时间。最后来附上一段样例代码,以及粉丝小企鹅帮忙给 UP 主做的弹幕机 repo: GitHub - xqe2011/danmuji