La synthèse vocale (TTS) de Microsoft Azure est reconnue pour sa qualité exceptionnelle et son réalisme. Cependant, son coût peut constituer un frein pour certains projets personnels ou à petite échelle. Pour contourner cette limitation, la bibliothèque open-source edge-tts permet d'exploiter les moteurs vocaux intégrés au navigateur Microsoft Edge. Cette approche offre une alternative gratuite et performante pour convertir du texte en audio sans nécessiter d'abonnement Azure.
Utilisation en ligne de commande
La première étape consiste à installer le paquet via le gestionnaire de paquets Python :
pip install edge-tts
Une fois l'installation terminée, vous pouvez vérifier que l'outil est correctement configuré en affichant le menu d'aide :
edge-tts --help
Pour découvrir les voix disponibles, utilisez la commande suivante. Le moteur Edge propose des centaines de voix couvrant la majorité des langues et dialectes mondiaux, avec des déclinaisons masculines et féminines :
edge-tts --list-voices
La sortie affiche le nom technique de la voix (par exemple, fr-FR-DeniseNeural) et son genre. Vous pouvez ensuite générer un fichier audio en spécifiant la voix, le texte et le nom du fichier de sortie :
edge-tts --voice fr-FR-DeniseNeural --text "Bienvenue dans ce tutoriel sur la synthèse vocale." --write-media accueil.mp3
En plus du fichier audio, l'outil génère automatiquement un fichier de sous-titres au format WEBVTT, synchronisant parfaitement le texte avec le flux audio.
Il est également possible d'ajuster les paramètres de lecture directement via la ligne de commande. Par exemple, pour modifier la vitesse et le volume :
edge-tts --rate=+20% --volume=-10% --voice fr-FR-DeniseNeural --text "Test de modulation des paramètres audio." --write-media module.mp3
Le paramètre --rate accepte des pourcentages positifs ou négatifs pour accélérer ou ralentir la diction, tandis que --volume ajuste l'intensité sonore. Notez que contrairement à l'API officielle Azure, cette bibliothèque open-source ne prend pas en charge le balisage SSML pour des ajustements fins comme l'intonation ou l'émotion.
Intégration dans des scripts Python
Pour une utilistaion plus avancée, edge-tts expose une API asynchrone permettant d'intégrer la synthèse vocale directement dans vos applications Python.
Voici un exemple basique de génération de fichier audio :
import asyncio
import edge_tts
async def generer_audio() -> None:
texte_source = "Bonjour, ceci est un test de conversion de texte en parole."
voix_cible = "fr-FR-HenriNeural"
destination_fichier = "sortie_audio.mp3"
moteur_tts = edge_tts.Communicate(texte_source, voix_cible)
await moteur_tts.save(destination_fichier)
if __name__ == "__main__":
asyncio.run(generer_audio())
Vous pouvez également utiliser le gestionnaire de voix intégré pour filtrer et sélectionnner dynamiquement une voix correspondant à des critères spécifiques, comme la langue et le genre :
import asyncio
import edge_tts
from edge_tts import VoicesManager
async def synthetiser_aleatoire() -> None:
phrase = "Découverte dynamique des voix disponibles."
fichier_cible = "decouverte.mp3"
gestionnaire = await VoicesManager.create()
voix_trouvees = gestionnaire.find(Gender="Female", Language="fr")
if voix_trouvees:
voix_selectionnee = voix_trouvees[0]["Name"]
synthese = edge_tts.Communicate(phrase, voix_selectionnee)
await synthese.save(fichier_cible)
if __name__ == "__main__":
asyncio.run(synthetiser_aleatoire())
Enfin, pour les projets nécessitant un sous-titrage précis, il est possible de capturer le flux de données segment par segment. Cela permet d'écrire le flux audio et de construire le fichier de sous-titres simultanément en exploitant les limites temporelles des mots :
import asyncio
import edge_tts
async def produire_media_et_sous_titres() -> None:
contenu = "Génération simultanée de l'audio et des sous-titres synchronisés."
voix = "fr-FR-DeniseNeural"
chemin_mp3 = "media_final.mp3"
chemin_vtt = "sous_titres.vtt"
flux_tts = edge_tts.Communicate(contenu, voix)
fabrique_sous_titres = edge_tts.SubMaker()
with open(chemin_mp3, "wb") as flux_audio:
async for segment in flux_tts.stream():
if segment["type"] == "audio":
flux_audio.write(segment["data"])
elif segment["type"] == "WordBoundary":
fabrique_sous_titres.create_sub(
(segment["offset"], segment["duration"]),
segment["text"]
)
with open(chemin_vtt, "w", encoding="utf-8") as flux_texte:
flux_texte.write(fabrique_sous_titres.generate_subs())
if __name__ == "__main__":
asyncio.run(produire_media_et_sous_titres())
Ce script écrit les données binaires brutes dans le fichier MP3 tout en alimentant l'instance SubMaker avec les décalages temporels, générant ainsi un fichier VTT parfaitement aligné pour une intégration vidéo ultérieure via des outils comme FFmpeg.