Python 文字轉語音教學
這篇文章會教你如何使用Python 程式語言,將文字轉為語音,透過這個方法,你可以將書籍、文章、雜誌的內容,轉為語音給自己聽,或是透過API 整合跨平台的系統,實現客製化的語音服務,如果你手邊已經有現成的影片腳本,這個轉語音的方法,也可以幫助你將腳本轉為影片的說話聲音,加快你創作的速度。
文字轉語音的英文是text to speech,這類技術和服務我們簡稱TTS,以下內容我用TTS 來表示文字轉語音的技術,現在其實已經有很多相關的服務,像是Google 就有提供TTS 的服務,但是超過免費的額度之後,就需要收費,台灣也有一個TTS 線上服務,叫做雅婷文字轉語音,更貼近台灣在地人的口音,這些服務品質更好,速度也更快,但如果你只是要做一個自己的系統,或是提供一個小服務,可以使用Python 的TTS 套件pyttsx3,這個套件有提供完整的API 文件,以下是官方API 文件的網址。
https://pyttsx3.readthedocs.io/en/latest/engine.html
這個TTS 套件使用方式非常簡單,不過你要先用安裝好這個套件,才可以在程式中使用它,我現在在jupyter notebook 的環境下編寫程式,首先我要import 這個TTS 套件進來,然後我要定義一個變數txt,我希望能夠將這個變數裡面的文字轉為語音,所以我先輸入一個簡單又常見的示範 Hello Code Gym,然後我要定義一個變數engine,它會是等一下要轉換語音的物件,接下來我都會透過這個變數engine 使用TTS 套件中的功能,接著我用套件中的函式init ,產生出一個轉換語音的物件,我使用engine 中的函式say ,幫我們將文字說出來,這個函式很容易理解它的意義,就是將剛才的文字當作參數使用就可以了,最後我呼叫函式runAndWait,就可以完成了。
import pyttsx3 txt = 'Hello Code Gym' engine = pyttsx3.init() engine.say(txt) engine.runAndWait()
不過這個聲音聽起來好像速度太快,而且語調不是很好,我們可以換一種發音和調整語速試試看,我們觀察這份TTS 套件的API 文件,可以找到它提供一個名稱為getProperty 的函式,這個函式提供四種參數,分別是說話的語速、語音、語音清單和音量,參數rate 如果沒有設定的話,預設值是每分鐘200 個字,另外voices 會列出所有我們可以設定的語音選擇。
現在這份清單就是所有可以設定的語音選擇,這些語音會依據你的作業系統而有所不同,我目前是用Apple 的作業系統,所以在ID 會顯示apple 開頭的名稱。
我現在想用一個名字為samantha 的語音設定,他的語言是英語,所以發音會比剛才預設值用中文的設定來得好,我可以先將這個id 複製下來,然後使用函式setProperty,設定voice 為這個ID,然後我想調整說話的速度慢一點,因為Hello Code Gym 只有三個單字,講太快一下就結束了,所以我可以設定語速為50,這樣說出來會比較清楚一點
import pyttsx3 txt = 'Hello Code Gym' engine = pyttsx3.init() engine.setProperty('voice', 'com.apple.speech.synthesis.voice.samantha') engine.setProperty('rate', 50) engine.say(txt) engine.runAndWait()
我來試試看另外一個語音設定,這個設定值的名字是Fred,它是1984 年賈伯斯介紹麥金塔電腦時,第一次用電腦將文字轉為語音的發音,這次我將語速調快一點,我們來聽聽看聲音如何
import pyttsx3 txt = 'Hello Code Gym' engine = pyttsx3.init() engine.setProperty('voice', 'com.apple.speech.synthesis.voice.Fred') engine.setProperty('rate', 170) engine.say(txt) engine.runAndWait()
除了讀取程式中字串的文字,我們也可以讀取外部檔案中的文字,轉為語音念出來,我現在在設定好property 程式碼下方,加入打開檔案的程式碼,我用關鍵字with 和函式open 開啟一個已經準備好的文字檔,這個檔案取名為變數file,然後用for 迴圈,一行一行的讀取檔案中的文字,在念出文字之前,我想先列印出檔案中的文字,所以我用函式print 列印出來,然後在寫上剛才示範過的函式say,將文字唸出來,我前面都是用英文示範,這次我們來看看中文的轉換語音效果如何,我把voice 設定為中文的語音設定,語速設定為每分鐘120 個字,文字檔中的內容,我引用BBC 中文網的一個段落,這篇文章是BBC 成立100 週年的反思,這個傳統媒體面對現在社群媒體發達,資訊快速傳播的世代,他們該如何面對,有興趣的朋友可以點擊連結,看看BBC 成立100 週年面臨的五大挑戰,我用這篇文章裡的一段話作為範例,中文字除了這組設定以外,還有香港的粵語發音和中國的發音,你可以自行選擇適合的發音設定。
import pyttsx3 txt = 'Hello Code Gym' engine = pyttsx3.init() engine.setProperty('voice','com.apple.speech.synthesis.voice.meijia') engine.setProperty('rate', 120) with open(r'/CodeGym.txt') as file: for line in file: print(line) engine.say(line) engine.runAndWait()
這個TTS 套件的語音設定還有很多,像是韓語、德語、日語都有,最好依據文字的語言,給予相同的設定,說出來的語音效果才會是最好的,我會將這個設定清單放在資訊欄當中,最後我想測試一下日語的效果,因為我現在住在日本福岡,我在這裡生活和工作,所以我想和你分享一個蠻漂亮的景點,海中道海浜公園,9月底到11月中會有秋天的花季,它位於福岡市的北邊,這個公園腹地很大,製作影片的前幾天我才剛去過,園區內非常的漂亮,裡面還有小朋友可以遊玩的設施,很適合親子出遊,秋天的涼風,搭配多種顏色的花海非常的舒服,我在福岡市政府的官網複製一段文字,然後貼到程式讀取的文字檔中,將語音設定改為日本發音。
示範擷取日文如下:
海の中道海浜公園で開催される秋の一大イベント『うみなか*はなまつり』。 真っ赤に紅葉したコキア4,000株やコスモス120万本の広大なピンクの花畑など、見どころ満載です。
import pyttsx3 txt = 'Hello Ryan' engine = pyttsx3.init() engine.setProperty('voice','com.apple.speech.synthesis.voice.kyoko') engine.setProperty('rate', 120) with open(r'CodeGym.txt') as file: for line in file: print(line) engine.say(line) engine.runAndWait()
官網的文件中的範例也有介紹,如何將語音製作成檔案,我們只要呼叫函式save_to_file 就可以了,你可以存成mp3或wav 的檔案格式。
這個TTS 套件可以快速的幫我們實現文字轉成語音的服務,我們可以使用Google API 整合行事曆、Gmail 等服務,將今天的排定事項和E-mail 的內容唸出來,我們也可以將爬取運動數據資料或股市資訊的系統,整合加入這個TTS 套件,製作成能夠帶有語音服務功能的自動化系統
如果你對於這類整合多種功能的自動化系統感興趣,可以參考我製作的Python 自動化工作術課程,這堂課程會教你自動化的檔案管理,Excel、Word 等文書軟體的自動化操作方式,當你將重複的工作自動化以後,可以大幅提高你的工作效率,和節省你的工作時間,我將課程網址放在下方,歡迎你點擊閱覽。
https://codegym.mykajabi.com/python-automate
Code Gym 致力於創造實用的高品質線上課程,幫助想要學習程式語言和IT技術的朋友,能透過我的課程,學習知識,發揮熱情,創造出屬於你自己的作品