關(guān)于作息問題
自從開始公眾號寫作议慰,作息問題就成了一件讓人很頭大的事情,相對平時學(xué)習(xí)時間的基礎(chǔ)上奴曙,每天需要再多抽出來至少兩個小時進(jìn)行公眾號寫作别凹,這些時間只能從睡眠中擠出來。別人研究怎么碎片化學(xué)習(xí)洽糟,我現(xiàn)在每天盤算的是怎么碎片化打盹炉菲。不知道該怎么解決作息的問題,好苦惱....
文本轉(zhuǎn)語音
如果把Python比喻成游戲中的一個英雄坤溃,你覺得它是誰拍霜?對于Dota老玩家來說,我會想到鋼琴手卡爾薪介!感覺Python和卡爾一樣祠饺,除了生孩子什么都可以做的角色。日常生活中汁政,我們會涉及到很多語音播報的場景道偷,比如郭德綱版的高德地圖導(dǎo)航、超市門口的紅外感知提醒歡迎光臨记劈、銀行的自助叫號系統(tǒng)勺鸦,等等...今天就和大家聊聊Python文本轉(zhuǎn)語音,看看這些從青銅到王者的模塊目木。
青銅-pywin32
通過pip install pywin32
安裝模塊换途,pywin32是個萬金油的模塊,太多的場景使用到它刽射,但在文本轉(zhuǎn)語音上军拟,它卻是個青銅玩家,簡單無腦但效果不好誓禁。代碼示例:
import win32com.client
speaker = win32com.client.Dispatch("SAPI.SpVoice")
speaker.Speak("一天什么時候最安全懈息?中午,因為早晚會出事...")
因為這個模塊使用了很多次现横,自信執(zhí)行漓拾,結(jié)果報錯了....
Traceback (most recent call last):
File "D:\Python37\lib\site-packages\win32com\client\dynamic.py", line 89, in _GetGoodDispatch
IDispatch = pythoncom.connect(IDispatch)
pywintypes.com_error: (-2147221005, '無效的類字符串', None, None)
這個模塊之前在公司和家里筆記本用過很多次的,怎么會報錯呢戒祠?一臉懵逼...結(jié)果查了半天發(fā)現(xiàn)骇两,代碼在調(diào)用語音識別組件的時候報錯了。
打開控制面板發(fā)現(xiàn)語音識別組件我的臺式機(jī)電腦沒有姜盈,原來現(xiàn)在很多GHOST版WIN系統(tǒng)為了精簡體積都去除了語音識別組件低千,所以在安裝語音朗讀語音叫號類軟件時,都不能正常發(fā)音。本來這種青銅小選手示血,像我這種王者級別的不羞于為伍棋傍,但既然是模塊介紹還是確定下到底是不是這個問題吧。網(wǎng)上找了一個語音識別的TTSwidnows補(bǔ)丁包安裝了一下难审,再次執(zhí)行成功瘫拣。如果跟我存在一樣問題的選手,可以網(wǎng)上搜索安裝一下告喊。下載補(bǔ)丁包執(zhí)行bat文件一鍵無腦安裝麸拄。
為什么說這個模塊是青銅,因為太無腦了黔姜,你填寫文本它默認(rèn)輸出拢切,沒有任何可配置的地方,而且語音生硬...
白銀-pyttsx3
pyttsx3 is a text-to-speech conversion library in Python.
Unlike alternative libraries, it works offline, and is compatible with both Python 2 and 3.
- SAPI5 on Windows XP and Windows Vista and Windows 8,8.1 , 10
- NSSpeechSynthesizer on Mac OS X 10.5 (Leopard) and 10.6 (Snow Leopard)
- espeak on Ubuntu Desktop Edition 8.10 (Intrepid), 9.04 (Jaunty), and 9.10 (Karmic)
pyttsx3使用pyttsx移植過來的,因為pyttsx不支持python3...針對不同的系統(tǒng),模塊會自動所有系統(tǒng)對應(yīng)的語音驅(qū)動秆吵,前提是你的系統(tǒng)存在該驅(qū)動...
它依賴pywin32模塊淮椰,可以說它時針對無腦的pywin32接口,進(jìn)行了升級的個性化配置主穗。先來看下最簡單的使用:
import pyttsx3
engine = pyttsx3.init()
engine.say("明天你好爷肝,我叫干不倒音瓷!")
engine.runAndWait()
代碼初始化模塊后纵竖,填寫你所需轉(zhuǎn)化的文本靡砌,之后執(zhí)行runAndWait方法完成語音轉(zhuǎn)化厕宗。再來看看其相關(guān)操作:
事件監(jiān)聽
import pyttsx3
def onStart(name):
print('starting', name)
def onWord(name, location, length):
print('word', name, location, length)
def onEnd(name, completed):
print('finishing', name, completed)
engine = pyttsx3.init()
engine.connect('started-utterance', onStart)
engine.connect('started-word', onWord)
engine.connect('finished-utterance', onEnd)
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()
中斷話語
import pyttsx3
def onWord(name, location, length):
print 'word', name, location, length
if location > 10:
engine.stop()
engine = pyttsx3.init()
engine.connect('started-word', onWord)
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()
改變聲音
import pyttsx3
engine = pyttsx3.init()
voices = engine.getProperty('voices')
for voice in voices:
engine.setProperty('voice', voice.id)
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()
改變語速
import pyttsx3
engine = pyttsx3.init()
rate = engine.getProperty('rate')
engine.setProperty('rate', rate+50)
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()
改變音量
import pyttsx3
engine = pyttsx3.init()
volume = engine.getProperty('volume')
engine.setProperty('volume', volume-0.25)
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()
運(yùn)行驅(qū)動程序事件循環(huán)
import pyttsx3
engine = pyttsx3.init()
def onStart(name):
print 'starting', name
def onWord(name, location, length):
print 'word', name, location, length
def onEnd(name, completed):
print 'finishing', name, completed
if name == 'fox':
engine.say('What a lazy dog!', 'dog')
elif name == 'dog':
engine.endLoop()
engine = pyttsx3.init()
engine.connect('started-utterance', onStart)
engine.connect('started-word', onWord)
engine.connect('finished-utterance', onEnd)
engine.say('The quick brown fox jumped over the lazy dog.', 'fox')
engine.startLoop()
使用外部事件循環(huán)
import pyttsx3
engine = pyttsx3.init()
engine.say('The quick brown fox jumped over the lazy dog.', 'fox')
engine.startLoop(False)
# engine.iterate() must be called inside externalLoop()
externalLoop()
engine.endLoop()
模塊總體配置就是這些乍丈,針對pywin32的封裝做的還是不錯的...
王者-百度語音識別api
百度語音識別api:baidu-aip
是百度開放的公共語音轉(zhuǎn)化服務(wù)请垛。只需要在百度注冊相關(guān)的app及秘鑰信息即可使用。
使用流程如下:
- 訪問語音合成-百度AI開放平臺:http://ai.baidu.com/tech/speech/tts
- 之后使用百度賬號即可登陸(沒有百度賬號的礼旅,自己注冊一個)
- 創(chuàng)建應(yīng)用,添加語音識別的功能饿自,并完成注冊
- 保存你的
app_id, API_Key, Secret_Key
三項數(shù)據(jù)留著后續(xù)使用 - 切換回語音合成首頁汰翠,點(diǎn)擊立即使用旁邊的技術(shù)文檔按鈕,進(jìn)入API文檔
-
定位 語音合成-->SDK文檔-->Python SDK昭雌,即可看到詳細(xì)的開發(fā)文檔說明
接下來复唤,我們看看文檔中的相關(guān)說明:
- 接口描述
基于該接口,開發(fā)者可以輕松的獲取語音合成能力 - 請求說明
合成文本長度必須小于1024字節(jié)城豁,如果本文長度較長苟穆,可以采用多次請求的方式。文本長度不可超過限制
舉例,要把一段文字合成為語音文件:
from aip import AipSpeech
""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
result = client.synthesis('你好百度', 'zh', 1, {
'vol': 5,
})
# 識別正確返回語音二進(jìn)制 錯誤則返回dict 參照下面錯誤碼
if not isinstance(result, dict):
with open('auido.mp3', 'wb') as f:
f.write(result)
在上面代碼中雳旅,常量APP_ID在百度云控制臺中創(chuàng)建跟磨,常量API_KEY與SECRET_KEY是在創(chuàng)建完畢應(yīng)用后,系統(tǒng)分配給用戶的攒盈,均為字符串抵拘,用于標(biāo)識用戶,為訪問做簽名驗證型豁,可在AI服務(wù)控制臺中的應(yīng)用列表中查看僵蛛。
參數(shù) | 類型 | 描述 | 是否必須 |
---|---|---|---|
text | String | 合成的文本,使用UTF-8編碼迎变,請注意文本長度必須小于1024字節(jié) | 是 |
cuid | String | 用戶唯一標(biāo)識充尉,用來區(qū)分用戶,填寫機(jī)器 MAC 地址或 IMEI 碼衣形,長度為60以內(nèi) | 否 |
speed | String | 語速驼侠,取值0-9,默認(rèn)為5中語速 | 否 |
pit | String | 音調(diào)谆吴,取值0-9倒源,默認(rèn)為5中語調(diào) | 否 |
vol | String | 音量,取值0-15句狼,默認(rèn)為5中音量 | 否 |
per | String | 發(fā)音人選擇, 0為女聲笋熬,1為男聲,3為情感合成-度逍遙腻菇,4為情感合成-度丫丫胳螟,默認(rèn)為普通女 | 否 |
相比于前兩種模塊,baidu-aip卻是高端很多啊...喜歡的朋友可以下載了玩玩筹吐,感興趣的朋友可以看看我之前發(fā)表的文章使用Python將任正非400+篇演講批量轉(zhuǎn)化為語音http://www.reibang.com/p/05f9874b6989
The End
OK,今天的內(nèi)容就到這里旺隙,如果覺得內(nèi)容對你有所幫助,歡迎點(diǎn)擊文章右下角的“在看”骏令。
期待你關(guān)注我的公眾號清風(fēng)Python
,如果覺得不錯垄提,希望能動動手指轉(zhuǎn)發(fā)給你身邊的朋友們榔袋。
希望每周一至五清晨的7點(diǎn)10分,都能讓清風(fēng)Python的知識文章叫醒大家铡俐!謝謝……