Python打造一個語音合成系統,人人都是喬碧蘿!

平時我們聊天的時候,也許會想著錄製一些自己的聲音,而且還想有點特色,也就是所謂的變聲,今天我們要說的就是這個變聲器的製作,說的高大上點就是語音合成系統。

這個語音合成系統,能實現個性化語音的錄製與儲存。

軟體依賴

使用sublime text 3 開發,申請百度開放平臺賬號進行開發。

具體實現

1、開啟百度開放這平臺建立一個應用拿到關鍵引數,如圖所示:

2、因為我們使用Python開發一款智慧語音合成系統,所以需要Python SDK ,可以在下圖中找到:

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

4、然後建立一個應用,步驟依次如下圖所示:

5、之後如下圖所示:

6、再按照下圖所示進行操作:

7、這樣就拿到了三個重要的引數:

APP_ID:應用id

API_KEY:應用鑰匙

SECRET_KEY:安全碼

拿到以上關鍵引數之後,接下來就可以開始淦了!

下載和配置百度語音客戶端

1、下載百度Python api

pipinstall  baidu-aip

2、配置百度語音客戶端,具體步驟如下。

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的網路請求引數(一般不需要配置),可以在構造AipSpeech之後呼叫介面設定引數,目前只支援以下引數:

5、建立連結,生成音訊檔案,如下圖所示。

6、可以看出,成功生成音訊檔案會返回二進位制檔案流。這樣還只是生成一個最簡單的音訊檔案,我們還可以將他生成多種聲音,引數如下表所示:

這就是人工智慧中的語音合成技術,呼叫百度的SDK,只用了幾分鐘,就完成了一年的開發量。

7、當然有失敗就避免不了成功,一般請求失敗會有這幾種情況:

1)錯誤返回格式

若請求錯誤,伺服器將返回的JSON文字包含以下引數:

error_code

:錯誤碼。

error_msg

:錯誤描述資訊,幫助理解和解決發生的錯誤。

2)錯誤碼

看到上面這些引數是不是想躍躍欲試了了。哈哈,那就趕緊解放我們的雙手吧!

程式實現

因為我們是要將它打造成一個語音合成的系統,所以當然得有介面才好看,具體實現如下。

1、編寫程式主介面,具體程式碼實現如下。

class play:    def __init__(self):

self。root=tk。Tk() #初始化視窗

self。root。title(“語音合成系統”) #視窗名稱

self。root。geometry(“700x700”) #設定視窗大小

self。root。resizable(width=True,height=True)#設定視窗是否可變,寬不可變,高可變,預設為True      self。lb=tk。Label(self。root,text=‘請選擇語音型別’)#標籤

self。tt=tk。Text(self。root,width=80,height=30) #多行文字框

self。cb=ttk。Combobox(self。root, width=12)  #下拉列表框

#設定下拉列表框的內容

self。cb[‘values’]=(‘請選擇——-’,‘甜美型’,‘蘿莉型’,‘大叔型’,‘精神小夥型’)

self。cb。current(0)    #將當前選擇狀態置為0,也就是第一項

self。cb。bind(“<>”,self。go)

#繫結go函式,然後觸發事件

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是為了接受多個如同列表的引數,還有個**kwarg能接受如同字典的引數        #百度api

self。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’) #清除多行文字框的內容

elif self。cb。get()==‘甜美型’:   #獲取下拉列表框的選項來設定不同的音,下同           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。res

elif 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。res

elif 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、判斷內容的大小並生成檔案

百度語音api裡有個限制,就是單個音訊生成是有限制的,不能超過1024位元組。鑑於此,所以需要在這裡做個判斷:

def sc(self):

self。go() #引入go函式,不然下面的self。res 沒法呼叫

aa=self。tt。get(‘0。0’,‘end’)

#多行文字框內容為空

ab=os。path。dirname(sys。argv[0])+os。sep+self。e。get()+‘。mp3’#檔名的地址,與程式同目錄

if len(aa)>=1024: #判斷長度是否超過1024

messagebox。showerror(title = ‘出錯了!’,message=‘^_^最多不超過1024個位元組^_^’)

else:

if not os。path。exists(ab): #如果沒有這個檔案則建立

with open(ab,‘wb’) as f:

f。write(self。res)  #將音訊資訊寫入到檔案

#生成結束給一個提示

messagebox。showinfo(title = ‘完畢!’,

message=‘生成完畢,檔案在程式目錄下’)

else:

messagebox。showerror(title=‘出錯了!’,

message=‘檔名已存在’) #有這個

6、當我輸入一段話後,大家可以看到它就生成了一個音訊檔案。而且讀取的時候和我們輸入的內容一模一樣,比如我輸入一段程式碼,見下圖:

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

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

完美收工,哈哈哈!

小結

1、本文基於Python程式語言,結合百度開放平臺,透過呼叫其介面,打造了一款簡易的語音合成系統,方法行之有效,歡迎小夥伴們積極嘗試。

很多小夥伴在學習python的時候總會遇到一些問題和瓶頸,沒有方向感,不知道該從哪裡入手去提升,對此我整理了一些資料,希望能夠去幫助到小夥伴們,可以關注小編,並在後臺私信小編:“資料”即可領取。

相關文章