9
votes

Entrée en streaming à System.Speech.Recognition.SpeecheclognIntitionEngine

J'essaie de faire la reconnaissance vocale "streaming" en C # à partir d'une prise TCP. Le problème que j'ai eu est que la speodrecogniticoingine.setInputtoaudiostream () semble nécessiter un flux d'une longueur définie qui peut rechercher. À l'heure actuelle, la seule façon de penser à faire de ce travail est de gérer à plusieurs reprises le reconnaissance sur une mémoire MemorMOstream, car davantage d'entrées entrent.

Voici un code pour illustrer: P>

            SpeechRecognitionEngine appRecognizer = new SpeechRecognitionEngine();

            System.Speech.AudioFormat.SpeechAudioFormatInfo formatInfo = new System.Speech.AudioFormat.SpeechAudioFormatInfo(8000, System.Speech.AudioFormat.AudioBitsPerSample.Sixteen, System.Speech.AudioFormat.AudioChannel.Mono);

            NetworkStream stream = new NetworkStream(socket,true);
            appRecognizer.SetInputToAudioStream(stream, formatInfo);
            // At the line above a "NotSupportedException" complaining that "This stream does not support seek operations."


1 commentaires

Peut-être que SetInputtodeFaultAudiodevice () est Microsoft "Black Magic" (Common), ou effectue une sorte de lotting comme vous l'avez suggéré.


5 Réponses :


2
votes

Avez-vous essayé d'envelopper le flux réseau dans un système.IO.bufferedream?

NetworkStream netStream = new NetworkStream(socket,true);
BufferedStream buffStream = new BufferedStream(netStream, 8000*16*1); // buffers 1 second worth of data
appRecognizer.SetInputToAudioStream(buffStream, formatInfo);


1 commentaires

Avez-vous vérifié que le flux tamponné est-il soutenu à la recherche de la recherche? I.e., dans le code ci-dessus, Buffstream.cansek () retourne vrai?



1
votes

J'ai fini par tamponner l'entrée, puis je l'envoie au moteur de reconnaissance vocale dans des morceaux successivement plus importants. Par exemple, je pourrais envoyer au début les premières 0,25 secondes, puis les premières 0,5 secondes, puis la première 0,75 secondes, etc. jusqu'à ce que je reçoive un résultat. Je ne sais pas si c'est le moyen le plus efficace d'y aller, mais cela donne des résultats satisfaisants pour moi.

Best of Luck, Sean


1 commentaires

J'ai aussi des problèmes avec Sapi et MemorMemstreams..juste ne peut pas le faire fonctionner bien que tout fonctionne bien de l'entrée par défaut ou du fichier. Lorsque vous avez dit que vous l'avez fait fonctionner avec un tampon, vous voulez dire que vous utilisez l'approche de la mémoire tampon que Serguei suggérait ou que vous retenez simplement la reconnaissance jusqu'à ce que le Morthstream soit plus grand? J'ai essayé les deux sans succès. Utilisez-vous les événements de speakthypothésisés, à la speakerRecrocognishing ou forçant reconnaissez RR = reconnaissez.recognicez () de temps en temps? Êtes-vous capable de poster plus de code pour vous aider? Serait très apprécié.



2
votes

Apparemment, cela ne peut pas être fait ("par conception"!). Voir http: //social.msdn. microsoft.com/forums/fr/netfxbcl/thread/fcf62d6d-19df-4ca9-9f1f-17724441f84e


0 commentaires

15
votes

J'ai une reconnaissance vocale en direct qui travaille en remplaçant la classe de flux: xxx

... et en utilisant une instance de celle-ci comme entrée de flux sur la méthode SETTINUTTOAUDIOSTREAM. Dès que le flux retourne une longueur ou le nombre retourné est inférieur à celui demandé que le moteur de reconnaissance pense que l'entrée est terminée. Cela met en place un tampon circulaire qui ne se termine jamais.


9 commentaires

Bonjour Sean, j'ai essayé de faire fonctionner votre solution mais jusqu'à présent, pas la gérer. Comme pour les autres ci-dessus, tout fonctionne bien du fichier de disque mais ne fonctionne tout simplement pas avec MemorMOstream. Est-ce que vous émettez de temps en temps une demande de reconnaissance ou pouvez-vous utiliser les événements de skitehypothésisés, reconnus par la speakerCrocommunis? Pourriez-vous publier plus de code pour vous aider? Merci!


Désolé, vous avez manqué votre question, vous y allez. Avec cela, je suis capable de faire une reconnaissance de la parole en temps réel et de diffuser également l'aliment audio sur le réseau (une partie de mon projet Open Source ISPY - ISCYCONNect.com )


Merci Sean ... Grand projet.


Vous êtes un génie Sean! La dernière version de votre code fonctionne parfaitement! Capturer la sortie de Skype et en cours d'exécution contre SAPI pour la reconnaissance vocale. Merci beaucoup pour votre aide....


Salut TimMirror Avez-vous un petit exemple de code à l'aide de SpeeckSreamer avec Skype?


@Sean Hey, pourriez-vous me donner un pointeur sur la façon d'utiliser cette classe? Il semble vraiment prometteur et j'aimerais l'utiliser. Mais comment puis-je la définir pour utiliser un flux existant?


Si vous le souhaitez, je pourrais à nouveau poser cette question (et ce moyen marque cela comme correct). Désolé de creuser cela depuis le passé ahahaha


@MonAcraft vient de lire à partir de votre flux existant et d'écrire dans celui-ci


Je l'ai eu à "reconnaître" le texte parlé sur ordinateur en utilisant ceci, mais malheureusement, c'est complètement faux pour moi essayant des méthodes Naudio ... voir Stackoverflow.com / Questions / 58678228



2
votes

Ceci est ma solution.

//client connect in
TcpClient clientSocket = ServerSocket.AcceptTcpClient();
FakeStreamer buffStream = new FakeStreamer(clientSocket);
...
//recognizer init
m_recognizer.SetInputToAudioStream(buffStream , audioFormat);
...
//recognizer end
if (buffStream != null)
    buffStream.bExit = true;


0 commentaires