2016-09-01 2 views
0

Donc en utilisant Wit.ai j'essaie d'utiliser la parole au texte. J'utilise l'exemple Wit3D de Github: https://github.com/afauch/wit3d/blob/master/Assets/UserScripts/Wit3D.csWit.ai Time-out C# Unity

L'enregistrement du son et l'enregistrement dans le fichier .wav fonctionnent très bien. Envoyer la demande au serveur ne fait pas. Le fichier .wav est valide car j'obtiens une réponse lors d'une demande manuelle via Postman.

Le code de requête ressemble à ceci:

string GetJSONText(string file) 
{ 
    // get the file w/ FileStream 
    FileStream filestream = new FileStream(file, FileMode.Open, FileAccess.Read); 
    BinaryReader filereader = new BinaryReader(filestream); 
    byte[] BA_AudioFile = filereader.ReadBytes((Int32)filestream.Length); 
    filestream.Close(); 
    filereader.Close(); 
    //var bytes = File.ReadAllBytes(Path.Combine(Application.dataPath, "sample.wav")); 

    // create an HttpWebRequest 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.wit.ai/speech?v=20160901"); 

    request.Method = "POST"; 
    request.Headers["Authorization"] = "Bearer 3XFWDOBVS65V5A2VZWZFBB2PHOKDWGOH"; 
    request.ContentType = "audio/wav"; 
    //request.Timeout = 10000; 

    request.GetRequestStream().Write(BA_AudioFile, 0, BA_AudioFile.Length); 

    // Process the wit.ai response 
    try 
    { 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      print("Http went through ok"); 
      StreamReader response_stream = new StreamReader(response.GetResponseStream()); 
      return response_stream.ReadToEnd(); 
     } 
     else 
     { 
      return "Error: " + response.StatusCode.ToString(); 
      return "HTTP ERROR"; 
     } 
    } 
    catch (Exception ex) 
    { 
     return "Error: " + ex.Message; 
     return "HTTP ERROR"; 
    } 
} 

Avec ou sans mettre un délai d'attente à la demande que je reçois le message d'erreur suivant: « Erreur: La demande délai d'attente dépassé »

Retrait de la ligne :

request.GetRequestStream().Write(BA_AudioFile, 0, BA_AudioFile.Length) 

me obtenir une réponse: erreur: erreur d'obtention flux de réponse (Write:. L'authentification ou le déchiffrement a échoué) Ce qui est logique, car il n'y a rien à déchiffrer. Mon pare-feu ne semble pas être le problème. Des idées de pourquoi il y a un temps mort? Utiliser différentes méthodes pour obtenir un octet [] ne l'a pas non plus résolu.

EDIT: Mettre le code dans une application de console normale fonctionne. Donc, cela semble être un problème d'unité.

Répondre

1

Ajouter ce en haut de votre script:

using System.Collections.Generic; 

Utilisez ce code.

public void SendRequest(string wavPath) 
{ 
    if(!File.Exists(wavPath)) 
    { 
     Debug.Log("Invalid wav path."); 
     return; 
    } 
    StartCoroutine(SendRequestToWitAi(wavPath)); 
} 

public IEnumerator SendRequestToWitAi(string wavPath) 
{ 
    string API_KEY = "3XFWDOBVS65V5A2VZWZFBB2PHOKDWGOH"; 

    string url = "https://api.wit.ai/speech?v=20160526"; 

    byte[] postData = File.ReadAllBytes(wavPath); 
    Dictionary<string, string> headers = new Dictionary<string, string>(); 
    headers["Content-Type"] = "audio/wav"; 
    headers["Authorization"] = "Bearer " + API_KEY; 

    float timeSent = Time.time; 
    WWW www = new WWW(url, postData, headers); 
    yield return www; 

    while (!www.isDone) 
    { 
     yield return null; 
    } 
    float duration = Time.time - timeSent; 

    if (www.error != null && www.error.Length > 0) 
    { 
     Debug.Log("Error: " + www.error + " (" + duration + " secs)"); 
     yield break; 
    } 
    Debug.Log("Success (" + duration + " secs)"); 
    Debug.Log("Result: " + www.text); 
} 

Utilisez un analyseur JSON pour analyser la valeur www.text. Le champ "_text" contient le texte du résultat.