Aller au contenu

Tts Sur Son Nas


Messages recommandés

Pour ce qui est des 2 scripts que j'utilise :

Celui qui genere la wav avec la temperature les conditions météo en prenant les infos de google API :

#Get time and weather and send to airplay#

#!/bin/bash

var_url="http://www.google.com/ig/api?weather=issy%20les%20moulineaux&hl=FR"

var_weather_wget=`wget -q $var_url -O -`

var_weather_xml=`echo "$var_weather_wget" | sed 's/<forecast_conditions>.*//'`

var_weather=`echo "$var_weather_xml" | sed 's/></>n</g'`

var_date=`echo "$var_weather" | grep -e '<forecast_date' |

sed -e 's/<forecast_date data="//' -e 's/"/>//'`

var_city=`echo "$var_weather" | grep -e '<city' |

sed -e 's/<city data="//' -e 's/"/>//'`

var_condition=`echo "$var_weather" | grep -e '<condition' |

sed -e 's/<condition data="//' -e 's/"/>//'`

var_temp_f=`echo "$var_weather" | grep -e '<temp_f' |

sed -e 's/<temp_f data="//' -e 's/"/>//'`

var_temp_c=`echo "$var_weather" | grep -e '<temp_c' |

sed -e 's/<temp_c data="//' -e 's/"/>//'`

var_humidity=`echo "$var_weather" | grep -e '<humidity' |

sed -e 's/<humidity data="//' -e 's/"/>//'`

var_wind=`echo "$var_weather" | grep -e '<wind' |

sed -e 's/<wind_condition data="//' -e 's/"/>//'`

#echo "Date: $var_date"

#echo "City: $var_city"

#echo "Condition: $var_condition"

#echo "Temp: $var_temp_f Deg. Fahrenheit / $var_temp_c Deg. Celsius"

#echo "$var_humidity"

#echo "$var_wind"

#Get Time Hour / Min #

HEURE=`date '+%H'`

MINUTE=`date '+%M'`

#Generate wav

speak -v mb-fr1 -s 130 -p 30 -m -w tmp.wav "<break time="2000ms"/> /$HEURE/ heure /et /$MINUTE/ minutes.<break time="2000ms"/> Tempairature /$var_temp_c/ Degrez, <break time="2000ms"/> /$var_condition/ ."

#Send generated wav to airplay

killall synoairplayd

/usr/syno/sbin/synoairplayd --ip 192.168.0.254 --port 5000 --volume 100 --metadata {"title":"Meteo Airplay"} /volume1/homes/admin/tmp.wav

#Wait few second until Airplay stop playing wav in order to remove the wav

sleep 10

killall synoairplayd

#Remove generated wav file

rm -f tmp.wav

Le script qui fait du speech recognition a partir de l'API google.

#!/bin/sh

echo "1 SoX Sound Exchange - Convert WAV to FLAC with 16000"

sox tmp.wav message.flac rate 16k

echo "2 Submit to Google Voice Recognition"

wget -q -U "Mozilla/5.0" --post-file message.flac --header="Content-Type: audio/x-flac; rate=16000" -O - "http://www.google.com/speech-api/v1/recognize?lang=FR-fr&client=chromium" > message.ret

echo "3 SED Extract recognized text"

cat message.ret | sed 's/.*utterance":"//' | sed 's/","confidence.*//' > message.txt

echo "4 Remove Temporary Files"

rm message.flac

rm message.ret

echo "5 Show Text "

cat message.txt

J'espere que ca peut vous aider un peu.

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 145
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Meilleurs contributeurs dans ce sujet

Bonjour a tous,

Je viens de me rendre compte qu'on a utilisé l'API non documenté de GOOGLE SPEECH to TEXT mais qu'on a pas du tout utilisé l'API non documenté google TEXT to SPEECH.

AVec cette 2eme API on a meme plus besoin de ESPEAK ou de ces binaires...

Je sais c'est pas propre mais écoutez juste ce que ca donne par curiosité au niveau de la voix : http://translate.goo...%C3%A9s+celsius


