Communitygithub.com

wael-wq/natural-voice

讓 ElevenLabs 語音聽起來像真人而非機器人——將劇本改寫為適合聽覺、加入音頻標籤引導、調整穩定度與速度、生成種子選段並挑選最自然流暢的版本。

natural-voice 是什麼?

自然語音(natural-voice)技能專為 ElevenLabs TTS 生成的聲音過於機械化、斷句不自然或缺乏情感的問題而設計。其核心理念是:大多數「機器人語音」問題出在劇本而非語音本身。該技能提供三個 Python 腳本——speakable.py 用於診斷劇本是否適合聽覺閱讀,takes.py 用於生成多個種子取樣,gaps.py 則分析音檔內的句間間隙以排序自然度。支援 ElevenLabs v4 模型,並提供具體的劇本改寫規則(如使用完整句子、數字改為文字、添加連接詞、避免破折號、使用方括號音頻標籤等),以及參數建議(穩定度 0.30–0.40、速度 1.0–1.08)。所有腳本均為純 Python,無需額外套件,僅 gaps.py 需選擇性安裝 ffmpeg。技能還包含付費請求保護機制(takes.py 會顯示字數並要求確認),以及 API 金鑰安全處理方式。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/wael-wq/natural-voice-skill/tree/HEAD

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

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 上:

設定數值原因
stability0.30 至 0.40較低的值帶來「更廣的情感範圍」;預設值 0.5 比較平淡。低於 0.3 時取樣可能會不穩定。
similarity_boost0.75這是預設值;保留聲音本身的特質
style0這是預設值;任何其他值都會增加延遲
speed1.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.0stability 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 標籤。

相關技能