Aller au contenu
JossAlf

Tts : Alternative À Google Translate : Voice Rss

Recommended Posts

Je viens de tomber sur ce site alors que google translate me jouait encore des tours (limitation avec demande de captcha).

 

http://www.voicerss.org.

 

Il y a une API et plein de doc.

Je me suis inscrit mais ce n'est pas vraiment utile pour l'utilisation que je veux en faire : générer des fichiers MP3 pour le diffuser sur mes squeezebox (ou sur tout autre système audio Sonos en tête) ;)

 

En version gratuite on a droit à  350 générations de TTS par jour avec l'API. Ca devrait nous suffire pour le moment.

Mais je ne sais pas si le fait d'utiliser une commande http rentre dans cette limitation de l'utilisation avec l'API (à  tester donc).

 

On peut jouer sur différents paramètres : voir la doc ici (http://www.voicerss.org/api/documentation.aspx)

 

la langue (canada) : hl=fr-ca -> si omis c'est en anglais

le codec (mp3, WAV,AAC ...) : c=AAC  -> si omis le mp3 est par défaut

l'échantillonnage : f=16khz_16bit_stereo -> si omis, c'est 8 kHz, 8 Bit, Mono par défaut

Exemple qui annonce "ouverture du portail" en français au format AAC en 16Khz  :

 

http://www.voicerss.org/controls/speech.ashx?hl=fr-fr&c=aac&f=16khz_16bit_stereo&src=Ouverture%20du%20portail

 

Voici un exemple de code qui utilise voiceRSS (ça se passe ligne 99 pour le lien vers VoiceRSS).

 

Ce code peut être placé dans un bouton d'un virtual device. On pourra l'appeler au moment de se coucher ou de fermer la maison.

 

Le code vérifie l'état des portes et annonce en TTS sur un squeezebox qu'"elles sont toutes fermées" ou que l'une ou plusieurs sont ouvertes en les nommant.

 

L'intérêt de la TTS c'est que le code est dynamique et qu'il fabrique la phrase en fonction de la situation :

"Toutes les portes sont fermées"

"Attention la porte d'entrée me semble ouverte".

"Attention il y a X portes ouvertes. Celle de la XX, et de YY, et du ZZ." -> "Attention il y a 3 portes ouvertes. Celle de la cuisine, et de l'entrée, et du portail."

 

NB : pour que la synthèse vocale soit agréable à  écouter il faut parfois jouer sur l'orthographe. Exemple : "Attention a la porteu d'entrai elle me semble ouverte ."

Je n'ai pas tout vérifié avec voiceRSS mais c'était le cas avec google.

 

J'avoue que la TTS de google est un peu plus naturelle et agréable à  entendre. Mais au moins cette solution fonctionne gratuitement 350 fois par jour ! 

-- Adresse IP du Logitech Media Server
local ipadd = "192.168.0.46"
-- le port du serveur
local portno = 9090
-- L'adresse MAC de la squeeze
local player = "00:xx:xx:29:xx:3e "
local playername = "SqueezeBox "

-- réglage du niveau sonore
local NiveauSo = 35

local notification = ""
local NombrePorte = 0

-- 32 Garage
if tonumber(fibaro:getValue(305, "value")) > 0
then
NombrePorte = NombrePorte + 1
if NombrePorte > 1 then
notification = notification.." et du garage ."
else
notification = notification.." du garage ."
end
end

-- 34 Chambre bas
if tonumber(fibaro:getValue(307, "value")) > 0 then
NombrePorte = NombrePorte + 1
if NombrePorte > 1 then
notification = notification.." et de la chambre du bas ."
else
notification = notification.." de la chambre du bas ."
end
end

-- 38 Entrée principale
if tonumber(fibaro:getValue(313, "value")) > 0 then
NombrePorte = NombrePorte + 1
if NombrePorte > 1 then
notification = notification.." et de lentrer ."
else
notification = notification.." de lentrer ."
end
end

-- 39 cuisine du bas
if tonumber(fibaro:getValue(330, "value")) > 0 then
NombrePorte = NombrePorte + 1
if NombrePorte > 1 then
notification = notification.." et de la cuisine du bas ."
else
notification = notification.." de la cuisine du bas ."
end
end

-- 45 portail
if tonumber(fibaro:getValue(45, "value")) > 0 then
NombrePorte = NombrePorte + 1
if NombrePorte > 1 then
notification = notification.." et du portail ."
else
notification = notification.." du portail ."
end
end

-- Si il n'y a pas de porte ouverte :
if NombrePorte == 0 then
notification = "Toutes les porte sont fermer."
end

-- Si il n'y a qu'un porte ouverte :
if NombrePorte == 1 then
notification = "Attention a la porteu "..notification.." elle me semble ouverte ."
end

-- Si on a plusieurs portes ouvertes :
if NombrePorte > 1 then
notification = "Attention il y a "..NombrePorte.." porte ouverte . Celle "..notification
end

-- Allumage de la squeezebox
local cmnd = "Power 1 "
local stringtosend = player .. cmnd .. string.char(10)
tcpSocket = Net.FTcpSocket(ipadd, portno)
tcpSocket:setReadTimeout(2*1000)
bytes, errorCode = tcpSocket:write(stringtosend)

-- On règle le volume sonore ici 35
local cmnd = "mixer volume " .. NiveauSo .. " "
local stringtosend = player .. cmnd .. string.char(10)
tcpSocket = Net.FTcpSocket(ipadd, portno)
tcpSocket:setReadTimeout(2*1000)
bytes, errorCode = tcpSocket:write(stringtosend)

-- On envoie le message
local notification = string.gsub((notification)," ", "%%20"); --on remplace les espaces par %20
fibaro:debug(notification)
local cmnd = "playlist play http://www.voicerss.org/controls/speech.ashx?hl=fr-fr&src=" .. notification;
local stringtosend = player .. cmnd .. string.char(10)
tcpSocket = Net.FTcpSocket(ipadd, portno)
tcpSocket:setReadTimeout(2*1000)
bytes, errorCode = tcpSocket:write(stringtosend)

-- OFF de la squeezeBox après 10 secondes
fibaro:sleep(10*1000)

local cmnd = "power 0 "
local stringtosend = player .. cmnd .. string.char(10)
tcpSocket = Net.FTcpSocket(ipadd, portno)
tcpSocket:setReadTimeout(2*1000)
bytes, errorCode = tcpSocket:write(stringtosend)

Amusez-vous bien :)

  • Upvote 6

