Cola 語音交付
以 ListenHub 兩種指定的語音生成長篇中文腳本,並交付每個片段以及完整的合併 MP3。此工作流程旨在防止長輸入失敗以及語音變體之間的意外覆蓋。
簡單呼叫
將技能呼叫加上附件的文字檔案視為完整的使用者輸入。請勿要求使用者自行分割、貼上、上傳、重新命名、下載或合併任何內容。預設輸出包含兩種語音:
曉曼:所有有序的 MP3 片段加上一個合併的 MP3Cola:所有有序的 MP3 片段加上一個合併的 MP3
片段數量是動態的:根據來源長度和可靠的 TTS 輸入大小來選擇,而不是用固定的數量。短文字可能只產生一個片段;長 Podcast 腳本可能產生許多片段。成功的執行直到所有檔案都存在於本地,且每個檔案都以 MEDIA: 行交付才算完成。如果使用者明確要求僅一種語音,則交付該語音的完整集合;否則生成兩種語音的完整集合。
語音註冊表
使用以下精確的 ListenHub 播音員 ID:
- Xiaoman / 曉曼:
chat-girl-105-cn - Cola:
chatb812x-500306f5
請勿互相替代。在最終回應中,需說明每個檔案組所使用的確切語音。
接受的輸入
接受純文字或附加的文字/文件檔案。如果輸入是 Podcast 音訊檔案或 Podcast URL,請先使用 ASR/語音辨識功能進行轉錄,然後使用產生的逐字稿作為旁白來源。保留逐字稿的順序,並在有意義時區分不同的說話者或章節。
生成策略
使用兩階段、保留章節的管線,而非將長附件或私有檔案 URL 直接傳送給 ListenHub:
- 將來源標準化為可朗讀的文字,同時保留原始敘述順序和有意義的章節標題。
- 在章節或段落邊界處分割,使每個 TTS 請求保持在可靠的輸入大小內,並且失敗的請求可以重試,而無需重新生成整個作品。
- 分別使用曉曼和 Cola 生成相同的有序片段集合。保持語音執行的獨立性,使一種語音的失敗或重試不會取代另一種語音。
- 輪詢每個 ListenHub 集數直到成功,然後下載其回傳的
audioUrl。使用生成的音訊 URL,而非服務的摘要或大綱。 - 將片段儲存在特定語音的目錄下,並在每個預期的片段都存在後才進行合併。驗證兩個合併輸出的時長和大小。
- 交付每個片段和兩個合併檔案。這樣可以實現單一章節的替換,同時保持有聲書的完整播放便利性。
直接傳遞原始片段文字是有意為之:ListenHub 可能會拒絕本地路徑和私有的上傳文字 URL 作為無效來源。如果 ListenHub 端點特別要求 URL 或 HTML 來源,請建立一個包含跳脫來源文字的臨時 HTML 文件(置於 article 元素內),僅在使用者授權後上傳,並傳遞產生的可獲取 URL。將 HTML 視為備用傳輸方式,而非取代直接片段生成;如果 HTML URL 被拒絕,請恢復為直接片段文字。分離的名稱和目錄同樣是有意為之:共享的輸出名稱可能會覆蓋先前有效的語音版本。
工作流程
- 在生成音訊之前,讀取完整的輸入或轉錄內容。保留來源順序和措辭。僅移除不應朗讀的標記,例如 Markdown 標題語法,除非使用者要求逐字朗讀文件。當標題是腳本的一部分時,保留有意義的章節標題和旁白提示。
- 估計可靠的輸入大小並動態分割。優先選擇章節邊界(
##、章節標題或自然段落分隔),然後在段落邊界處分割過大的區塊。根據需要任意數量的片段;切勿強制固定數量(例如 11 個)。使用零填充索引命名片段:00、01、02,以此類推。 - 對於每種要求的語音,使用以下參數呼叫 ListenHub
create_tts:language: zhtts_type: texttts_mode: direct- 所選播音員 ID
- 恰好一個片段的原始文字
- 使用
check_status輪詢每個回傳的集數,直到processStatus為success。按片段順序記錄回傳的audioUrl。請勿將集數大綱用作音訊來源;它可能是摘要而非提供的腳本。 - 在本地下載每個成功的音訊 URL。為每種語音使用單獨的目錄,例如:
xiaoman-listenhub-parts/00.mp3cola-listenhub-parts/00.mp3
- 使用內建的
scripts/merge_mp3.sh或等價的 FFmpeg concat 工作流程合併每種語音的片段。使用獨立且明確的輸出名稱:全文朗讀-曉曼-ListenHub合併版.mp3全文朗讀-Cola-ListenHub合併版.mp3切勿將兩個變體寫入共享的檔名。
- 使用音訊探測器驗證每個合併檔案。報告時長和檔案大小,並在交付前確保所有預期的片段檔案都存在。
- 為每個檔案交付一條
MEDIA: /absolute/path行:包括兩個合併檔案以及兩種語音的所有分段檔案。請勿僅交付目錄或僅交付合併版本。
輸入與故障處理
- 如果本地附件無法直接傳遞給 ListenHub,則在本機讀取它,並直接將片段文字傳遞給
create_tts。請勿將本地路徑作為旁白內容傳遞:ListenHub 會逐字讀取路徑或拒絕它。 - 如果私有的上傳文字 URL 因
Invalid input at source而被拒絕,請停止重試該 URL,改用直接片段文字。 - 如果生成成功但下載其
audioUrl超時,請針對回傳的 ListenHub 資產主機重試,並保留集數 ID 和 URL 映射。 - 如果語音生成失敗,請勿悄悄替換為另一種語音。報告失敗的語音,並保留任何成功生成的語音檔案。
- 透過選擇新的、特定語音的檔名來保留現有檔案。覆蓋先前語音的合併檔案會導致有效的可交付成果遺失。
- 對於長腳本,生成可能需要付費且耗時數分鐘。將此工作追蹤為多步驟任務,僅在兩種要求的語音組、其片段和合併檔案都經過驗證後,才標記為完成。
最終驗收檢查
在回答之前,驗證完整鏈條,而不僅僅是某個 TTS 請求成功:
- 原始文字或 Podcast 逐字稿已被完整讀取,且其章節順序已被保留。
- 根據輸入長度選擇了動態片段數量;未假定固定區段數量。
- 兩種要求的語音都存在相同的動態選取片段索引。
- 每個片段都有一個已下載且非空的 MP3 檔案。
- 每種語音都有一個單獨的合併 MP3,沒有共享檔名或覆蓋。
- FFprobe 或等價的音訊探測器報告兩個合併檔案的時長和大小。
- 最終回應標明兩個精確的播音員 ID,並包含每個片段和每個合併檔案的一條
MEDIA:行。
如果任何檢查失敗,繼續處理或報告特定的失敗語音/片段;請勿聲稱完整交付。
交付檢查清單
- 每次生成都使用了正確的播音員 ID
- 所有來源章節均已按順序涵蓋
- 每種要求的語音的每個片段都已被下載
- 合併檔案具有區分語音的獨立名稱
- 時長和檔案大小已檢查
- 所有片段檔案和兩個合併檔案均已透過
MEDIA:行交付