手把手教你用Python打造一個(gè)語(yǔ)音合成系統(tǒng)
回復(fù)“書(shū)籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書(shū)
/前言/
???平時(shí)我們聊天的時(shí)候,也許會(huì)想著錄制一些自己的聲音,而且還想有點(diǎn)特色,也就是所謂的變聲,今天我們要說(shuō)的就是這個(gè)變聲器的制作,說(shuō)的高大上點(diǎn)就是語(yǔ)音合成系統(tǒng)。
????這個(gè)語(yǔ)音合成系統(tǒng),能實(shí)現(xiàn)個(gè)性化語(yǔ)音的錄制與存儲(chǔ)。
/軟件依賴/
使用sublime text 3 開(kāi)發(fā),申請(qǐng)百度開(kāi)放平臺(tái)賬號(hào)進(jìn)行開(kāi)發(fā)。
/具體實(shí)現(xiàn)/
1、打開(kāi)百度開(kāi)放這平臺(tái)創(chuàng)建一個(gè)應(yīng)用拿到關(guān)鍵參數(shù),如圖所示:

2、因?yàn)槲覀兪褂肞ython開(kāi)發(fā)一款智能語(yǔ)音合成系統(tǒng),所以需要Python SDK ,可以在下圖中找到:

3、找到之后可以看看它的使用說(shuō)明。

4、然后創(chuàng)建一個(gè)應(yīng)用,步驟依次如下圖所示:

5、之后如下圖所示:

6、再按照下圖所示進(jìn)行操作:

7、這樣就拿到了三個(gè)重要的參數(shù):
APP_ID:應(yīng)用id
API_KEY:應(yīng)用鑰匙
SECRET_KEY:安全碼
拿到以上關(guān)鍵參數(shù)之后,接下來(lái)就可以開(kāi)始淦了!
/下載和配置百度語(yǔ)音客戶端/
1、下載百度Python api
pip install baidu-aip2、配置百度語(yǔ)音客戶端,具體步驟如下。
3、新建AipSpeech,代碼如下。
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)
4、配置AipSpeech。如果用戶需要配置AipSpeech的網(wǎng)絡(luò)請(qǐng)求參數(shù)(一般不需要配置),可以在構(gòu)造AipSpeech之后調(diào)用接口設(shè)置參數(shù),目前只支持以下參數(shù):
| 接口 | 說(shuō)明 |
|---|---|
| setConnectionTimeoutInMillis | 建立連接的超時(shí)時(shí)間(單位:毫秒 |
| setSocketTimeoutInMillis | 通過(guò)打開(kāi)的連接傳輸數(shù)據(jù)的超時(shí)時(shí)間(單位:毫秒) |
5、建立鏈接,生成音頻文件,如下圖所示。

6、可以看出,成功生成音頻文件會(huì)返回二進(jìn)制文件流。這樣還只是生成一個(gè)最簡(jiǎn)單的音頻文件,我們還可以將他生成多種聲音,參數(shù)如下表所示:
| 參數(shù) | 類型 | 描述 | 是否必須 |
|---|---|---|---|
| text | String | 合成的文本,使用UTF-8編碼, 請(qǐng)注意文本長(zhǎng)度必須小于1024字節(jié) | 是 |
| cuid | String | 用戶唯一標(biāo)識(shí),用來(lái)區(qū)分用戶, 填寫機(jī)器 MAC 地址或 IMEI 碼,長(zhǎng)度為60以內(nèi) | 否 |
| spd | String | 語(yǔ)速,取值0-9,默認(rèn)為5中語(yǔ)速 | 否 |
| pit | String | 音調(diào),取值0-9,默認(rèn)為5中語(yǔ)調(diào) | 否 |
| vol | String | 音量,取值0-15,默認(rèn)為5中音量 | 否 |
| per | String | 發(fā)音人選擇, 0為女聲,1為男聲, 3為情感合成-度逍遙,4為情感合成-度丫丫,默認(rèn)為普通女 | 否 |
????這就是人工智能中的語(yǔ)音合成技術(shù),調(diào)用百度的SDK,只用了幾分鐘,就完成了一年的開(kāi)發(fā)量。
7、當(dāng)然有失敗就避免不了成功,一般請(qǐng)求失敗會(huì)有這幾種情況:
1)錯(cuò)誤返回格式
若請(qǐng)求錯(cuò)誤,服務(wù)器將返回的JSON文本包含以下參數(shù):
error_code:錯(cuò)誤碼。
error_msg:錯(cuò)誤描述信息,幫助理解和解決發(fā)生的錯(cuò)誤。
2)錯(cuò)誤碼
| 錯(cuò)誤碼 | 含義 |
|---|---|
| 500 | 不支持的輸入 |
| 501 | 輸入?yún)?shù)不正確 |
| 502 | token驗(yàn)證失敗 |
| 503 | 合成后端錯(cuò)誤 |
????看到上面這些參數(shù)是不是想躍躍欲試了了。哈哈,那就趕緊解放我們的雙手吧!
/程序?qū)崿F(xiàn)/
????因?yàn)槲覀兪且獙⑺蛟斐梢粋€(gè)語(yǔ)音合成的系統(tǒng),所以當(dāng)然得有界面才好看,具體實(shí)現(xiàn)如下。
1、編寫程序主界面,具體代碼實(shí)現(xiàn)如下。
class play:def __init__(self):self.root=tk.Tk() #初始化窗口self.root.title("語(yǔ)音合成系統(tǒng)") #窗口名稱self.root.geometry("700x700") #設(shè)置窗口大小self.root.resizable(width=True,height=True)#設(shè)置窗口是否可變,寬不可變,高可變,默認(rèn)為Trueself.lb=tk.Label(self.root,text='請(qǐng)選擇語(yǔ)音類型')#標(biāo)簽self.tt=tk.Text(self.root,width=80,height=30) #多行文本框self.cb=ttk.Combobox(self.root, width=12) #下拉列表框#設(shè)置下拉列表框的內(nèi)容self.cb['values']=('請(qǐng)選擇-----','甜美型','蘿莉型','大叔型','精神小伙型')self.cb.current(0) #將當(dāng)前選擇狀態(tài)置為0,也就是第一項(xiàng)self.cb.bind("<>" ,self.go) #綁定go函數(shù),然后觸發(fā)事件self.lb1=tk.Label(self.root,text='請(qǐng)輸入文件名:')self.e=tk.Entry(self.root,width=30,show=None, font=('Arial', 12)) #文本框self.b1=tk.Button(self.root, text='生成音頻文件', width=10,height=1,command=self.sc) #按鈕#各個(gè)組件的位置self.b1.place(x=200,y=520)self.lb.place(x=30,y=30)self.cb.place(x=154,y=30)self.e.place(x=130,y=490)self.lb1.place(x=30,y=490)self.tt.place(x=30,y=60)self.root.mainloop() #啟動(dòng)主頁(yè)面
這樣就算完成了程序的主界面了。
2、一起來(lái)看下它長(zhǎng)啥樣,如下圖所示:

小伙伴們,是不是覺(jué)得很簡(jiǎn)潔大氣呢?
3、綁定下拉列表框事件
在這里,我們需要對(duì)如何獲取下拉列表框的選項(xiàng)要了解。言歸正傳,直接上代碼:
def go(self,*arg): # *arg是為了接受多個(gè)如同列表的參數(shù),還有個(gè)**kwarg能接受如同字典的參數(shù)#百度apiself.APP_ID = '18386899'self.API_KEY = 'OcPQ4cGoGBRtW23jemKvgmU5'self.SECRET_KEY = 'n2rGtvq9HmOGxgxG8H9a5kqFOes8ggHx'self.client = AipSpeech(self.APP_ID,self.API_KEY,self.SECRET_KEY)#初始化端口建立連接if self.cb.get()=='請(qǐng)選擇-----':self.tt.delete('1.0','end') #清除多行文本框的內(nèi)容elif self.cb.get()=='甜美型': #獲取下拉列表框的選項(xiàng)來(lái)設(shè)置不同的音,下同self.res=self.client.synthesis(self.tt.get('0.0','end'),'zh',1,{'vol':3,'spd':3,'pit':4,'per':0})return self.res #返回音頻信息 ,下同elif self.cb.get()=='蘿莉型':self.res=self.client.synthesis(self.tt.get('0.0','end'),'zh',1,{'vol':2,'spd':2,'pit':3,'per':0})return self.reselif self.cb.get()=='大叔型':self.res=self.client.synthesis(self.tt.get('0.0','end'),'zh',1,{'vol':5,'spd':7,'pit':6,'per':1})return self.reselif self.cb.get()=='精神小伙型':self.res=self.client.synthesis(self.tt.get('0.0','end'),'zh',1,{'vol':7,'spd':8,'pit':8,'per':1})return self.res
4、判斷內(nèi)容的大小并生成文件
百度語(yǔ)音api里有個(gè)限制,就是單個(gè)音頻生成是有限制的,不能超過(guò)1024字節(jié)。鑒于此,所以需要在這里做個(gè)判斷:
def sc(self):self.go() #引入go函數(shù),不然下面的self.res 沒(méi)法調(diào)用aa=self.tt.get('0.0','end') #多行文本框內(nèi)容為空ab=os.path.dirname(sys.argv[0])+os.sep+self.e.get()+'.mp3'#文件名的地址,與程序同目錄if len(aa)>=1024: #判斷長(zhǎng)度是否超過(guò)1024messagebox.showerror(title = '出錯(cuò)了!',message='^_^最多不超過(guò)1024個(gè)字節(jié)^_^')else:if not os.path.exists(ab): #如果沒(méi)有這個(gè)文件則創(chuàng)建with open(ab,'wb') as f:f.write(self.res) #將音頻信息寫入到文件#生成結(jié)束給一個(gè)提示messagebox.showinfo(title = '完畢!', message='生成完畢,文件在程序目錄下')else:messagebox.showerror(title='出錯(cuò)了!',message='文件名已存在') #有這個(gè)文件就提示
5、接下來(lái),我們只需將這幾個(gè)功能寫入到一個(gè)類中即可,然后啟動(dòng)這個(gè)類。
play()6、當(dāng)我輸入一段話后,大家可以看到它就生成了一個(gè)音頻文件。而且讀取的時(shí)候和我們輸入的內(nèi)容一模一樣,比如我輸入一段代碼,見(jiàn)下圖:

7、之后會(huì)得到下圖所示的情形。

8、最后的效果如下圖所示。

完美收工,哈哈哈!
/小結(jié)/
1、本文基于Python編程語(yǔ)言,結(jié)合百度開(kāi)放平臺(tái),通過(guò)調(diào)用其接口,打造了一款簡(jiǎn)易的語(yǔ)音合成系統(tǒng),方法行之有效,歡迎小伙伴們積極嘗試。
2、需要本文代碼的小伙伴可以在后臺(tái)回復(fù)“語(yǔ)音合成”四個(gè)字進(jìn)行獲取。
??? 想學(xué)習(xí)更多關(guān)于Python的知識(shí),可以參考學(xué)習(xí)網(wǎng)址:http://pdcfighting.com/,點(diǎn)擊閱讀原文,可以直達(dá)噢~
-------------------?End?-------------------
往期精彩文章推薦:
手把手教你用Python網(wǎng)絡(luò)爬蟲(chóng)獲取壁紙圖片
手把手用Python教你如何發(fā)現(xiàn)隱藏wifi
手把手教你使用Python網(wǎng)絡(luò)爬蟲(chóng)獲取音效信息

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說(shuō)一兩句吧~~