Partager ce message


Lien à poster
Partager sur d’autres sites

POur en revenir au code du tutot       Emission Simplifiée Sur Squeezebox Tts Ou Mp3    .

 

Voici les 2 syntaxes :

 

--Google Translate TTS
local cmnd = "playlist play http://translate.google.com/translate_tts?tl=FR&ie=UTF-8&client=t&q=" .. notification;

--Voicerss TTS
local cmnd = "playlist play http://www.voicerss.org/controls/speech.ashx?hl=fr-fr&src=" .. notification;

Partager ce message


Lien à poster
Partager sur d’autres sites

pour générer des mp3 (pas du vrai TTS "live" donc, car pas d'API), j'utilise simplement ceci

http://text2speech.us/#

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Sympa le boulot,

 

L'avantage du TTS, c'est qu'on peut faire un peu ce qu'on veut au niveau message, mais c'est marrant, je ne l'utilise pas mais je serais plutot mp3, mais tout a préparer au préalable avec text2speech

 

vivement que j'utilise cela ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

j'utilise des mp3 pour diffuser un message fixe, type "les enfants, à  table !", "l'alarme de nuit est activée et une porte extérieure est ouverte", ...

Cela à  l'avantage de ne pas dépendre de l'internet, ni pas de latence.

 

Si tu veux faire un message dynamique style "Bonjour, il fait 10 degrés" tu dois passer par le TTS et la latence qui va avec

Partager ce message


Lien à poster
Partager sur d’autres sites

oui j'avais bien compris @jojo, merci pour l'explication, ca fait du bien un petit rafraichissement de neurones

 

C'est la latence du TTS qui me gene ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

@JossAlf

 

Merci.

Je vais le rajouter comme secours dans le Karotz.

Si on a réellement doit à  350 générations quotidiennes, c'est largement suffisant pour utilisation de tous les jours.

 

@jojo

Pour les messages dynamiques, il suffit de mettre en place un cache pour éviter d'interroger le service à  nouveau pour les mêmes phrases. Dans le cache, on stocke la phrase demandée et le mp3 généré.

Le TTS du Karotz fonctionne sur ce principe.

Partager ce message


Lien à poster
Partager sur d’autres sites

@Shyrka : comment tu crees le cache . car dans ce cas la, plus de souci de latence, ni avec le TTS ni avec le MP3 ?

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci JossAlf pour le tuto.

Peut tu éditer et ajouter un exemple de code dans le 1er post stp. ( c'est pour le blog ),

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour faire simple, tu as un script PHP (se nommant "tts" par exemple) hébergée sur ton NAS.

Pour générer le mp3, tu appelles ce script avec comme paramètre la phrase à  générer.

Il vérifie que la phrase généré est dans le cache.

Si c'est le cas, il revoit le mp3 correspondant se trouvant dans le cache et donc pas de latence.

Sinon, il appelle le service TTS (Voicerss par exemple) pour générer le mp3 qu'il stocke dans le cache et le renvoie. Il aura donc une latence la première fois.

 

Le Karotz utilise ce principe. On utilise la commande MD5 sur la phrase générée pour obtenir un ID unique qui sert de base pour créer les fichiers dans le cache.

 

Je n'ai pas créer de script en PHP car j'utilise un Karotz. J'ai aussi adapté le script du Karotz pour le faire tourner sur un raspberry.

Le tts est la fonction du Karotz que j'utilise le plus et comme il est assez difficile de trouver un Karotz, j'ai donc reporter cette fonction sur un raspberry.

 

Le Karotz ne retourne pas de mp3; il le lit immédiatement. J'ai du adapter celui du raspberry pour qu'il puisse aussi retourner le mp3 au lieu de le lire quand je veux, pour l'utiliser avec le SONOS.

 

Il n'est pas très compliquer de recréer ce script en PHP.

 

On peut aussi imaginer d'utiliser un PC sous Windows ou Mac pour générer les phrases pour ceux qui ont un de ces environnements tournant 24h/24.

En effet, le TTS des derniers OS (Windows et OSX) a fait d'énorme progrès.

Partager ce message


Lien à poster
Partager sur d’autres sites

@Shikra973

 

Pour OpenKarotz je vais le faire si tu veut.

Partager ce message


Lien à poster
Partager sur d’autres sites

@Shyrka973, Massalia,

Si vous pouviez nous faire un petit script / package du genre, que l'on puisse poster sur un Syno (voir ce que Lazer a fait pour ces graphes) et comment on pourrait l'inclure dans le VD sonos de Krikroff ce serait GRANDIOSE !

Partager ce message


Lien à poster
Partager sur d’autres sites

Je rejoins jojo, j'utilise beaucoup la fonction TTS du VD de Krikroff pour les SONOS et depuis quelques jours, c'est HS....

Donc si vous pouviez nous aider, ce serait génial!

Partager ce message


Lien à poster
Partager sur d’autres sites

Idem, c'est bien dommage ... Cela évite la surprise de voir monter les volets, ou la lumière s'allumée ...!!

Partager ce message


Lien à poster
Partager sur d’autres sites

Après 2 tests réussis ce matin du TTS Google sur SONOS et Squeeze Box, plus rien ne passe... avec erreur 503 affichée sur ma Squeezebox boom

Google a donc verrouillé à  nouveau les requêtes automatiques

 

Merci @JossAlf pour cette nouvelle solution de TTS que je viens de tester sur squeezebox

Partager ce message


Lien à poster
Partager sur d’autres sites

@moicphil je te fais ça dès que je trouve 10 minutes.

Envoyé de mon iPhone àl'aide de Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Edition du premier message pour y ajouter un exemple en lua.

Partager ce message


Lien à poster
Partager sur d’autres sites

@JossAlf:

Juste pour te remercier de tes contributions sur la squeezebox !

Avec un peu d'adaptation, j'ai monté un Raspberry avec un carte DAC hifiberry et du coup j'ai un système de diffusion des TTS et mp3 ànouveau parfaitement fonctionnel! (àla place de la diffusion sur les sonos)

Partager ce message


Lien à poster
Partager sur d’autres sites

@Shikra973

 

Pour OpenKarotz je vais le faire si tu veut.

Bonjour Massalia, Shikra973,

Je suis nouveau avec la Karotz, j'ai réussi à  le faire fonctionner en"local" via l'api du karotz et openkarotz (j'en profite pour te remercier du super boulôt,ça marche au poil)

Par contre avec voicerss, je ne vois pas comment faire fonctionner ce service avec le karotz. il faut un php ou ça peut fonctionner juste avec la HC2 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Je constate que le TTS du Karotz ne fonctionne plus depuis une ou deux semaines. Le TTS engine concerné est celui de Massalia: AcapelaTTS.

 

J'ai donc ajouté Voicerss au Karotz.

Il y a deux fichiers à  modifier: /www/cgi-bin/tts et /www/cgi-bin/tts.inc

 

Il faut ajouter cette fonction à  tts.inc:

function VoicerssTTS {   
   TTS=$1
   NOCACHE=$2
   MUTE=$3

   MD5FILE=""
   
   CURL_PARAM=$(echo "&hl=fr-fr&src="$TTS)                                                          
   
   MD5FILE=$(echo "$TTS" | md5sum | cut -d ' ' -f 1)
   echo $( echo \"$TTS\" | UrlDecode)  > $CNF_DATADIR/Tmp/${MD5FILE}.txt                                             
   eval $(echo "curl -A '${UA}' -o $CNF_DATADIR/Tmp/${MD5FILE}.mp3 --data '${CURL_PARAM}' http://www.voicerss.org/controls/speech.ashx" )  >>/dev/null 2>>/dev/null

   if [ "$5" != "1" ]; then
     Log "[TTS]"  "Playing sound ${MD5FILE}.mp3"  
     PlaySound $CNF_DATADIR/Tmp/${MD5FILE}.mp3
   fi

   if [ "$NOCACHE" == "1" ]; then
     rm -f $CNF_DATADIR/Tmp/${MD5FILE}.mp3   >>/dev/null 2>>/dev/null
     rm -f $CNF_DATADIR/Tmp/${MD5FILE}.txt   >>/dev/null 2>>/dev/null 
   else
     Log "[TTS]"  "Storing sound ${MD5FILE}.mp3 to cache"
   fi


   echo ${MD5FILE}   
}

Et insérer sa référence ainsi dans tts:

       case $TTS_ENGINE in
             1)  MP3_ID=$(GoogleTTS $TTS $VOICE $NO_CACHE $RAW_VOICE);;
             2)  MP3_ID=$(VioletTTS $TTS $VOICE $NO_CACHE $RAW_VOICE);;
             3)  MP3_ID=$(VoicerssTTS $TTS $NO_CACHE $MUTE);;
             *)  MP3_ID=$(AcapelaTTS $TTS $VOICE $NO_CACHE $RAW_VOICE $MUTE);;
       esac

