手把手教你用Python打造一個語音合成系統(tǒng)
/前言/
???平時我們聊天的時候,也許會想著錄制一些自己的聲音,而且還想有點特色,也就是所謂的變聲,今天我們要說的就是這個變聲器的制作,說的高大上點就是語音合成系統(tǒng)。
????這個語音合成系統(tǒng),能實現(xiàn)個性化語音的錄制與存儲。
/軟件依賴/
使用sublime text 3 開發(fā),申請百度開放平臺賬號進(jìn)行開發(fā)。
/具體實現(xiàn)/
1、打開百度開放這平臺創(chuàng)建一個應(yīng)用拿到關(guān)鍵參數(shù),如圖所示:

2、因為我們使用Python開發(fā)一款智能語音合成系統(tǒng),所以需要Python SDK ,可以在下圖中找到:

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

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

5、之后如下圖所示:

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

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

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

小伙伴們,是不是覺得很簡潔大氣呢?
3、綁定下拉列表框事件
在這里,我們需要對如何獲取下拉列表框的選項要了解。言歸正傳,直接上代碼:
def go(self,*arg): # *arg是為了接受多個如同列表的參數(shù),還有個**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()=='請選擇-----':self.tt.delete('1.0','end') #清除多行文本框的內(nèi)容elif self.cb.get()=='甜美型': #獲取下拉列表框的選項來設(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)容的大小并生成文件
百度語音api里有個限制,就是單個音頻生成是有限制的,不能超過1024字節(jié)。鑒于此,所以需要在這里做個判斷:
def sc(self):self.go() #引入go函數(shù),不然下面的self.res 沒法調(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: #判斷長度是否超過1024messagebox.showerror(title = '出錯了!',message='^_^最多不超過1024個字節(jié)^_^')else:if not os.path.exists(ab): #如果沒有這個文件則創(chuàng)建with open(ab,'wb') as f:f.write(self.res) #將音頻信息寫入到文件#生成結(jié)束給一個提示messagebox.showinfo(title = '完畢!', message='生成完畢,文件在程序目錄下')else:messagebox.showerror(title='出錯了!',message='文件名已存在') #有這個文件就提示
5、接下來,我們只需將這幾個功能寫入到一個類中即可,然后啟動這個類。
play()6、當(dāng)我輸入一段話后,大家可以看到它就生成了一個音頻文件。而且讀取的時候和我們輸入的內(nèi)容一模一樣,比如我輸入一段代碼,見下圖:

7、之后會得到下圖所示的情形。

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

完美收工,哈哈哈!
/小結(jié)/
1、本文基于Python編程語言,結(jié)合百度開放平臺,通過調(diào)用其接口,打造了一款簡易的語音合成系統(tǒng),方法行之有效,歡迎小伙伴們積極嘗試。
2、需要本文代碼的小伙伴可以在后臺回復(fù)“語音合成”四個字進(jìn)行獲取。
??? 想學(xué)習(xí)更多關(guān)于Python的知識,可以參考學(xué)習(xí)網(wǎng)址:http://pdcfighting.com/,點擊閱讀原文,可以直達(dá)噢~
-------------------?End?-------------------
PS:公號內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起?100 天計劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點一下,如果感覺文章內(nèi)容不錯的話,記得分享朋友圈讓更多的人知道!


【神秘禮包獲取方式】
