Cola Voice Delivery
Genera guiones largos en chino en dos voces de ListenHub y entrega cada segmento además de un MP3 fusionado completo. El flujo de trabajo existe para evitar fallos por entradas largas y sobrescrituras accidentales entre variantes de voz.
Invocación Simple
Trata la llamada a la skill más un archivo de texto adjunto como la entrada completa del usuario. No le pidas al usuario que divida, pegue, suba, renombre, descargue o fusione nada. La salida predeterminada son ambas voces:
晓曼: todos los fragmentos MP3 ordenados más un MP3 fusionadoCola: todos los fragmentos MP3 ordenados más un MP3 fusionado
El número de fragmentos es dinámico: elígelo según la longitud de la fuente y el tamaño de entrada fiable de TTS, no a partir de un número fijo. Un texto corto puede producir un fragmento; un guion de podcast largo puede producir muchos. Una ejecución exitosa no está completa hasta que todos los archivos estén presentes localmente y cada archivo se entregue con una línea MEDIA:. Si el usuario solicita explícitamente solo una voz, entrega el conjunto completo de esa voz; de lo contrario, genera ambas.
Registro de Voces
Usa estos IDs de altavoz exactos de ListenHub:
- Xiaoman / 晓曼:
chat-girl-105-cn - Cola:
chatb812x-500306f5
No sustituyas una voz por la otra. En la respuesta final, indica la voz exacta utilizada para cada grupo de archivos.
Entrada Aceptada
Acepta texto sin formato o un archivo de texto/documento adjunto. Si la entrada es un archivo de audio de podcast o una URL de podcast, transcríbelo primero con una capacidad ASR/transcripción, luego usa la transcripción resultante como fuente de narración. Mantén el orden de la transcripción y separa los hablantes o secciones cuando sean significativos.
Estrategia de Generación
Usa un pipeline de dos pasos que preserva secciones, en lugar de enviar un adjunto largo o una URL de archivo privado a ListenHub:
- Normaliza la fuente a texto hablable manteniendo el orden narrativo original y los títulos de sección significativos.
- Divide en los límites de capítulos o secciones para que cada solicitud TTS se mantenga dentro de un tamaño de entrada fiable y una solicitud fallida se pueda reintentar sin regenerar todo el libro.
- Genera el mismo conjunto de fragmentos ordenados una vez con Xiaoman y una vez con Cola. Mantén las ejecuciones de voz independientes para que un fallo o reintento en una voz no pueda reemplazar a la otra.
- Haz poll a cada episodio de ListenHub hasta que tenga éxito, luego descarga su
audioUrldevuelto. Usa la URL de audio generada, no el resumen o esquema del servicio. - Almacena los fragmentos en directorios específicos de voz y fusiona solo después de que todos los fragmentos esperados estén presentes. Verifica la duración y el tamaño para ambas salidas fusionadas.
- Entrega cada fragmento y ambos archivos fusionados. Esto hace posible el reemplazo de capítulos individuales y mantiene el audiolibro completo conveniente para reproducir.
Pasar texto de fragmento directamente es intencional: ListenHub puede rechazar rutas locales y URLs de texto subidas privadas como fuentes inválidas. Si el endpoint de ListenHub requiere específicamente una URL o fuente HTML, crea un documento HTML temporal que contenga el texto fuente escapado dentro de un elemento article, súbelo solo con la autorización del usuario, y pasa la URL resultante obtenible. Trata HTML como un transporte de respaldo, no como un reemplazo para la generación directa de fragmentos; si la URL HTML es rechazada, vuelve al texto de fragmento directo. Los nombres y directorios separados también son intencionales: un nombre de salida compartido puede sobrescribir una versión de voz previamente válida.
Flujo de Trabajo
- Lee o transcribe la entrada completa antes de generar audio. Preserva el orden y la redacción de la fuente. Elimina solo el marcado que no deba ser hablado, como la sintaxis de encabezados de Markdown, a menos que el usuario solicite una lectura literal del documento. Mantén los títulos de sección significativos y las señales de narración cuando sean parte del guion.
- Estima el tamaño de entrada fiable y divide dinámicamente. Prefiere los límites de sección (
##, títulos de capítulo, o saltos de párrafo naturales), luego divide las secciones demasiado grandes en los límites de párrafo. Usa tantos fragmentos como sea necesario; nunca fuerces un número fijo como 11. Nombra los fragmentos con índices rellenados con ceros:00,01,02, y así sucesivamente. - Para cada voz solicitada, llama a ListenHub
create_ttscon:language: zhtts_type: texttts_mode: direct- el ID de altavoz seleccionado
- el texto sin formato de exactamente un fragmento
- Haz poll a cada episodio devuelto con
check_statushasta queprocessStatusseasuccess. Registra elaudioUrldevuelto en orden de fragmento. No uses el resumen del episodio como fuente de audio; puede ser un resumen en lugar del guion proporcionado. - Descarga cada URL de audio exitosa localmente. Usa directorios separados para cada voz, por ejemplo:
xiaoman-listenhub-parts/00.mp3cola-listenhub-parts/00.mp3
- Fusiona los fragmentos de cada voz con el script incluido
scripts/merge_mp3.sho un flujo de trabajo equivalente de concat de FFmpeg. Usa nombres de salida separados y explícitos:全文朗读-晓曼-ListenHub合并版.mp3全文朗读-Cola-ListenHub合并版.mp3Nunca escribas ambas variantes en un nombre de archivo compartido.
- Verifica cada archivo fusionado con un probe de audio. Informa duración y tamaño de archivo, y asegúrate de que todos los archivos de fragmentos esperados existan antes de la entrega.
- Entrega una línea
MEDIA: /ruta/absolutapara cada archivo: ambos archivos fusionados y todos los archivos segmentados para ambas voces. No entregues solo un directorio o solo las versiones fusionadas.
Manejo de Entrada y Fallos
- Si un archivo adjunto local no se puede pasar directamente a ListenHub, léelo localmente y pasa el texto del fragmento directamente a
create_tts. No pases una ruta local como contenido de narración: ListenHub leerá la ruta literalmente o la rechazará. - Si una URL de texto subida privada es rechazada como
Invalid input at source, deja de reintentar esa URL y usa el texto de fragmento directo. - Si una generación tiene éxito pero la descarga de su
audioUrlse agota, reintenta contra el host de activos devuelto de ListenHub y preserva el ID del episodio y el mapeo de URL. - Si una generación de voz falla, no sustituyas silenciosamente la otra voz. Informa de la voz fallida y conserva los archivos de voz generados exitosamente.
- Preserva los archivos existentes eligiendo un nombre de archivo nuevo y específico de voz. Sobrescribir el archivo fusionado de una voz anterior pierde un entregable válido.
- Para un guion largo, la generación puede ser de pago y puede llevar varios minutos. Rastrea el trabajo como una tarea de varios pasos y márcalo como completado solo después de que ambos grupos de voz solicitados, sus fragmentos y sus archivos fusionados hayan sido verificados.
Verificación de Aceptación Final
Antes de responder, verifica la cadena completa, no solo que una solicitud TTS haya tenido éxito:
- El texto sin formato o la transcripción del podcast se leyó completamente y se preservó el orden de sus secciones.
- Se eligió un recuento de fragmentos dinámico a partir de la longitud de entrada; no se asumió un número de segmentos fijo.
- Los mismos índices de fragmentos elegidos dinámicamente existen para ambas voces solicitadas.
- Cada fragmento tiene un archivo MP3 descargado y no vacío.
- Cada voz tiene un MP3 fusionado separado, sin nombre de archivo compartido ni sobrescritura.
- FFprobe o un probe de audio equivalente informa duración y tamaño para ambos archivos fusionados.
- La respuesta final identifica los dos IDs de altavoz exactos y contiene una línea
MEDIA:para cada fragmento y cada archivo fusionado.
Si alguna comprobación falla, sigue trabajando o informa del fragmento/voz fallido específico; no afirmes la entrega completa.
Lista de Verificación de Entrega
- ID de altavoz correcto utilizado para cada generación
- Todas las secciones fuente cubiertas en orden
- Cada fragmento descargado para cada voz solicitada
- Los archivos fusionados tienen nombres distintos específicos de voz
- Duración y tamaño de archivo verificados
- Todos los archivos de fragmentos y ambos archivos fusionados entregados con líneas
MEDIA: