目錄
前言
python準備工做算法
Demo開發json
總結
瀏覽器
1.前言:我有故事,讓機器人來讀
瀏覽器或者閱讀器App裏其實也有朗讀功能,可是比較僵硬,老是將引人入勝的情節念成流水帳,分分鐘讓人棄坑,因此我考慮本身使用爬蟲定時下載更新的章節,然後將文字合成存儲到音頻文件,這樣不只能夠選擇一個靠譜的語音合成工具來處理文字,並且保存下來的音頻還能反覆收聽,一箭雙鵰。ruby
文本整合容易,可是如何將其快速轉換成音頻呢?難道要本身訓練模型「煉丹」解決?no no ,費力不討好,畢竟本身手頭這點算法知識很是淺顯,並且硬件條件也不容許,本着「能用就行」的原則,我決定先使用市面上開放平臺的產品來解決。通過對比,發現有道智雲的語音合成還不錯(此處可體驗),決定使用有道智雲的語音合成API進行開發。bash
養成好習慣:文中文末小廣告幫忙點一點微信
效果先睹爲快:
我拿來朱自清先生的《荷塘月色》的其中兩段做爲實驗素材,開發了簡單的demo,走通了從加載文本到生成音頻文件的邏輯,下面我來詳細介紹開發過程。app
須要語音合成的文本:工具
合成結果(第一段):學習
合成結果(第二段):
很惋惜,這裏不能上傳mp3格式的音樂文件
2.調用API接口的準備工做
首先,是須要在有道智雲的我的頁面上建立實例、建立應用、綁定應用和實例,獲取到應用的id和密鑰。具體我的註冊的過程和應用建立過程詳見官方教程。
開發過程詳細介紹
下面介紹具體的代碼開發過程。
首先根據文檔分析有道智雲的API輸入輸出規範。語音合成API調用十分簡單,該API採用https方式通訊,所需參數以下表:
字段名 | 類型 | 含義 | 必填 | 備註 |
---|---|---|---|---|
q | text | 待合成音頻文件的文本字符串 | True | 好比:您好 |
langType | text | 合成文本的語言類型 | True | 支持語言 |
appKey | text | 應用 ID | True | 可在 應用管理 查看 |
salt | text | UUID | True | UUID |
sign | text | 籤 | True | MD5(應用ID+q+salt+應用密鑰) |
voice | text | 翻譯結果發音選擇,0爲女聲,1爲男聲,默認爲女聲 | false | 0 |
format | text | 目標音頻格式,支持mp3 | false | mp3 |
speed | text | 合成音頻的語速 | false | 好比:"1"爲正常速度 |
volume | text | 合成音頻的音量 | false | 正常爲"1.00",最大爲"5.00",最小爲"0.50" |
簡單歸納,組織好本身的語言(utf-8編碼文本),輔以簽名等必要參數,並告訴API所須要的音頻特徵,便可獲得一份使人滿意的合成音頻。
接口輸出中,若是合成成功,正常返回爲二進制語音文件,具體header信息 Content-type: audio/mp3,若是合成出現錯誤,則會返回json結果,具體header信息爲:Content-type: application/json,可據此判斷運行狀況。
3.Demo開發:
這個demo使用python3開發,包括maindow.py,synthesis.py,synthesistool.py三個文件,分別爲demo的界面、界面邏輯處理和語音合成接口調用工具封裝。
1.界面部分:
界面部分代碼以下,比較簡單。
root=tk.Tk()root.title("youdao speech synthesis test")frm = tk.Frame(root)frm.grid(padx='50', pady='50')# 文件選取按鈕btn_get_file = tk.Button(frm, text='選擇待合成文件', command=get_files)btn_get_file.grid(row=0, column=0, ipadx='3', ipady='3', padx='10', pady='20')# 所選文件列表展現框text1 = tk.Text(frm, width='40', height='10')text1.grid(row=0, column=1)# 啓動按鈕btn_sure=tk.Button(frm,text="合成",command=synthesis_files)btn_sure.grid(row=1,column=1)
其中啓動按鈕btn_sure的綁定事件synthesis_files()來收集帶全部的文本文件,啓動合成,並打印運行結果:
def synthesis_files(): if syn_m.file_paths: message=syn_m.get_synthesis_result() tk.messagebox.showinfo("提示", message) os.system('start' + '.\\result') else : tk.messagebox.showinfo("提示","無文件")
synthesis.py
這裏主要是配合界面實現一些文本讀取和請求接口處理返回值的邏輯。首先定義一個Synthesis_model
class Synthesis_model(): def __init__(self,file_paths,result_root_path,syn_type): self.file_paths=file_paths # 待合成文件路徑 self.result_root_path=result_root_path # 結果路徑 self.syn_type=syn_type # 合成類型
get_synthesis_result()方法實現了批量讀取文件並調用合成方法、處理返回信息的邏輯:
def get_synthesis_result(self): syn_result="" for file_path in self.file_paths: # 讀取文件 file_name=os.path.basename(file_path).split('.')[0] file_content=open(file_path,encoding='utf-8').read() # 調用合成方法 result=self.synthesis_use_netease(file_name,file_content) # 處理返回消息 if result=="1": syn_result=syn_result+file_path+" ok !\n" else: syn_result=syn_result+file_path+result return syn_result
單獨定義了方法synthesis_use_netease()具體實現調用API的方法,這樣增長了demo的擴展性,實現了一種合成模塊可插拔的鬆耦合形式:
def synthesis_use_netease(self,file_name,text): result=connect(text,'zh-CHS') print(result) if result.headers['Content-Type']=="audio/mp3": millis = int(round(time.time() * 1000)) filePath = "./result/" + file_name+"-"+str(millis) + ".mp3" fo = open(filePath, 'wb') fo.write(result.content) fo.close() return "1" else: return "error:"+result.content
synthesistool.py
1.synthesistool.py中是和請求有道智雲API直接相關的一些方法,最核心的是connect()方法,整合了API所要求的各個參數,並調用執行請求的方法do_request(),並返回API處理結果。
def connect(text,lang_type): q = text
data = {} data['langType'] = lang_type salt = str(uuid.uuid1()) signStr = APP_KEY + q + salt + APP_SECRET sign = encrypt(signStr) data['appKey'] = APP_KEY data['q'] = q data['salt'] = salt data['sign'] = sign
response = do_request(data) return response
須要體驗一下的小夥伴,請下載個人代碼自行嘗試或去官網體驗 :
項目地址:連接在下方
特別提示:一、運行demo時,須要替換synthesistool.py模塊中的 APP_KEY 、 APP_SECRET爲你本身生成的 APP_KEY、APP_SECRET哦二、該工程默認存放結果存在./result 文件夾下,你須要手動在項目路徑下建立該目錄。或者修改成任意你想存放的位置
4.總結
以上就是個人開發過程,有道智雲的語音合成API文檔清晰,調用過程全程無坑,開發體驗和合成效果都使人感到溫馨。
我有故事,我把它交給機器人來說,閉目養神不枯燥,真是一件美事!
完整代碼獲取方式:公衆號回覆:讀故事
正文結束!!!
養成好習慣:文中文末小廣告幫忙點一點
歡迎關注公衆號:Python爬蟲數據分析挖掘,方便及時閱讀最新文章
記錄學習python的點點滴滴;
回覆【開源源碼】免費獲取更多開源項目源碼;
公衆號每日更新python知識和【免費】工具;
本文已同步到【開源中國】、【騰訊雲社區】、【CSDN】;
本文分享自微信公衆號 - Python爬蟲數據分析挖掘(zyzx3344)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。