En lisant un article de blog (il en existe encore), j'ai été attiré par un package intéressant. Basé sur PHP, il permet d'accéder aux services de Microsoft Edge sans avoir à utiliser leur API pour la fonction TTS (Text To Speech). Pour ceux qui l'ignorent, il s'agit tout simplement de la possibilité de transformer un texte écrit en une version audible. Cette fonctionnalité présente plusieurs intérêts : accessibilité, assistant, livre audio, etc. Il existe de nombreuses API, comme celle de Google (Google Cloud TTS) ou d'Amazon (Amazon Poly). Mais le package en question simplifie la tâche.
Utiliser le package de base
Comme le package de base est en PHP, on peut évidemment l'utiliser directement dans Laravel. Il suffit de l'installer :
composer require afaya/edge-tts
Ensuite, dans le code, il suffit de référencer la librairie :
use Afaya\EdgeTTS\Service\EdgeTTS;
Vous pouvez ensuite l'injecter directement dans vos classes. Vous disposez alors de plusieurs fonctionnalités :
// Informations audio
$info = $tts->getAudioInfo();
// Returns: ['size' => bytes, 'format' => 'mp3', 'estimatedDuration' => seconds]
// Durée
$duration = $tts->getDuration();
// Taille
$size = $tts->getSizeBytes();
// Voix disponibles
$voices = $tts->getVoices();
// Synthétiser un texte
$tts->synthesize("Hello, world!", 'en-US-AriaNeural', [
'rate' => '0%', // Vitesse (range: -100% to 100%)
'volume' => '0%', // Volume (range: -100% to 100%)
'pitch' => '0Hz' // Pitch (range: -100Hz to 100Hz)
]);
// Exporter
$base64Audio = $tts->toBase64(); // base64
$tts->toFile("output"); // file
$rawAudio = $tts->toRaw(); // audio stream
// Stream en temps réel
$tts->synthesizeStream(
"Your text here",
'en-US-AriaNeural',
['rate' => '10%'],
function($chunk) {
// Process each audio chunk in real-time
echo "Received chunk of " . strlen($chunk) . " bytes\n";
// You can stream this directly to output, save incrementally, etc.
}
);
Mais ça serait quand même plus pratique avec un package pensé pour Laravel, c'est pour cette raison que j'en ai créé un.
Le package pour Laravel
Créer un package pour Laravel n'est pas bien difficile à condition d'être organisé. J'avais écrit un article sur le sujet il y a très longtemps. Il mériterait sans doute un renouvellement.
Je me suis donc attelé à la tâche et vous pouvez trouver le package ici. Il suffit de l'installer :
composer require bestmomo/laravel-edge-tts
Et de publier la configuration :
php artisan vendor:publish --tag=edge-tts-config
Et ça devrait fonctionner !
La fonctionnalité la plus intéressante est certainement la route de streaming accessible :
/edge-tts/stream/stream?text=bonjour
On peut ajouter la voix, le volume, la vitesse et le pitch.
La configuration permet de disposer d'une voix par défaut.
Pour compléter, j'ai aussi prévu une directive Blade :
@edge_tts([
'text' => 'Bonjour le monde !',
'voice' => 'fr-FR-DeniseNeural',
'rate' => '+10%'
])
Le package supporte le format SSML (Speech Synthesis Markup Language) qui donne plus de contrôle sur la production générée. Par exemple :
<speak version="1.0" xml:lang="en-US">
<voice xml:lang="en-US" xml:gender="Female" name="en-US-JennyNeural">
<prosody rate="+10%" volume="+50%" pitch="+5Hz">
Hello world!
</prosody>
</voice>
</speak>
Pour être efficace, j'ai prévu deux mises en cache :
- la liste des voix pour éviter d'aller les chercher à chaque appel pour la validation
- le fichier généré pour éviter d'avoir à le recréer si on a besoin du même.
Pour les voix, c'est le cache de Laravel qui est utilisé. Pour les fichiers, ils sont stockés dans un répertoire spécifique. Pour éviter qu'il enfle indéfiniment, j'ai ajouté une commande Artisan pour faire le ménage régulièrement.
Pour compléter le package, j'ai ajouté une démo, accessible uniquement en mode développement :

Elle donne une bonne idée des possibilités du package.
Conclusion
J'espère que le package vous sera utile et que cet article vous en a donné une bonne idée. Si ça intéresse, je pourrai rédiger une série d'articles pour exposer la façon de créer ce genre de package.
Par bestmomo
Aucun commentaire