Intégrez un modèle TTS développé en interne dans un workflow en temps réel en déployant un endpoint de streaming HTTPS acceptant du texte et renvoyant de l'audio.
Fonctionnement
Configurez le nœud TTS dans la console avec votre URL HTTPS, votre token et votre taux d'échantillonnage.
Démarrez le workflow en temps réel. Pour chaque requête TTS, le workflow envoie une requête POST contenant le texte, la voix, le taux d'échantillonnage et les métadonnées de session à votre endpoint.
Votre serveur TTS génère l'audio et le renvoie sous forme de flux via une réponse HTTP.
Le workflow transmet les segments audio aux nœuds suivants en temps réel.
Prérequis
Avant de commencer :
Votre modèle TTS est accessible sur Internet via HTTPS.
Votre serveur HTTP prend en charge les réponses en streaming.
Un modèle de workflow comportant un nœud TTS a été créé.
Configurer le nœud TTS
Définissez les paramètres suivants dans le nœud TTS :
| Paramètre | Type | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| Request URL | String | Oui | URL HTTPS de l'endpoint de votre modèle TTS. | https://www.abc.com |
| Token | String | Non | Token d'autorisation envoyé avec chaque requête. | AUJH-pfnTNMPBm6iWXcJAcWsrscb5KYaLitQhHBLKrI |
| Sample rate | Integer | Oui | Taux d'échantillonnage audio en Hz. Valeurs valides : 8000, 16000, 24000, 48000. |
48000 |
Seul l'audio mono S16LE (Signed 16-bit Little-Endian) est pris en charge. Si votre modèle utilise un autre format, rééchantillonnez sa sortie au format S16LE.
Paramètres de la requête
Lors de l'exécution, le workflow envoie une requête POST à votre endpoint avec le corps JSON suivant :
| Paramètre | Type | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| Text | String | Oui | Texte à synthétiser en parole. | Hello |
| VoiceId | String | Non | Identifiant de voix pour le modèle TTS. | <your-voice-id> |
| SampleRate | Integer | Oui | Taux d'échantillonnage en Hz. Correspond à la valeur configurée dans la console. | 48000 |
| Token | String | Non | Token d'autorisation. Correspond à la valeur configurée dans la console. | AUJH-pfnTNMPBm6iWXcJAcWsrscb5KYaLitQhHBLKrI |
| ExtendData | String | Oui | Chaîne JSON contenant des métadonnées de session et des données métier personnalisées. Champs ExtendData. | Voir ci-dessous |
Champs ExtendData
ExtendData contient les champs suivants :
| Champ | Type | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| InstanceId | String | Oui | ID de l'instance d'agent intelligent. | 68e00b6640e*****3e943332fee7 |
| ChannelId | String | Oui | ID du canal de communication. | 123 |
| SentenceId | Int | Oui | ID de session Q&R. Toutes les réponses à une même requête utilisateur partagent le même SentenceId. |
3 |
| Emotion | String | Non | Émotion appliquée à la synthèse vocale. Valeurs valides : neutral, happy, sad. Aucune émotion n'est appliquée si ce champ est omis. |
happy |
| UserData | String | Non | Données métier personnalisées transmises au démarrage de l'instance d'agent intelligent. | {"aaaa":"bbbb"} |
**Exemple de valeur ExtendData :**
{
"InstanceId": "68e00b6640e*****3e943332fee7",
"ChannelId": "123",
"SentenceId": "3",
"Emotion": "happy",
"UserData": "{\"aaaa\":\"bbbb\"}"
}
Exigences relatives à la réponse
Votre serveur TTS doit renvoyer de l'audio correspondant au ton et au taux d'échantillonnage demandés sous forme de réponse HTTP en streaming. Une latence de streaming réduite améliore directement les performances de bout en bout.
Exemple de serveur TTS
Python
Utilise aiohttp pour implémenter un serveur TTS en streaming sur l'endpoint /stream-audio.
from aiohttp import web
async def stream_audio(request):
data = await request.json()
text = data.get('Text', "")
token = data.get('Token', None)
sample_rate = data.get('SampleRate', 48000)
extend_data = data.get('ExtendData', "")
print(f"text:{text}, token:{token}, sample_rate:{sample_rate}, extend_data:{extend_data}")
# Validate the token here.
response = web.StreamResponse(
status=200,
reason='OK',
headers={'Content-Type': 'audio/mpeg'}
)
# Start the streaming response.
await response.prepare(request)
# generate_tts_data is a coroutine that yields audio chunks.
async for chunk in generate_tts_data(text, sample_rate):
await response.write(chunk)
# Signal the end of the response.
await response.write_eof()
return response
async def generate_tts_data(text: str, sample_rate: int):
# Replace this with your TTS model inference logic.
# This example reads audio data from a local PCM file.
file_path = '/your_dir/sample.pcm'
with open(file_path, 'rb') as f:
while True:
chunk = f.read(4096) # Read 4 KB per chunk.
if not chunk:
break
yield chunk
app = web.Application()
app.add_routes([web.post('/stream-audio', stream_audio)])
if __name__ == '__main__':
web.run_app(app)
En production, remplacez generate_tts_data par la logique d'inférence de votre modèle et mettez à jour /your_dir/sample.pcm avec le chemin réel de votre fichier audio.