2016-10-17 3 views
0

Je construis un serveur Java Sphinx4 avec lequel Unity3D devrait communiquer. L'envoi de données audio à partir de Unity C# vers le serveur Java fonctionne correctement. La reconnaissance vocale avec les données reçues fonctionne bien aussi. Le problème apparaît lorsque j'essaie d'envoyer des données de Java vers C#.Java Server, Client Unity C# sont en cours de congélation

Mon code actuel: JAVA

package main; 

import java.io.InputStream; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import edu.cmu.sphinx.api.Configuration; 
import edu.cmu.sphinx.api.SpeechResult; 
import edu.cmu.sphinx.api.StreamSpeechRecognizer; 

public class SpeechRecognition { 

private static StreamSpeechRecognizer recognizer; 
private static Configuration configuration; 

public static void main(String[] args) { 

    configuration = new Configuration(); 
    configuration.setAcousticModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us"); 
    configuration.setDictionaryPath("resource:/edu/cmu/sphinx/models/en-us/cmudict-en-us.dict"); 
    configuration.setLanguageModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us.lm.bin"); 

    try { 
     recognizer = new StreamSpeechRecognizer(configuration); 
     ServerSocket serverSocket = new ServerSocket(82); 

     while (System.in.available() == 0) { 
      Socket socket = serverSocket.accept(); 
      System.out.println("Client found"); 
      String recognized = RecognizeText(socket.getInputStream()); 

      System.out.println("sending now"); 
      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

      String json = recognized; 
      out.print(json); 
      out.flush(); 
      out.close(); 

      socket.close(); 
     } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    System.out.println("Quitting..."); 
    serverSocket.close(); 

} 

private static String RecognizeText(InputStream stream) throws Exception { 
    recognizer.startRecognition(stream); 
    SpeechResult result; 
    String resultString=""; 
    while ((result = recognizer.getResult()) != null) { 
     resultString = result.getHypothesis(); 
     System.out.format("Hypothesis: %s\n", resultString); 
    } 
    recognizer.stopRecognition(); 
    return resultString; 
} 

} 

Maintenant, mon code C# est comme ceci:

void Start() {  
    dataPath = Application.dataPath; 
    t = new Thread(Client); 
    t.Start(); 
} 

private void Client() 
{ 
    String input; 

    TcpClient tcpClient = new TcpClient("localhost", 82); 
    NetworkStream networkStream = tcpClient.GetStream(); 
    BinaryWriter bw = new BinaryWriter(networkStream); 

    var filepath = dataPath + "/Resources/audio/test.wav"; 
    FileStream filestream = new FileStream(filepath, FileMode.Open, FileAccess.Read); 
    BinaryReader filereader = new BinaryReader(filestream); 
    byte[] bytes = filereader.ReadBytes((Int32)filestream.Length); 
    bw.Write(bytes); 
    bw.Flush(); 

    StreamReader streamReader = new StreamReader(networkStream); 
    input = streamReader.ReadToEnd(); 
    print("Received data: " + input + "\n"); 
} 

La reconnaissance prend environ 10 secondes. Lorsque le résultat est donné, le système se fige. Println ("envoi immédiat") (en Java) n'est pas imprimé. Alors il gèle avant même qu'il ne l'atteigne. La chose étrange est: Quand je n'envoie du texte de Java à C# ou de C# à Java, cela fonctionne. Si je veux envoyer et recevoir aux deux extrémités, il se fige. Et j'ai besoin d'envoyer et de recevoir des données en même temps

Répondre

0

J'ai trouvé l'anwser: La boucle n'est pas cassée dans RecognizeText, plaçant l'instruction de retour dans la boucle while corrige le problème, car le texte reconnu sera retourné d'abord de toute façon.