SpeakItAI 自架 Azure 語音合成,把免費額度變成可下載音檔

SpeakItAI 把 Azure 每月 50 萬字的免費語音額度換成可下載的 WAV 音檔,自架在本機只依賴三個套件。實際安裝操作一遍後發現:出廠語言選單只有 10 個、繁中聲音要三步才挖得出來,輸出資料夾與更新腳本各有一處文件沒寫的坑,而 Azure 免費帳號真正需要的是一張非預付卡。

用 AI 摘要這篇文章:

把 SpeakItAI 裝起來,輸入 python app.py,瀏覽器會在本機 7860 埠打開一個清爽的三分頁介面。多數人裝這種工具的第一件事是找繁體中文的聲音,第一分鐘就會撞牆:語言選單拉開只有十個選項,英文包辦三個,結尾是 Chinese (Simplified),中間沒有 Chinese (Taiwan)。

這不是安裝出錯,是它的設計。這個 2025 年 5 月底出現的開源專案,倉庫裡的聲音資料其實收了 153 個語言地區、530 支聲音,繁中佔三支;但介面預設只顯示另一個十行標籤檔裡列過的語言,其餘 143 個全部被藏起來。想讓曉臻、雲哲、曉雨現身,要走一條說明文件沒有直說的路。

SpeakItAI 是把 Azure 每月 50 萬字免費語音額度換成 WAV 音檔的最小自架介面,整個專案只有三個 Python 依賴、11 個提交,五天寫完就停筆,之後維持現狀到今天。它的價值和它的坑都來自同一件事:作者只寫到「自己夠用的最小範圍」。我把專案抓下來在乾淨的虛擬環境裝過、啟動過,三個分頁都實際操作過一遍;手上沒有 Azure 金鑰,所以真正送字合成那一步沒有走完,音質好壞不替你先下結論。作者沒有提供公開展示站,倉庫 46 顆星、一人維護,想試就是自己裝一套。

開箱只亮十個語言,是標籤檔在擋

從零到打開介面的路徑很短:git clone 抓下專案,建一個 Python 虛擬環境,pip install -r requirements.txt 只會裝三個套件(gradio、微軟語音 SDK、dotenv),把 .env.example 複製成 .env 填入金鑰和區域,python app.py 就會起在本機 7860 埠。金鑰的來源是先到 Azure Portal 建一個 Speech 資源、定價層選 F0,再到資源的 Keys and Endpoint 頁面把 Key 和 Region 抄下來,整段說明文件寫得清楚,照走不會迷路。裝好之後真正的第一個關卡,就是語言選單。

語言選單的資料來源有兩個檔案。tts/azure/config.json 是完整的聲音資料庫,裡面按語言地區收了 153 個入口,從南非荷蘭語 (af-ZA)、阿姆哈拉語 (am-ET) 到中文的八個變體都有,中文含簡體、港式繁中和台灣繁中,還有河南、遼寧、陝西、山東、四川五種地方話。另一個 tts/azure/language_labels.json 只有十行,負責把代碼換成人類可讀的名稱,出廠內容是英文三種,加上俄語、法語、德語、西班牙語、義大利語、日語和簡體中文。

程式的判斷很直接:標籤檔有內容,語言選單就只列標籤檔裡的語言;標籤檔是空的,才會把 153 個代碼全部攤出來。所以開箱看到的十個選項,就是那十行標籤的鏡子。這十行同時決定了下拉選單裡顯示的名稱,像 English (UK) 對應 en-GB 這類對照。也因此挖出繁中有兩條路:一條是下面要講的介面三步,另一條是把標籤檔清成空的,重啟之後選單會亮出所有 153 個代碼,再自己認 zh-TW。前者畫面漂亮,後者一次看見全貌,喜歡哪個都行。

SpeakItAI 語言下拉選單展開畫面,清單共十個選項,從 English (UK) 到 Chinese (Simplified),沒有繁體中文Pin
出廠的語言選單就是這十個選項,快照裡的 153 個語言地區要另外挖出來

預設畫面會自動帶好第一個語言的第一支聲音和第一個風格,我裝起來時是 English (UK)、Sonia、cheerful 三個欄位自動填滿,這部分與 README 的描述一致。問題只在於,除非你動手改,否則這十個語言就是你以為的全部。

讓繁中出現的三個步驟,和一個空白欄位

要看到台灣的聲音,不需要改任何程式。切到 Edit Languages 分頁,在 Language Code 填 zh-TW,Display Name 填一個你認得的名字,按 Save / Update,回到 TTS 分頁拉開語言選單,繁中就在裡面了。顯示名隨你填,叫 Chinese (Taiwan) 或寫繁中都行,它只決定選單上的字。我實際走過這三步,選單立刻多出我剛填的名稱,之後語言、聲音、風格三個欄位會串接更新,不需要重啟程式。

