與任何人聊天 是做什麼的?
從線上影片克隆真人的聲音,或從照片設計聲音,然後使用 TTS 以該角色進行角色扮演。
重要:倫理使用與版權
此技能會合成模仿真實聲音的語音。在繼續之前,代理必須:
- 切勿冒充他人進行欺騙、詐騙或騷擾。
- 僅使用公開可用的媒體(公開演講、採訪、記者會)作為參考音訊。
- 告知使用者生成的音訊是合成的,不應將其呈現為真實錄音。
- 拒絕針對未經同意的私人個體,或明顯意圖欺騙、騷擾或誹謗的請求。
如果使用者的意圖看似有害,請禮貌拒絕並解釋原因。
先決條件
| 依賴項 | 類型 | 如何驗證 |
|---|---|---|
ffmpeg | 系統二進位檔 | ffmpeg -version |
yt-dlp | 系統二進位檔 | yt-dlp --version |
tts 技能 | Cursor 技能 | ls skills/tts/scripts/tts.py |
NOIZ_API_KEY | 環境變數或檔案 | python3 skills/tts/scripts/tts.py config --show |
在首次執行前,請驗證所有依賴項是否存在:
ffmpeg -version && yt-dlp --version && ls skills/tts/scripts/tts.py
如果缺少 yt-dlp,請安裝它:
uv pip install yt-dlp
如果未設定 Noiz API 金鑰:
python3 skills/tts/scripts/tts.py config --set-api-key YOUR_KEY
模式選擇
- 使用者指定人名(真實或虛構)--> 工作流程 A
- 使用者提供圖片,人物無法辨識 --> 工作流程 B
- 使用者提供圖片,人物是可辨識的公眾人物 --> 工作流程 A(真實聲音更真實)
- 圖片中有多人 --> 先詢問是哪個人
工作流程 A:基於姓名(從線上影片取得聲音)
使用此核對清單追蹤進度:
- [ ] A1. 釐清角色
- [ ] A2. 尋找參考影片
- [ ] A3. 下載音訊與字幕
- [ ] A4. 提取最佳參考片段
- [ ] A5. 生成語音
A1. 釐清角色
如果有歧義(例如「美國總統」、「蜘蛛人演員」),在繼續之前,請要求使用者指定確切的人物。
A2. 尋找參考影片
使用網路搜尋,尋找該人物清晰說話的 YouTube(或 Bilibili)影片。最佳候選:採訪、演講、記者會。避免有大量背景音樂的影片。
可嘗試的搜尋查詢:
{CHARACTER_NAME} interview/{CHARACTER_NAME} 採訪{CHARACTER_NAME} speech/{CHARACTER_NAME} 演講{CHARACTER_NAME} press conference
A3. 下載音訊與字幕
mkdir -p "tmp/chat_with_anyone/{CHARACTER_NAME}"
yt-dlp -x --audio-format mp3 \
--write-subs --write-auto-subs --sub-langs "en,zh-Hans" \
--convert-subs srt \
-o "tmp/chat_with_anyone/{CHARACTER_NAME}/%(title)s.%(ext)s" \
"{VIDEO_URL}"
下載後,列出輸出目錄以識別音訊檔案和 SRT 字幕檔案:
ls tmp/chat_with_anyone/{CHARACTER_NAME}/
預期輸出:一個 .mp3 音訊檔案和一個或多個 .srt 字幕檔案。
如果沒有出現字幕檔案:嘗試其他有自動產生的隱藏式字幕的影片,或為目標語言調整 --sub-langs。
A4. 提取最佳參考片段
使用自動提取腳本——它會解析 SRT,找到最密集的 3-12 秒語音區間,並將其提取為 WAV:
python3 skills/chat-with-anyone/scripts/extract_ref_segment.py \
--srt "tmp/chat_with_anyone/{CHARACTER_NAME}/{SRT_FILE}" \
--audio "tmp/chat_with_anyone/{CHARACTER_NAME}/{AUDIO_FILE}" \
-o "tmp/chat_with_anyone/{CHARACTER_NAME}/ref.wav"
該腳本會列印所選時間範圍並儲存參考 WAV。在繼續之前,請驗證輸出是否存在且非空。
如果腳本報告沒有合適的片段:嘗試對較短的片段使用 --min-duration 2,或下載不同的影片。
A5. 生成語音與角色扮演
以角色風格撰寫回覆,然後進行合成:
python3 skills/tts/scripts/tts.py \
-t "{RESPONSE_TEXT}" \
--ref-audio "tmp/chat_with_anyone/{CHARACTER_NAME}/ref.wav" \
-o "tmp/chat_with_anyone/{CHARACTER_NAME}/reply.wav"
將生成的音訊檔案連同文字一起呈現給使用者。對於後續訊息,請重複使用相同的 --ref-audio 路徑。
工作流程 B:基於圖片(從照片取得聲音)
使用此核對清單追蹤進度:
- [ ] B1. 分析圖片
- [ ] B2. 設計聲音
- [ ] B3. 預覽(可選)
- [ ] B4. 生成語音
B1. 分析圖片
使用您的視覺能力檢查圖片:
- 如果該人物是可辨識的公眾人物 --> 切換到工作流程 A 以獲得真實聲音。
- 如果無法辨識,請產出聲音描述,涵蓋:
- 性別(男 / 女)
- 大概年齡(例如「約30歲」)
- 明顯氣質(例如開朗、權威、溫柔)
- 背景線索(例如西裝 --> 專業語氣;運動服 --> 充滿活力)
B2. 設計聲音
將圖片和描述一同傳遞給聲音設計腳本:
python3 skills/chat-with-anyone/scripts/voice_design.py \
--picture "{IMAGE_PATH}" \
--voice-description "{VOICE_DESCRIPTION}" \
-o "tmp/chat_with_anyone/voice_design"
該腳本會輸出:
- 偵測到的聲音特徵(印到標準輸出)
- 輸出目錄中的預覽音訊檔案
- 包含最佳聲音 ID 的
voice_id.txt
讀取聲音 ID:
cat tmp/chat_with_anyone/voice_design/voice_id.txt
B3. 預覽(可選)
呈現來自輸出目錄的預覽音訊檔案,讓使用者可以聽到聲音。如果不滿意,請使用調整後的 --voice-description 或 --guidance-scale 重新執行 B2。
B4. 生成語音與角色扮演
python3 skills/tts/scripts/tts.py \
-t "{RESPONSE_TEXT}" \
--voice-id "{VOICE_ID}" \
-o "tmp/chat_with_anyone/voice_design/reply.wav"
對於後續訊息,請持續使用相同的 --voice-id 以保持一致。
範例:基於姓名
使用者:我想跟特朗普聊天,讓他給我講個睡前故事。
代理步驟:
- 角色:唐納·川普。無需釐清。
- 搜尋
Donald Trump speech youtube,找到一個清晰的演講影片。 - 下載:
yt-dlp -x --audio-format mp3 --write-subs --write-auto-subs --sub-langs "en" --convert-subs srt -o "tmp/chat_with_anyone/trump/%(title)s.%(ext)s" "https://youtube.com/watch?v=..." - 提取參考:
python3 skills/chat-with-anyone/scripts/extract_ref_segment.py --srt "tmp/chat_with_anyone/trump/....srt" --audio "tmp/chat_with_anyone/trump/....mp3" -o "tmp/chat_with_anyone/trump/ref.wav" - 以川普風格生成 TTS:
python3 skills/tts/scripts/tts.py -t "Let me tell you a tremendous bedtime story..." --ref-audio "tmp/chat_with_anyone/trump/ref.wav" -o "tmp/chat_with_anyone/trump/reply.wav" - 將
reply.wav和故事文字呈現給使用者。
範例:基於圖片
使用者:[上傳 photo.jpg] 我想跟這張圖片裡的人聊天
代理步驟:
- 視覺分析:無法辨識的年輕女性,約25歲,穿著休閒毛衣,溫暖的微笑。
- 設計聲音:
python3 skills/chat-with-anyone/scripts/voice_design.py --picture "photo.jpg" --voice-description "A young Chinese woman around 25, gentle and warm voice, friendly tone" -o "tmp/chat_with_anyone/voice_design" - 從
tmp/chat_with_anyone/voice_design/voice_id.txt讀取聲音 ID。 - 生成 TTS:
python3 skills/tts/scripts/tts.py -t "你好呀!很高興認識你!" --voice-id "{VOICE_ID}" -o "tmp/chat_with_anyone/voice_design/reply.wav" - 呈現音訊並使用相同的
--voice-id繼續角色扮演。
故障排除
| 問題 | 解決方案 |
|---|---|
yt-dlp 下載失敗或影片不可用 | 嘗試不同的影片網址;某些地區/影片受到限制。執行 yt-dlp -U 進行更新 |
| 沒有 SRT 字幕檔案 | 使用 --sub-lang en,zh-Hans 重新下載;如果仍然沒有,嘗試其他具有自動隱藏式字幕的影片 |
extract_ref_segment.py 找不到合適的區間 | 對較短片段使用 --min-duration 2,或嘗試不同的影片 |
| 聲音設計回傳錯誤 | 檢查 Noiz API 金鑰;確保圖片是清晰的人物照片 |
| TTS 輸出聽起來不對 | 對於工作流程 A,嘗試不同的參考影片;對於工作流程 B,調整 --voice-description |