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(“<
#繫結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的時候總會遇到一些問題和瓶頸,沒有方向感,不知道該從哪裡入手去提升,對此我整理了一些資料,希望能夠去幫助到小夥伴們,可以關注小編,並在後臺私信小編:“資料”即可領取。
相關文章
- 2021-07-29光遇:get不到紅狐狸的帥?那是因為你沒有,搭配龍骨超帥
- 2021-06-21徒手用 Go 寫個 Redis 伺服器
- 2021-05-18你離脫單之間只差一個表白神器 難道就不想遇到契合的靈魂相守一生
- 2021-05-06Scala核心程式設計 集合(Seq, list, set, Map)
- 2021-04-16早安勵志金句,樂觀是通往成功的信念,艱難的時刻造就偉大的人生