natural-voice 是做什麼的?
大多數「機器人般的」ElevenLabs 語音配音其實不是語音問題,而是劇本問題。模型只會逐字讀出給它的內容,而為視覺寫的劇本(標題式句子、以句號分隔的片段、數字、破折號)無論由哪個聲音來讀,結果都會是斷斷續續的。
這個資料夾裡的三個工具都是可執行的。請直接使用它們,不要只靠閱讀文字來判斷流暢度。
python3 speakable.py script.txt # 這個劇本是為聽覺寫的嗎?
python3 takes.py script.txt --voice VOICE_ID # 種子取樣(付費功能,執行前會先詢問)
python3 gaps.py takes/ # 依照句中間的間隙排序取樣
三個工具都是純 Python 3.9+,不需安裝任何套件。gaps.py 會利用 PATH 中的 ffmpeg(如果有的話)來比對間隙與實際音檔。
循環流程
1. 在更動任何設定前先診斷。 如果已有取樣,先用 gaps.py 分析它。句 中間(而非逗號或句號後)出現超過 0.2 秒的間隙,就是人們聽見的「AI感」。在我們自己的前製取樣中,聲音在「run」之前停了 0.3 秒,又在「Instagram」之前停了一次,而且都發生在開場白的中間。我們的剪輯完全沒有造成這些停頓:間隙是原始檔案中就存在的。
2. 改寫為適合聽覺的版本。 執行 speakable.py 並修正每個標記。規則如下:
- 句子,不是標題。「13 個免費 Claude 技能現在執行你的 Instagram。」是標題。「十三個免費 Claude 技能執行你整個 Instagram。」才是人會說的話。
- 清單用逗號,不是句號。「Reels。Captions。Carousels。」會讓模型停頓三次。「reels, captions, carousels, stories」則流暢。
- 口語中數字要寫成文字:「eighty-four out of a hundred」,而非「84 out of 100」。螢幕上的文字可以保留數字。
- 使用縮寫(you've, it's, we'll)。沒有人會大聲說「you have」。
- 用「so」、「and」、「then」連接片段。 連接詞是模型繼續讀下去的提示。
- 不要使用破折號。 ElevenLabs 將破折號視為短暫停頓,且官方表示它「較不穩定」。請用逗號保持連貫,或用省略號來表示一個節拍。
- 不要使用 SSML。
<break time="1s"/>在 Eleven v4 或 v3 上不受支援。
3. 加入引導指令。 Eleven v4 支援方括號中的音頻標籤。在一個節拍的開頭放一個標籤即可,不要每一行都放,並且要讓標籤符合該行語氣的用途。完整的標籤列表請見 tags.md。speakable.py 會標記它不認識的標籤,因為未知標籤可能會被當成音效來讀。
[excited] Thirteen free Claude skills run your whole Instagram.
[mischievously] So we let it write this Reel...
標點符號本身也是一種引導。省略號會加入有份量的停頓,驚嘆號會增加能量,大寫字母則會添加強調語氣(只用一次,放在最重要的那個詞上)。
**4. 設定參數。**在 eleven_v4 上:
| 設定 | 數值 | 原因 |
|---|---|---|
| stability | 0.30 至 0.40 | 較低的值帶來「更廣的情感範圍」;預設值 0.5 比較平淡。低於 0.3 時取樣可能會不穩定。 |
| similarity_boost | 0.75 | 這是預設值;保留聲音本身的特質 |
| style | 0 | 這是預設值;任何其他值都會增加延遲 |
| speed | 1.0 至 1.08 | 允許範圍是 0.7 至 1.2;社交媒體旁白通常略高於 1 |
5. 三種取樣,同樣的文字,不同的種子。 只做一個取樣就像擲硬幣一樣隨機。執行 takes.py 並指定種子 1、2 和 3,然後用 gaps.py 排序。聆聽前兩名並用耳朵挑選。保留該種子:它會讓重新生成的取樣接近原本的結果(ElevenLabs 稱之為「盡力而為」,不保證一定相同)。
6. 溫和地編輯。 如果您的編輯器會修剪靜音,請在句末保留約一秒、逗號後保留約大半秒的停頓。每次都被剪到相同短長度的停頓,是另一種聽起來像機器製造的現象。
7. 聽起來還是像生成的? 停止調整旋鈕。用手機錄下你自己說這句台詞的版本,然後透過 ElevenLabs 的語音轉換功能(speech-to-speech)轉換成你想要的聲音。你的節奏、強調和情感都會保留下來;只有聲音改變了。
我們測量到的結果
在我們自己的一個 Reels(檔案在 examples/ 資料夾中)上:
| 修改前 | 修改後 | |
|---|---|---|
| 劇本 | 為視覺寫的:片段、數字 | 為聽覺寫的:speakable.py 無錯誤 |
| 標籤 | 無 | [excited], [mischievously] |
| 設定 | stability 0.5, speed 1.0 | stability 0.35, speed 1.05 |
| 取樣 | 1 個 | 3 個種子,先由 gaps.py 排序再用耳朵挑選 |
speakable.py 分數 | 65, REWRITE(以句號分隔的清單、數字、無標籤) | 100, SPEAKABLE |
| 句中間的間隙 | 開場白中 "now" 和 "run" 之間有 0.34 秒 | 無 |
聲音也改變了(從 Will 換成 Chris),所以這不是對單一設定的實驗室測試。劇本改寫是我們聽起來差異最大的部分。
規則
- 絕不先發送付費請求而不告知費用。
takes.py會印出字元數並停下來,除非你傳入--yes參數。 - 絕不印出或提交 API 金鑰。
takes.py只從環境變數ELEVENLABS_API_KEY讀取金鑰,不使用其他方式。 - 標示清楚。 如果聲音是生成的,請開啟該平台的 AI 標籤。