TTS (讀屏)語(yǔ)速急速調(diào)節(jié)
TTS(Text-to-Speech,即文本到語(yǔ)音)技術(shù)是將文本信息轉(zhuǎn)化為可聽(tīng)的語(yǔ)音輸出的技術(shù)。本文重點(diǎn)關(guān)注 TTS 在輔助盲人和視障人士閱讀文本相關(guān)領(lǐng)域。
背景
前幾天在 B 站刷到一個(gè)視頻《【諾子】盲人是如何做飯的?看不見(jiàn)也絕對(duì)安全的微波爐料理!》。UP 主是一位盲人。注意到她晚上還會(huì)直播,感覺(jué)比較好奇,就去看了一下。
她直播是用彈幕機(jī)讀觀眾發(fā)的彈幕,然后與觀眾互動(dòng)的??戳艘粫?huì)兒,正好聊天彈幕機(jī)語(yǔ)速有點(diǎn)慢,經(jīng)常會(huì)堆積彈幕。
此時(shí)程序員內(nèi)心戲:隨便找個(gè) TTS 庫(kù),分分鐘搞定。
需求
可能大家不是很能理解要求提高語(yǔ)速是個(gè)什么概念。這里先給兩段最終效果展示。
默認(rèn) pyttsx3 語(yǔ)速上限。(UP 主覺(jué)得也有點(diǎn)慢)
【后續(xù)看情況補(bǔ)充音頻吧】
朗讀的內(nèi)容:這是 pyttsx 3 SAPI 5 最快速度朗讀,一般人稍微習(xí)慣一下,應(yīng)該就可以聽(tīng)清朗讀的內(nèi)容了。
下面是急速版最快速度朗讀的效果。
【后續(xù)看情況補(bǔ)充音頻吧】
朗讀的內(nèi)容:這是六倍速,滿速朗讀的效果,我相信一般沒(méi)有經(jīng)過(guò)訓(xùn)練的人,是聽(tīng)不清朗讀內(nèi)容的。
這次的目標(biāo)就是實(shí)現(xiàn)支持六倍速朗讀的方案。
調(diào)研
俗話說(shuō),人生苦短,我用 Python。那就開(kāi)干吧。開(kāi)始各種嘗試
Paddlespeech: 這個(gè) tts 庫(kù)應(yīng)該挺出名的,但是需要安裝 CUDA。應(yīng)該是用了深度學(xué)習(xí)。想想在 UP 主的環(huán)境下安裝 CUDA 就不太現(xiàn)實(shí),后面就不考慮神經(jīng)網(wǎng)絡(luò)的版本了。
互聯(lián)網(wǎng)廠家 SDK: 像百度,訊飛等,都有自己的 SDK 。大概嘗試了一下(其實(shí)沒(méi)有成功)。想著在線版需要云端處理,延時(shí)上可能不太能接受。離線版又一直沒(méi)能成功。就也沒(méi)考慮了。
eSpeak NG:是一個(gè)自帶語(yǔ)音庫(kù)的 TTS 開(kāi)源版本。體驗(yàn)就是,espeak 的中文語(yǔ)音庫(kù)可用性有點(diǎn)差。
pyttsx3: 這個(gè)庫(kù)倒是不錯(cuò),一上手就能用。語(yǔ)速也能調(diào)節(jié),就是語(yǔ)速上限不滿足需求。它使用的是 windows 系統(tǒng) SAPI 。
到這里,其實(shí)已經(jīng)感覺(jué)到這個(gè)需求的難度了??赡芎瓦@個(gè)需求比較小眾也有關(guān)系吧。要實(shí)現(xiàn)一個(gè)急速版 TTS 也是那么容易的。
調(diào)研讀屏軟件
想到的另一個(gè)方案就是,直接調(diào)用 UP 主現(xiàn)在正在使用的讀屏軟件。想著讀屏軟件已經(jīng)實(shí)現(xiàn)高語(yǔ)速了,我也就不用已再實(shí)現(xiàn)一次了。
爭(zhēng)渡讀屏:這也是 UP 主在用的讀屏軟件??戳艘幌抡糜?API。但是只有商業(yè)版支持 API。商業(yè)版現(xiàn)在要 1000 人民幣左右。
NVDA:這是一個(gè)開(kāi)源版本的讀屏工具。也有 API 支持。初看非常合適。但由于自身有讀屏功能,而 UP 主又同時(shí)在使用爭(zhēng)渡讀屏。會(huì)導(dǎo)致同時(shí)有兩個(gè)讀屏讀取屏幕上的內(nèi)容,會(huì)影響到其它功能的使用。
最終實(shí)現(xiàn)
雖然不能直接使用 NVDA ,但是 NVDA 開(kāi)源啊。并且確實(shí)可以急速朗讀,那就看 NVDA 源碼唄。
發(fā)現(xiàn),NVDA 調(diào)用的是 Windows 自帶的 Windows OneCore Voices SDK,具體來(lái)說(shuō)是 WinRT 下 Windows.Media.SpeechSynthesis 這個(gè)類(lèi)。
但是我 Windows 開(kāi)發(fā)比較少,經(jīng)過(guò)一番 C++, C# 的 WinRT 苦苦掙扎后,無(wú)意間發(fā)現(xiàn) Windows 官方有 winrt 的 python 庫(kù)。但是好像沒(méi)有維護(hù)了,不過(guò)有一個(gè)社區(qū)的 winsdk 還有維護(hù)。然后經(jīng)過(guò)一番調(diào)試,就成功實(shí)現(xiàn)了。
代碼量雖然不大吧,但“分分鐘”的事,卻花了差不多一周的時(shí)間,也是萬(wàn)萬(wàn)沒(méi)想到的。這么一個(gè)簡(jiǎn)單的需求,居然花了如此長(zhǎng)的時(shí)間。最后來(lái)附上一段樣例代碼,以及粉絲小企鵝幫忙給 UP 主做的彈幕機(jī) repo:?GitHub - xqe2011/danmuji