選了繁中之後,聲音欄位有三個選擇:曉臻(女聲)、雲哲(男聲)、曉雨(女聲),對應 Azure 的 HsiaoChen、YunJhe、HsiaoYu 三支類神經語音。到這裡為止一切正常,但拉開風格 (Speaking Style) 選單會看到一個奇怪的畫面:清單裡只有一個空白選項,而且已經被選上了。

SpeakItAI 選了繁中之後的畫面,風格下拉選單展開只有一個空白選項,聲音欄位為曉臻Pin
繁中三支聲音的風格選單打開只剩一個空選項,資料檔裡這個欄位是空字串

原因藏在聲音資料檔裡。Azure 的聲音清單 API 對不支援風格的聲音,會回傳一個裝著空字串的清單而不是空清單,這個專案的更新腳本只處理了完全空清單的情況,於是 530 支聲音裡有 488 支的風格欄位都變成那個空字串。程式接著把這個空字串包進 SSML 的風格標籤一起送出去,微軟端收到後會怎麼處理,這一段我沒有金鑰可以驗證,只能把現象留在這裡。真正帶多種風格的聲音只有 34 支,全部集中在簡體中文和幾個大語種,最豐富的曉曉有 20 種,雲希 12 種,雲健 10 種。換句話說,對台灣繁中的三支聲音來說,風格欄位實際上是裝飾。

語速和音調倒是可用,只是調整刻度固定:各是一個五段下拉選單,從正負 20% 之間每 10% 一格,不是連續滑桿。聲音欄位顯示的是各地語言的本地名稱,英文聲音叫 Sonia、Ryan,繁中直接叫曉臻、雲哲,選的時候不需要記 API 代號。輸入來源有兩種:文字框直接貼,或上傳 .txt 檔;兩邊都有內容時檔案會蓋過文字框,而且只吃純文字檔,其他格式不收。

輸出資料夾照文件改,反而生不出聲音

README 說輸出資料夾可以用 .env 裡的 AUDIO_OUTPUT_DIR 變數調整,音檔庫分頁也確實照這個變數在列檔案。但合成核心 tts/azure/core.py 第 33 行把暫存檔路徑寫死成相對目錄 audio_outputs,兩個版本分支都一樣。實際測試的結果:乾淨環境下把輸出資料夾指到別的地方、照規則只建立新路徑之後,按下合成會直接跳出 FileNotFoundError,訊息裡指著不存在的 audio_outputs 目錄,而且這個錯誤發生在程式連微軟伺服器都還沒碰到的階段。

所以照文件改資料夾,工具會在你以為要開始合成時死在本機。解法有兩個:把輸出留在預設位置不要動,或者在專案目錄下手動建一個 audio_outputs 資料夾。錯誤呈現也值得先打預防針:我拿一組假金鑰直接呼叫合成函式,得到的是未經轉譯的原始錯誤字串(Speech synthesis failed: ResultReason.Canceled),沒有任何人話包裝。真的合成失敗時畫面大概就是那個樣子,先有心理準備,別當成裝壞了。這類文件與程式脫節還有第二處:README 教人從專案根目錄執行 python tts/azure/update_config.py 更新聲音清單,但腳本把新檔案寫到執行時的工作目錄,從根目錄跑會生出一個根目錄版的 config.json,程式讀的仍是原本那一份。這一段我從路徑邏輯判斷,腳本本身需要金鑰才能完整跑過,就沒有實測。想更新的話,進到 tts/azure 目錄再執行才會真的生效。

免費額度是真的,註冊門檻是一張卡

這個工具的免費故事分兩半。額度那一半是真的:微軟定價頁寫明 F0 免費層的類神經語音合成每月 50 萬字元免費,超額才按字元計費,額度每月重置。對個人專案來說,50 萬字大約是一本小說的體量,很難用完。順帶一提,更早的舊免費層每個月給 500 萬字元,現在定價頁標注只留給既有客戶,新帳號拿到的就是 50 萬字。

另一半在註冊。README 和把它介紹出來的文章都說免費方案「不需要信用卡」,但微軟官方的免費帳號頁面寫得明白:需要電話號碼,加上一張信用卡或金融卡(不能是預付卡),加上 Microsoft 或 GitHub 帳號;香港和巴西更嚴,只收信用卡。卡的用途是身分驗證,過程可能有 1 美元的臨時授權,驗證後會退,官方也聲明註冊當下不會扣款。所以正確的說法是:卡不會被扣錢,但不能沒有。已經有 Azure 帳號的人這條不是問題;手上只有預付卡或完全不願意留卡號的人,免費額度看得到、吃不到。

