用Python寫一個語音播放軟體
單位經常使用廣播進行臨時事項的通知(將文字轉換為語音然後通過功放廣播),但是市面上多數語音播放軟體都是收費的,要麼發音失真,要麼不夠穩定——經常出現莫名其妙的故障,容易給工作帶來被動。學Python這麼久不如動手寫一款自己的語音廣播軟體,即使發生故障也可以自行排除。
介面設計
在開始動工之前當然要分析需求,我要的核心功能是將一段文字通知輸入軟體,然後將其轉換為語音並播放出來。
這項功能雖然並不複雜,但也需要一個互動式的介面,所以決定使用Tkinter來實現這個功能。
第一步:建立一個窗體
設定標題、大小等要素,為了避免顯示格式錯亂將其設定為不可改變大小,程式碼如下:
第二步,設定一個控制元件
用於接受收入的文字,這裡選擇帶滾動條的Text,程式碼如下:
第三步,提供選項
作為一款語音播放軟體,最基本的語速、音調等風格設定還是要有的,這裡使用Combobox控制元件提供固定選項,使用者可以根據情況選擇不同的發音、語速和語調。
第四步,建立功能事件的觸發介面
設定三個Button控制元件分別用於觸發“語音播放”、“文字清除”和“介面退出”功能。
最終介面效果如下:
語音播放
關於“清除”、“退出”等功能相對比較簡單,這裡重點對本次的核心功能——語音播放進行詳細說明。
1).語音介面
文字轉換語音推薦使用百度雲的REST API 介面,登入網站http://ai.baidu.com/,依次進入控制檯——語音技術頁面,建立自己的語音應用(下圖),其中AppID 、API Key 、Secret Key 三個引數在程式碼中會用到。
然後使用 pip install baidu-aip 安裝python SDK模組,我們來看一下函式原型:
APP_ID = 'XXXXXX' API_KEY = 'XXXXXXXXXXXXX' SECRET_KEY = 'XXXXXXXXXXXXXXXXXXXXXX' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) result = client.synthesis(text, 'zh', 1, {'per':1, 'vol':15, 'pit':9, 'spd':5 })
- text:需要轉換的文字。
- per:發音人選擇, 0為女聲,1為男聲,3為情感合成-度逍遙,4為情感合成-度丫丫,預設為普通女聲。vol:音量,取值0-15,預設為5中音量
- pit:音調,取值0-9,預設為5中語調。
- spd:語速,取值0-9,預設為5中語速。‘zh’和1分別為語音模式和客戶端型別,該兩項均為固定值,不支援修改。
可以看到,我們需要的發音、音調、語速三種風格都可以通過修改引數來實現。
2).功能設計
解決了語音合成介面的問題,就可以結合介面設定來實現具體功能了。
當“播放”按鈕點選時,要從Text控制元件中讀取文字,如果文字為空則彈出提示框要求重新輸入;若文字不為空則將文字轉換為音訊檔案並使用playsound進行播放。
- 首先,要將介面中的語音風格選項與語音合成函式引數一一對應起來,這是一個典型的鍵與值的對應關係,使用字典這種資料結構再合適不過了。
- 然後對於發音風格,選取了男聲、女聲、混合三種模式;
- 最後對於音調和語速,沒必要設定過細的精度等級,這裡分別選取了三個跨度明顯的等級進行區分。
這裡有一個問題需要特別注意,那就是在軟體執行過程中,生成並播放的音訊檔案不可刪除、不可修改、不可覆蓋,所以每次轉換生成的音訊檔名稱絕對不能重複,否則在進行多次“播放”操作時,會因為新生成的音訊檔案無法儲存而發生故障。
3
打包封裝
到目前為止,這個軟體的執行要依賴於本地的python開發環境,不能方便地提供給他人使用,這裡推薦Pyinstaller的第三方庫來對python程式進行打包,首先進入剛才的py檔案所在目錄,執 行以下cmd命令。其中“-w”的作用是是不顯示命令視窗,tk_voice是剛才的py檔名稱。
pyinstaller -w tk_voice.py
這時,在同一目錄下會生成一個dist資料夾,這裡面就是打包後的程式檔案了。我們執行一下其中的.exe檔案,就會出現之前設計的程式介面,在文字框中輸入一段測試文字:“全體人員請注意,全體人員請注意,請立即下樓集合開飯。”,點選“播放”按鈕試一下效果:
插入音訊————測試.mp3
最後,關於Pyinstaller的使用有幾點需要注意的地方:
- 該方法僅適用於windows系統,而且對系統版本有比較嚴格的要求,比如64位系統下打包的程式無法在32位系統下執行。
- 如果需要打包的程式中呼叫了外部的一些圖片或其他資原始檔,則需要手動複製到打包後的資料夾內,因為對於這些檔案Pyinstaller不會進行打包。
- 使用Pyinstaller打包如果出現中途失敗的情況,可能會導致原py檔案內容丟失,所以打包之前最好先進行備份。
- 使用import匯入其他庫的時候儘量有選擇性,不要匯入整個庫,不然打包後的檔案會非常龐大。