/前言/
平時我們聊天的時候,也許會想著錄製一些自己的聲音,而且還想有點特色,也就是所謂的變聲,今天我們要說的就是這個變聲器的製作,說的高大上點就是語音合成系統。
這個語音合成系統,能實現個性化語音的錄製與儲存。
/軟體依賴/
使用sublime text 3 開發,申請百度開放平臺賬號進行開發。
/具體實現/
1、開啟百度開放這平臺建立一個應用拿到關鍵引數,如圖所示:
2、因為我們使用Python開發一款智慧語音合成系統,所以需要Python SDK ,可以在下圖中找到:
3、找到之後可以看看它的使用說明。
4、然後建立一個應用,步驟依次如下圖所示:
5、之後如下圖所示:
6、再按照下圖所示進行操作:
7、這樣就拿到了三個重要的引數:
APP_ID:應用id
API_KEY:應用鑰匙
SECRET_KEY:安全碼
拿到以上關鍵引數之後,接下來就可以開始淦了!
/下載和配置百度語音客戶端/
1、下載百度Python api
pip install 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之後呼叫介面設定引數,目前只支援以下引數:
介面說明setConnectionTimeoutInMillis建立連線的超時時間(單位:毫秒setSocketTimeoutInMillis透過開啟的連線傳輸資料的超時時間(單位:毫秒)
5、建立連結,生成音訊檔案,如下圖所示。
6、可以看出,成功生成音訊檔案會返回二進位制檔案流。這樣還只是生成一個最簡單的音訊檔案,我們還可以將他生成多種聲音,引數如下表所示:
引數型別描述是否必須textString合成的文字,使用UTF-8編碼, 請注意文字長度必須小於1024位元組是cuidString使用者唯一標識,用來區分使用者, 填寫機器 MAC 地址或 IMEI 碼,長度為60以內否spdString語速,取值0-9,預設為5中語速否pitString音調,取值0-9,預設為5中語調否volString音量,取值0-15,預設為5中音量否perString發音人選擇, 0為女聲,1為男聲, 3為情感合成-度逍遙,4為情感合成-度丫丫,預設為普通女否
這就是人工智慧中的語音合成技術,呼叫百度的SDK,只用了幾分鐘,就完成了一年的開發量。
7、當然有失敗就避免不了成功,一般請求失敗會有這幾種情況:
1)錯誤返回格式
若請求錯誤,伺服器將返回的JSON文字包含以下引數:
error_code:錯誤碼。error_msg:錯誤描述資訊,幫助理解和解決發生的錯誤。2)錯誤碼
錯誤碼含義500不支援的輸入501輸入引數不正確502token驗證失敗503合成後端錯誤
看到上面這些引數是不是想躍躍欲試了了。哈哈,那就趕緊解放我們的雙手吧!
/程式實現/
因為我們是要將它打造成一個語音合成的系統,所以當然得有介面才好看,具體實現如下。
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("<<ComboboxSelected>>",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='檔名已存在') #有這個檔案就提示
5、接下來,我們只需將這幾個功能寫入到一個類中即可,然後啟動這個類。
play()
6、當我輸入一段話後,大家可以看到它就生成了一個音訊檔案。而且讀取的時候和我們輸入的內容一模一樣,比如我輸入一段程式碼,見下圖:
7、之後會得到下圖所示的情形。
8、最後的效果如下圖所示。
完美收工,哈哈哈!
/小結/