文字只送微軟,這是它和免費線上站最大的不同

自架的意義在資料流向。SpeakItAI 本體不經過任何中間伺服器:金鑰放在本機 .env 檔,合成請求用微軟官方 SDK 從你這台機器直接送到指定區域的微軟端點,文字內容的去向就是微軟一家。作為對照,之前介紹過的免費線上語音站像 audiotexthub,文字會先送到站方伺服器再轉手,生成的音檔還落在公開的雲端空間;voicecraft 免帳號就能產 MP3,但同樣是文字出門給別人的機器。不想讓稿件離開自己機器、又願意辦微軟帳號的人,這種自架路線是比較乾淨的選擇。想走 Edge 免費線路的人,也可以看 Text2Voice 的做法。

不過「本地」要讀到行為層:介面框架 Gradio 內建匿名使用統計,預設打開,這個專案沒有設參數關掉,README 也沒提。想安靜一點,在環境變數設 GRADIO_ANALYTICS_ENABLED=False 就好。它統計的是使用事件,不包含你的文字內容。

SpeakItAI 的 Audio Library 分頁,包含音檔下拉選單、播放器、刪除與重新整理按鈕Pin
2025 年 6 月才加入的音檔庫分頁,生成過的音檔可以直接播放或刪除

介面本身有三個分頁。TTS 是主戰場;Edit Languages 管標籤,也能把不要的語言刪掉讓選單變短;音檔庫分頁可以播放、刪除、重新整理生成過的音檔,這個分頁是 2025 年 6 月初才加的,倉庫裡大多數介紹截圖都還沒有它。另外倉庫還有一條 fastapi-auth-docker 分支,補上了帳號登入(bcrypt 密碼、SQLite 儲存、網頁註冊)和 Docker 部署,compose 檔把容器的埠對到 9002、資料庫和音檔資料夾掛成兩個 volume,還附一支一鍵更新重啟的腳本,適合丟到 NAS 給家人共用;主分支的介面本身沒有登入這回事,只綁在本機 127.0.0.1,不對外開埠就沒有別人能用的問題。分支的說明文件把啟動指令拼成 unicorn,正確指令是 uvicorn,照抄會找不到命令。

五天寫完就凍結,裝之前先認清三件事

授權狀態有個文字陷阱:README 結尾寫著專案採 MIT 授權,但整個倉庫從第一個提交到最後一個,都不存在授權條款檔案,GitHub 也判定無授權。自己裝來用沒有人管,要改了再散布,嚴格說需要先向作者要一份授權,README 那一行不構成條款。

活躍度方面,11 個提交散布在 2025 年 5 月 26 日到 6 月 6 日之間,實際有提交的日子只有五天,功能性分支停在 6 月 14 日,到今天 15 個月沒有動靜,46 顆星、議題區只剩兩則去年十一月就關掉的舊議題,這是一人五天的作品,別期待有人修坑。依賴也全部沒有釘版本,我在 2026 年 9 月安裝,gradio 解到 6.27.0、微軟 SDK 解到 1.51.2,程式照樣能起、介面照樣能操作,這點實測可以放心;但未來某次大版本更新會不會壞,沒有人承諾。

還有兩個小地方:送合成的文字是原樣塞進 SSML,遇到半形 and 符號或小於符號這類字元會破壞格式,碰到就換成全形或跳過;介面沒有任何額度顯示,超過 50 萬字要自己到 Azure 後台看。

所以什麼人該裝它?你需要的是可以重複產出、可下載的 WAV 音檔,有一張非預付卡願意換微軟帳號,且能接受打開終端機照說明跑幾行指令,這個工具的成本效益很好:裝完到產出第一支繁中音檔,順的話十分鐘內。成功的畫面是音檔庫分頁裡躺著你自己聽得下去的曉臻或雲哲。反過來說,只是偶爾想讓一段字發聲、不想辦帳號,用線上免費站就夠;想的是在閱讀器裡聽書,那要的是 azure-tts-importer 那種把金鑰變成閱讀器設定的工具,不是這個。聲音要變成文字的相反需求,可以參考 Parakeet TDT

Sliven 褚崇名
Sliven 褚崇名

每日分享科技新知、免費資源以及 WordPress、虛擬主機相關主題,任何問題歡迎在科技月球下方留言,或是發送 Email 至 [email protected] 與我聯繫。

文章: 1243

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


Share to...