Vous pouvez ainsi appeler la fonction tes ainsi:

http://karotz/cgi-bin/tts?engine=3&text=coucou

Si le paramètre engine est omis, c'est AcapelaTTS qui est utilisé par défaut. Il est aussi très simple de rendre VoicerssTTS par défaut.

Je préfère modifier la fonction TTS des VD Karotz en y ajoutant l'option engine.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci beaucoup, ça marche toujours impec !

J'ai aussi ajouté un adaptateur Ethernet et maintenant mon Lapinou n'est plus jamais muet  :60:

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Je rebondi sur ce sujet, certes ancien mais bon ça peut servir. L'API google fonctionne sans restriction mais il faut respecter une syntaxe et notamment ajouter un paramètre client dans l'URL et passer par le site .fr et pas .com sinon on a une erreur de réseau...

 

Exemple d'URL:

https://translate.google.fr/translate_tts?ie=UTF-8&q=message&tl=fr-FR&client=tw-ob

 

Par contre étant donné que le VD de Krikroff ne fonctionne pas chez moi, je sais maintenant générer des mp3 à la volée mais pas les faire diffuser sur mes Sonos, je poursuis mes recherches.

 

EDIT:

Autre solution basée sur l'API Google mais sans les contraintes:

https://google-translate-proxy.herokuapp.com/api/tts?query=Bonjour James. Il est 8 heures 30 minutes. Nous sommes le samedi 21 janvier 2017. Le temps est clair et la température extérieure est de moins 3 degrés celcius.&language=fr&speed=1.2

 

Cette solution fonctionne très bien, plus simple et presque plus rapide que la solution google native et en plus on peu régler la vitesse de dictée du texte ;)

Modifié par Nozoum
Ajout
  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour

 

Je viens d'intégrer les modifcations pour que le TTS fonctionne, je publie ça dans la journée. 

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Aucune contrainte? La reponse est plutot rapide?

Partager ce message


Lien à poster
Partager sur d’autres sites

×