wget -q -U Mozilla -O output.mp3 "http://translate.google.com/translate_tts?tl=FR&ie=UTF-8&q=Bonjour+je+mappel+DS+109.+Je+suis+vivant"

ATTENTION : C'est limité a 100 caractères.

Avantage : ca marche dans toutes les langues suffit de changer tl=FR par autre chose (et la phrase qui va avec aussi ;-)

Modifié par milpat
Lien vers le commentaire
Partager sur d’autres sites

Bha j'ai cross compilé pocketsphinx avec succès. C'est assez compliqué je regarde comment ça marche pour l'instant sur mon PC x86 Linux Mint (Ubuntu like) : http://cmusphinx.sourceforge.net/wiki/gstreamer

C'est fait pour de l'embedded (mention de ARM dans les sujets sur pocketsphinx) donc parfait pour nos NAS.

Comme j'ai réussi à cross compiler maintenant j'essaye déjà de faire marcher quelque chose de correct sur mon PC avec d'autres languages models que ceux pourris par défaut (c'est expliqué dans le lien ci dessus).

Il faut notamment que je regarde comment faire un clappeur à la place du bouton "Speak" comme dans la démo.

En tout cas quand le bouton speak est déclenché, la détection se fait au fil de l'eau donc ça doit être faisable.

On peut faire son propre language model assez simplement : http://cmusphinx.sourceforge.net/wiki/tutoriallm

La liste des languages models dispo : http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/

Je vais voir ce que donne le french :)

On va donc avoir PocketSphinx pour la reconnaissance vocale et espeak pour la synthèse vocale. Y'a plus qu'a mettre tout ça ensemble :)

Lien vers le commentaire
Partager sur d’autres sites

Tiens nous au courant de ton avancement !!!

Bon sinon voilà ce que j'ai fait c'est un peu bourrin mais cela fonctionne bien:

J'utilise le mic (assez pourrit) de ma webcam USB, le DSM l'a détecté automatiquement et je peux y accédé en /dev/dsp4

Pour trouver le votre le plus simple c'est ffmpeg avec la commande (en essayer tout les /dev/dsp...) ffmpeg -f oss -i /dev/dsp4 test.wav

Sinon voici une première version de mon programme qui effectue les taches suivantes :

- Ecoute en basse résolution

- calcul la moyenne arithmétique du son

- Si je détecte deux fois de suite une son fort et très cours (genre taper 2 fois de suite rapidement dans ces mains) je lance un enregistrement de 5s que j'envoie à Google

Cela ne fonctionne pas trop mal mais je ne vais pas aller plus loin en attendant de voir ce que peu donner pocketsphinx, l'aspect positif de ce code c'est qu'il est relativement économe en ressource (2% de CPU sur mon DS110j)


#!/opt/bin/python2.5

#-*- coding: utf8 -*-

#

# Gestion de domotique VOCAL (API Google)

# Auteur : Sp@r0

# Version 0.1 du 08122011

#

#=============================

# Chargement des dépendances

#=============================

import ossaudiodev

import struct

import time

import array

import os

import wave

import subprocess

#=============================

# Initilisation des variables

#=============================

audio_node="/dev/dsp4"	 # Source Audio

number_of_channels= 1	 # Enregistrement en mono

sample_rate_clap=10000	 # Détection du clap à 1kHZ

sample_rate_record=16000    # Enregistrement pour STT à 16kHZ

sample_len=500	   # Longueur du sample  

record_len=int(5 *sample_rate_record*2) # Longueur de l'enregistrement 4s

clap_level_start = -1000    # Niveau dedétection d'un clap

clap_level_stop = 500	 # Hystérésis pour fin de clap

clap_dur_min = 1	  # Duré min d'un clap (en cycle)

clap_dur_max = 4	  # Duré max d'un clap (en cycle)

clap_tmp = 0	    # Tempo du clap

clap_encours = 0	   # Clap en cours de test

interclap_dur_min = 10	 # Duré min d'un clap (en cycle)

