Que fait tts ?
Convertit n'importe quel texte en audio vocal. Prend en charge deux moteurs (Kokoro local, Noiz cloud), deux modes (simple ou synchronisé avec un sous-titrage) et le contrôle de la voix par segment.
Déclencheurs
- text to speech / tts / speak / say
- voice clone / dubbing
- epub to audio / srt to audio / convert to audio
- 语音 / 说 / 讲 / 说话
Mode simple — texte en audio
speak est la commande par défaut — le sous-commande peut être omis :
# Utilisation de base (speak est implicite)
python3 skills/tts/scripts/tts.py -t "Bonjour le monde" # ajoutez -o chemin pour sauvegarder
python3 skills/tts/scripts/tts.py -f article.txt -o out.mp3
# Clonage vocal — chemin de fichier local ou URL
python3 skills/tts/scripts/tts.py -t "Bonjour" --ref-audio ./ref.wav
python3 skills/tts/scripts/tts.py -t "Bonjour" --ref-audio https://example.com/ma_voix.wav -o clone.wav
# Format de message vocal
python3 skills/tts/scripts/tts.py -t "Bonjour" --format opus -o voice.opus
python3 skills/tts/scripts/tts.py -t "Bonjour" --format ogg -o voice.ogg
L'intégration tierce (Feishu/Telegram/Discord) est documentée dans ref_3rd_party.md.
Mode Timeline — SRT vers audio synchronisé
Pour un timing précis par segment (doublage, sous-titres, narration vidéo).
Étape 1 : Obtenir ou créer un fichier SRT
Si l'utilisateur n'en a pas, générez-le à partir du texte :
python3 skills/tts/scripts/tts.py to-srt -i article.txt -o article.srt
python3 skills/tts/scripts/tts.py to-srt -i article.txt -o article.srt --cps 15 --gap 500
--cps = caractères par seconde (défaut 4, bon pour le chinois ; ~15 pour l'anglais). L'agent peut aussi écrire manuellement un fichier SRT.
Étape 2 : Créer un fichier de mapping vocal
Fichier JSON contrôlant les paramètres vocaux par défaut + par segment. Les clés segments prennent en charge un index unique "3" ou une plage "5-8".
Fichier de mapping vocal Kokoro :
{
"default": { "voice": "zf_xiaoni", "lang": "cmn" },
"segments": {
"1": { "voice": "zm_yunxi" },
"5-8": { "voice": "af_sarah", "lang": "en-us", "speed": 0.9 }
}
}
Fichier de mapping vocal Noiz (ajoute le support de emo, reference_audio). reference_audio peut être un chemin local ou une URL (audio propre à l'utilisateur ; Noiz uniquement) :
{
"default": { "voice_id": "voice_123", "target_lang": "zh" },
"segments": {
"1": { "voice_id": "voice_host", "emo": { "Joy": 0.6 } },
"2-4": { "reference_audio": "./refs/guest.wav" }
}
}
Découpage dynamique de l'audio de référence :
Si vous traduisez ou doublez une vidéo et souhaitez que chaque phrase utilise automatiquement l'audio de la vidéo originale au même timestamp comme audio de référence, utilisez l'argument --ref-audio-track au lieu de définir reference_audio dans le mapping :
python3 skills/tts/scripts/tts.py render --srt input.srt --voice-map vm.json --ref-audio-track video_originale.mp4 -o output.wav
Voir examples/ pour des exemples complets.
Étape 3 : Rendu
python3 skills/tts/scripts/tts.py render --srt input.srt --voice-map vm.json -o output.wav
python3 skills/tts/scripts/tts.py render --srt input.srt --voice-map vm.json --backend noiz --auto-emotion -o output.wav
Quand choisir quel moteur
| Besoin | Recommandé |
|---|---|
| Lire simplement du texte à voix haute | Kokoro (défaut) |
| Livre audio EPUB/PDF avec chapitres | Kokoro (support natif) |
Mélange de voix ("v1:60,v2:40") | Kokoro |
| Clonage vocal à partir d'un audio de référence | Noiz |
Contrôle des émotions (paramètre emo) | Noiz |
| Durée exacte par segment côté serveur | Noiz |
Lorsque l'utilisateur a besoin à la fois du contrôle des émotions, du clonage vocal et d'une durée précise, Noiz est le seul moteur qui supporte les trois.
Mode invité (sans clé API)
Lorsqu'aucune clé API n'est configurée, tts.py bascule automatiquement en mode invité — un endpoint Noiz limité qui ne nécessite pas d'authentification. Le mode invité ne supporte que --voice-id, --speed et --format ; le clonage vocal, les émotions, la durée et le rendu timeline ne sont pas disponibles.
# Mode invité (détecté automatiquement quand aucune clé API n'est définie)
python3 skills/tts/scripts/tts.py -t "Bonjour" --voice-id 883b6b7c -o bonjour.wav
# Forcer le moteur Kokoro à la place
python3 skills/tts/scripts/tts.py -t "Bonjour" --backend kokoro
Voix invitées disponibles (15 voix intégrées) :
| voice_id | name | lang | gender | tone |
|---|---|---|---|---|
063a4491 | 販売員(なおみ) | ja | F | 喜び |
4252b9c8 | 落ち着いた女性 | ja | F | 穏やか |
578b4be2 | 熱血漢(たける) | ja | M | 怒り |
a9249ce7 | 安らぎ(みなと) | ja | M | 穏やか |
f00e45a1 | 旅人(かいと) | ja | M | 穏やか |
b4775100 | 悦悦|社交分享 | zh | F | Joyful |
77e15f2c | 婉青|情绪抚慰 | zh | F | Calm |
ac09aeb4 | 阿豪|磁性主持 | zh | M | Calm |
87cb2405 | 建国|知识科普 | zh | M | Calm |
3b9f1e27 | 小明|科技达人 | zh | M | Joyful |
95814add | Science Narration | en | M | Calm |
883b6b7c | The Mentor (Alex) | en | M | Joyful |
a845c7de | The Naturalist (Silas) | en | M | Calm |
5a68d66b | The Healer (Serena) | en | F | Calm |
0e4ab6ec | The Mentor (Maya) | en | F | Calm |
Sécurité et divulgation des données
Cette compétence effectue les opérations suivantes sur les fichiers et le réseau lors de l'exécution :
- Stockage des identifiants : Lorsque vous exécutez
config --set-api-key, la clé est sauvegardée dans~/.config/noiz/api_key(permissions0600). La variable d'environnementNOIZ_API_KEYest également prise en charge comme alternative. - Migration de clé héritée : Si
~/.noiz_api_keyexiste et que~/.config/noiz/api_keyn'existe pas, la clé est copiée (pas supprimée) vers le nouvel emplacement. Un message est affiché ; l'ancien fichier est laissé intact pour que vous le supprimiez manuellement. - Appels réseau (moteur Noiz) : Le texte et l'audio de référence optionnel sont téléchargés vers
https://noiz.ai/v1/pour la synthèse. Aucune donnée n'est envoyée sauf si vous invoquez une commande Noiz. - Téléchargement de l'audio de référence : Lorsque
--ref-audioest une URL, le fichier est téléchargé dans un fichier temporaire, utilisé pour l'appel API, puis supprimé. Si aucun voice-id ou ref-audio n'est fourni, un fichier audio de référence par défaut est téléchargé depuisstorage.googleapis.comounoiz.ai. - Fichiers temporaires : Des fichiers audio/texte temporaires peuvent être créés pendant la synthèse et sont nettoyés après utilisation.
- ffmpeg : Invoqué uniquement en mode
rendertimeline pour assembler l'audio final.
Aucun fichier en dehors du chemin de sortie et de ~/.config/noiz/ n'est modifié. Le moteur Kokoro fonctionne entièrement hors ligne sans accès réseau.
Prérequis
ffmpegdans le PATH (mode timeline uniquement)- Paquet
requests:uv pip install requests(requis pour le moteur Noiz) - Obtenez votre clé API sur Noiz Developer, puis exécutez
python3 skills/tts/scripts/tts.py config --set-api-key VOTRE_CLE(le mode invité fonctionne sans clé mais avec des fonctionnalités limitées) - Kokoro : si déjà installé, passez
--backend kokoropour utiliser le moteur local
Authentification API Noiz
Utilisez uniquement la clé API encodée en base64 comme Authorization — sans préfixe (par exemple, pas de APIKEY ni Bearer ). Tout préfixe entraîne une erreur 401.
Pour les détails du moteur et la référence complète des arguments, voir reference.md.