Cola 音声配信
長い中国語スクリプトを ListenHub の2つの名前付き音声で生成し、各セグメントと結合した完全版 MP3 を配信します。このワークフローは、長い入力の失敗や音声バリアント間の誤った上書きを防ぐために存在します。
シンプルな呼び出し
スキル呼び出しと添付テキストファイルを完全なユーザー入力として扱います。ユーザーに分割、貼り付け、アップロード、名前変更、ダウンロード、結合などを要求しないでください。デフォルトの出力は両方の音声です:
晓曼:すべての順序付き MP3 チャンク + 1 つのマージ済み MP3Cola:すべての順序付き MP3 チャンク + 1 つのマージ済み MP3
チャンク数は動的に決まります:ソースの長さと信頼性のある TTS 入力サイズから選択し、固定数からは選択しません。短いテキストは 1 チャンクになる場合があり、長いポッドキャストスクリプトは多数のチャンクになる場合があります。すべてのファイルがローカルに存在し、各ファイルが MEDIA: 行で配信されるまで、実行は完了しません。ユーザーが明示的に片方の音声のみを要求した場合は、その音声の完全なセットを配信し、それ以外の場合は両方を生成します。
音声レジストリ
次の ListenHub スピーカー ID を正確に使用します:
- Xiaoman / 晓曼:
chat-girl-105-cn - Cola:
chatb812x-500306f5
一方の音声をもう一方に置き換えないでください。最終応答では、各ファイルグループに使用した正確な音声を明記します。
受け入れ可能な入力
生テキストまたは添付のテキスト/ドキュメントファイルを受け入れます。入力がポッドキャスト音声ファイルまたはポッドキャスト URL の場合、まず ASR/文字起こし機能で文字起こしし、その結果をナレーションソースとして使用します。文字起こしの順序を保持し、意味のある場合は話者やセクションを分離します。
生成戦略
長い添付ファイルやプライベートファイル URL を ListenHub に直接送信するのではなく、2パスセクション保持パイプラインを使用します:
- ソースを読み上げ可能なテキストに正規化し、元のナレーション順序と意味のあるセクションタイトルを保持します。
- 各 TTS リクエストが信頼性のある入力サイズ内に収まるよう、章またはセクションの境界で分割します。これにより、失敗したリクエストを本全体を再生成せずに再試行できます。
- 同じ順序付きチャンクセットを Xiaoman で一度、Cola で一度生成します。音声の実行を独立させて、一方の音声の失敗や再試行が他方を置き換えないようにします。
- 各 ListenHub エピソードを成功までポーリングし、返された
audioUrlをダウンロードします。生成された音声 URL を使用し、サービスの概要や要約は使用しません。 - チャンクを音声固有のディレクトリに保存し、期待されるすべてのチャンクが揃った後にのみマージします。両方のマージ出力の再生時間とファイルサイズを確認します。
- すべてのチャンクと両方のマージファイルを配信します。これにより、個々のチャプターの置き換えが可能になり、完全なオーディオブックを便利に再生できます。
生のチャンクテキストを直接渡すのは意図的です:ListenHub はローカルパスやプライベートアップロードテキスト URL を無効なソースとして拒否する可能性があります。ListenHub エンドポイントが特に URL や HTML ソースを必要とする場合、エスケープされたソーステキストを含む一時的な HTML ドキュメントを作成し、ユーザーの許可を得てアップロードし、取得可能な URL を渡します。HTML はフォールバックトランスポートとして扱い、直接チャンク生成の代替とはしません。HTML URL が拒否された場合は、直接チャンクテキストに戻ります。名前とディレクトリを分離することも同様に意図的です:共有出力名は以前に有効だった音声バージョンを上書きする可能性があります。
ワークフロー
- 音声を生成する前に、完全な入力を読み取るか文字起こしします。ソースの順序と表現を保持します。Markdown 見出し構文など、読み上げるべきではないマークアップのみを削除します(ユーザーが文書の逐語読みを要求する場合を除く)。意味のあるセクションタイトルとナレーションの手がかりは、スクリプトの一部として保持します。
- 信頼性のある入力サイズを見積もり、動的に分割します。セクション境界(
##、チャプタータイトル、自然な段落区切り)を優先し、その後、過大なセクションを段落境界で分割します。必要なだけチャンクを使用し、決して 11 などの固定数を強制しません。チャンクにはゼロ埋めインデックス00、01、02などで名前を付けます。 - 要求された各音声について、ListenHub
create_ttsを次のパラメータで呼び出します:language: zhtts_type: texttts_mode: direct- 選択したスピーカー ID
- 1 チャンク分の生テキスト
- 返された各エピソードを
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行を 1 行ずつ配信します:両方のマージファイルと両方の音声のすべてのセグメントファイル。ディレクトリのみやマージ版のみを配信しないでください。
入力とエラー処理
- ローカル添付ファイルを ListenHub に直接渡せない場合は、ローカルで読み取り、チャンクテキストを直接
create_ttsに渡します。ナレーションコンテンツとしてローカルパスを渡さないでください。ListenHub はパスをそのまま読み取るか拒否します。 - プライベートアップロードテキスト URL が
Invalid input at sourceで拒否された場合は、その URL の再試行を停止し、直接チャンクテキストを使用します。 - 生成が成功したが、その
audioUrlのダウンロードがタイムアウトした場合は、返された ListenHub アセットホストに対して再試行し、エピソード ID と URL マッピングを保持します。 - 音声生成が失敗した場合は、暗黙のうちに他方の音声で代用しないでください。失敗した音声を報告し、正常に生成された音声ファイルを保持します。
- 既存のファイルを保持するため、音声固有の新しいファイル名を選択します。以前の音声のマージファイルを上書きすると、有効な配信物が失われます。
- 長いスクリプトの場合、生成は有料で数分かかる場合があります。この作業をマルチステップタスクとして追跡し、要求された両方の音声グループ、そのチャンク、およびマージファイルが確認された後にのみ完了としてマークします。
最終受け入れチェック
回答する前に、1 つの TTS リクエストが成功しただけでなく、完全なチェーンを確認します:
- 生テキストまたはポッドキャストの文字起こしが完全に読み取られ、そのセクション順序が保持されました。
- 動的なチャンク数が入力の長さから選択されました。固定セグメント数は想定されていません。
- 同じ動的に選択されたチャンクインデックスが、要求された両方の音声に存在します。
- すべてのチャンクにダウンロードされた空でない MP3 ファイルがあります。
- 各音声に別々のマージ済み MP3 があり、共有ファイル名や上書きはありません。
- FFprobe または同等の音声プローブが、両方のマージファイルの再生時間とサイズを報告します。
- 最終応答が 2 つの正確なスピーカー ID を特定し、すべてのチャンクとすべてのマージファイルに対して
MEDIA:行が 1 行ずつ含まれています。
いずれかのチェックが失敗した場合は、作業を続けるか、特定の失敗した音声/チャンクを報告します。完全な配信を主張しないでください。
配信チェックリスト
- すべての生成に正しいスピーカー ID が使用されました
- すべてのソースセクションが順序通りカバーされました
- 要求された各音声についてすべてのチャンクがダウンロードされました
- マージファイルが音声固有の名前を持っています
- 再生時間とファイルサイズが確認されました
- すべてのチャンクファイルと両方のマージファイルが
MEDIA:行で配信されました