interclap_dur_max = 40	 # Duré max d'un clap (en cycle)

interclap_tmp = 0	   # Tempo du clap

interclap_encours = 0	  # Clap en cours de test

sound_file = 'record.wav'


#===============================================

# Gestion de l'enregistrement

#===============================================

#def Api_STT():

#return

#===============================================

# Ouverture du port Audio pour enregistrement

#===============================================

audio_in= ossaudiodev.open(audio_node, "r")

audio_in.setparameters(ossaudiodev.AFMT_S16_LE, number_of_channels,sample_rate_clap) # Configuration pour détection du clap

#=============================

# Boucle principal

#=============================

print "========================================================"

print "	    DEMARRAGE DE LA RECONNAISSANCE VOCAL"

print "========================================================"

print "La longeur du sample est de : " + str(sample_len)

while 1:

frames_in = audio_in.read(sample_len)		    # Lecture d'un sample

try:

  average = sum(struct.unpack(str((sample_len/2))+'h',frames_in))/(sample_len/2) # Pas tout compris

except:

  average=0

#print average


#

# Gestion de la détection du clap clap

#

if (average < clap_level_start):			 # Début de clap

  clap_encours = 1

if (average >= clap_level_stop):			 # Fin de clap

  if clap_encours == 1:

   print str(clap_tmp) + " " + str(clap_dur_min) + " " + str(clap_dur_max) + " "

  clap_encours = 0

  if (clap_tmp >= clap_dur_min) and (clap_tmp <= clap_dur_max):

   print "CLAP de " + str(clap_tmp)

   if (interclap_encours == 0):

    interclap_encours = 1

   elif (interclap_tmp >= interclap_dur_min):

    print "CLAP CLAP de " + str(interclap_tmp)

    audio_in.setparameters(ossaudiodev.AFMT_S16_LE, number_of_channels,sample_rate_record) # Configuration pour STT

    print "Enregistrement en cours"

    #time.sleep(1.0)

    frames_out = audio_in.read(record_len)

    file_sound = wave.open(sound_file, 'w')

    file_sound.setparams((1, 2, sample_rate_record, 0, 'NONE', 'no compression'))

    file_sound.writeframesraw(frames_out)

    file_sound.close

    p = subprocess.Popen(args=["/opt/bin/ffmpeg -i /volume1/DevZ/iMic/record.wav -y /volume1/DevZ/iMic/record.flac"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)

    stt_output = p.stdout.readlines()

    p.wait()

    p = subprocess.Popen(args=["/opt/bin/wget -q -U \"Mozilla/5.0\" --post-file /volume1/DevZ/iMic/record.flac --header=\"Content-Type: audio/x-flac; rate=16000\" -O - \"http://www.google.com/speech-api/v1/recognize?lang=fr&client=chromium\""], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)

    stt_output = p.stdout.readlines()

    p.wait()

    print stt_output

    interclap_encours = 0

   else:

    interclap_encours = 0

if clap_encours == 1:			    # Incrémentation clap

  clap_tmp = clap_tmp + 1

  #print "Moyenne :" + str(average) + " Clap tmp :" + str(clap_tmp)

else:

  clap_tmp = 0

if (interclap_encours == 1) and (interclap_tmp < interclap_dur_max):    # Incrémentation interclap

  interclap_tmp = interclap_tmp + 1

  #print "Moyenne :" + str(average) + " interClap tmp :" + str(interclap_tmp)

else:

  interclap_tmp = 0

  interclap_encours = 0

Lien vers le commentaire
Partager sur d’autres sites

Alors j'ai une bonne est une mauvaise nouvelle, je commence par la bonne :

LA BONNE NOUVELLE : Je suis également parvenu à cross compiler pocketsphynx + compiler le module en python + écrire un programme de test (en python) + décoder avec succès sur mon DS110J le texte suivant "bonjour toi" (enregistré avec le mic de ma webcam à 2m)

LA MAUVAISE NOUVELLE : le décodage est comme qui dirait lent .. pour ne pas dire très très très très très lent ........ 22 min pour un fichier de 4 secondes :( :( :( :(

Bon faut dire aussi que j'utilise le modèle de language capable de décoder 62K mots (200 Mo), j'ai fait le teste avec 6 mots ça tombe à 4-5 min (enfin cela n'as pas compris la phrase mais c'est normal car l'utilitaire web pour créer des extraits de dictionnaires ne marche que pour l'anglais pour le français faut le faire à la main (ou plutôt avec un script pour filtrer le dictionnaires)... Mais faut étudier la doc du truc à priori on peut utiliser une autre méthode plus rapide (mais moins précises quand on à gros dictionnaire)

PS :la frai fausse API google à également décodé le même wav mais en 2 secondes ....

Modifié par Sp@r0
Lien vers le commentaire
Partager sur d’autres sites

Tu peux créer ton propre dictionnaire et lui apprendre juste quelques mots comme "météo" "heure" etc. La détection sera beaucoup plus rapide.

Je pense que tu peux utiliser le même lm et hmm tout en modifiant le dict.

Ce qui se passe actuellement c'est qu'il reconnait TOUT, ce qui est bien sûr absolument inutile dans notre cas

Lien vers le commentaire
Partager sur d’autres sites

Oui ça je m'en doute bien .....

Mais le problème ne vient pas du dict et du lm (que l'on peux simplifier et j'ai fait déjà le test même avec 6 mots dans le dico et le LM cela prends encore 5 min ) le soucis vient du hmm je pense que c'est celui ci qu'il faudrait recréer pour qu'il soit moins performants et qu'il bouffe moins de ressources

Lien vers le commentaire
Partager sur d’autres sites

@Sp@ro: c'est quoi le format "oss" dans ta commande "ffmpeg -f oss -i /dev/dsp4 test.wav" ?

Patrick

Le syno utilise le "Open Soud System"(OSS) pour gérer le son, lors de l'accès au /dev/dsp on récupère un flux brute (RAW) d'un format particulier mais il ne contient aucun entête que pourrait utiliser ffmpeg pour savoir de quel RAW il s'agit il faut donc lui préciser pour que cela fonctionne.

De même on peut procédé à l'envers pour obtenir un fichier contenant du RAW pouvant être lu directement avec cat fichier.raw > /dev/dsp l'intérêt c'est que cela ne prend quasiment aucune ressource pour lire un fichier son de ce type

Lien vers le commentaire
Partager sur d’autres sites

Pour ceux que ça intéresse un clappeur avec un prénom, il faudra passer par du keyword spotting et il n'y a pas de logiciel pour ça. Excepté un petit bout de code en développement sur sphinx4 : http://sourceforge.net/projects/cmusphinx/forums/forum/5471/topic/4810538

Donc c'est du java, donc sur Syno ça me parrait impossible, à moins que ce soit vraiment économe.

Lien vers le commentaire
Partager sur d’autres sites

En fait le soucis c'est qu'il fournisse un modèle acoustique basique pour l'anglais (je l'ai tester c'est super rapide qq secondes) mais il ne fournisse que le modèle de compétition pour le français ....

Lien vers le commentaire
Partager sur d’autres sites

Bah c'est pas grave, je crois que je vais bosser avec de l'anglais uniquement :P

Tu utilises quels modèles anglais ? Et français ? Tu as pas des erreurs avec le français ? Obligé de mettre dictcase à yes pour moi... et la détection est pourrie. Du coup je sais pas si ça vient du wav ou du hmm/lm/dic...

Lien vers le commentaire
Partager sur d’autres sites

Si si cela fonctionne bien avec pocketsphinx en français. Mais c'est juste lent mais je pense être sur une piste mais je regarderais cela plus tard j'ai un iMAc à démonter pour lui transplanter un SSD !!!

Voici la ligne de commande avec l'appli de démo (pas tester j'utilise le python mais çà à l'air de tourner)


pocketsphinx_batch \

-hmm /opt/share/pocketsphinx/model/hmm/fr/lium_french_f0/ \

-lm /opt/share/pocketsphinx/model/lm/fr/french3g62K.lm.dmp \

-dict /opt/share/pocketsphinx/model/lm/fr/frenchWords62K.dic \

-ctl bonjourtoi.wav

Le ficher Wav avec ma douce voix mélodieuse => BONJOUR TOI Sinon le code que j'utilise avec le module python et qui lui fonctionne

#!/opt/bin/python2.5

#-*- coding: utf8 -*-

import sys,os

def decodeSpeech(hmmd,lmdir,dictp,wavfile):

"""

Decodes a speech file

"""

try:

  import pocketsphinx as ps

  import sphinxbase

except:

  print """Pocket sphinx and sphixbase is not installed

  in your system. Please install it with package manager.

  """

speechRec = ps.Decoder(hmm = hmmd, lm = lmdir, dict = dictp)

wavFile = file(wavfile,'rb')

wavFile.seek(44)

speechRec.decode_raw(wavFile)

result = speechRec.get_hyp()


return result[0]


if __name__ == "__main__":

hmdir = "/opt/share/pocketsphinx/model/hmm/fr/lium_french_f0/"

lmd = "/opt/share/pocketsphinx/model/lm/fr/french3g62K.lm.dmp"

dictd = "/opt/share/pocketsphinx/model/lm/fr/frenchWords62K.dic"

wavfile = "bonjourtoi.wav"

recognised = decodeSpeech(hmdir,lmd,dictd,wavfile)

print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"

print recognised

print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"

Voici le retour que je viens d'obtenir après 20 min

INFO: ngram_search_fwdflat.c(305): Utterance vocabulary contains 227 words

INFO: ngram_search_fwdflat.c(940):	 5007 words recognized (10/fr)

INFO: ngram_search_fwdflat.c(942):   160200 senones evaluated (320/fr)

INFO: ngram_search_fwdflat.c(944):   153175 channels searched (306/fr)

INFO: ngram_search_fwdflat.c(946):    17712 words searched (35/fr)

INFO: ngram_search_fwdflat.c(948):    13107 word transitions (26/fr)

INFO: ngram_search_fwdflat.c(951): fwdflat 54.43 CPU 10.886 xRT

INFO: ngram_search_fwdflat.c(954): fwdflat 58.72 wall 11.744 xRT

INFO: ngram_search.c(1201): </s> not found in last frame, using [b].498 instead

INFO: ngram_search.c(1253): lattice start node <s>.0 end node [b].175

INFO: ngram_search.c(1281): Eliminated 1026 nodes before end node

INFO: ngram_search.c(1386): Lattice has 1710 nodes, 2998 links

INFO: ps_lattice.c(1352): Normalizer P(O) = alpha([b]:175:498) = -462574

INFO: ps_lattice.c(1390): Joint P(O,S) = -472331 P(S|O) = -9757

INFO: ngram_search.c(875): bestpath 0.58 CPU 0.116 xRT

INFO: ngram_search.c(878): bestpath 2.00 wall 0.400 xRT

INFO: ngram_search_fwdtree.c(430): TOTAL fwdtree 837.27 CPU 167.790 xRT

INFO: ngram_search_fwdtree.c(433): TOTAL fwdtree 887.01 wall 177.757 xRT

INFO: ngram_search_fwdflat.c(174): TOTAL fwdflat 54.43 CPU 10.908 xRT

INFO: ngram_search_fwdflat.c(177): TOTAL fwdflat 58.72 wall 11.767 xRT

INFO: ngram_search.c(317): TOTAL bestpath 0.58 CPU 0.116 xRT

INFO: ngram_search.c(320): TOTAL bestpath 2.00 wall 0.400 xRT

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

bonjour toi

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

PS : J'ai mis à jour mon appleTV cette aprem et malheureusement ma bidouille avec le synoairplayd ne fonctionne plus pourtant l'audio station continu de marcher, je me suis rendu compte que le daemon était piloté directement par audio station il faut que j'étudie cela....

Modifié par Sp@r0
Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.


×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.