2016-09-01 1 views
0

So benutze ich Wit.ai Ich versuche, Sprache zu Text zu verwenden. Ich verwende das Wit3D-Beispiel von Github: https://github.com/afauch/wit3d/blob/master/Assets/UserScripts/Wit3D.csWit.ai Time-out C# Einheit

Aufnahme von Sound und Speichern in der WAV-Datei funktioniert gut. Senden der Anfrage an den Server nicht. Die .wav-Datei ist gültig, da ich eine Antwort erhalte, wenn ich manuell eine Anfrage über Postman mache.

Der Anforderungs-Code sieht wie folgt aus:

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"; 
    } 
} 

mit oder ohne Timeout auf Antrag stellen ich folgende Fehlermeldung: „Fehler: Die Anforderung timed-out“

die Zeile Entfernen :

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

Wird mir eine Antwort erhalten: Fehler: Fehler beim Abrufen der Antwortstream (Write. Die Authentifizierung oder Entschlüsselung fehlgeschlagen) Das macht Sinn, weil es nichts zu entschlüsseln gibt. Meine Firewall scheint nicht das Problem zu sein. Irgendwelche Ideen, warum es eine Auszeit gibt? Die Verwendung verschiedener Methoden zum Abrufen eines Bytes [] hat es auch nicht behoben.

EDIT: Setzen Sie den Code in einer normalen Konsolenanwendung funktioniert. Das scheint also eine Unity-Frage zu sein.

Antwort

1

Fügen Sie diese zu Anfang des Skripts:

using System.Collections.Generic; 

Verwenden Sie diesen 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); 
} 

Verwenden Sie einen JSON-Parser, um www.text-Wert zu analysieren. Das Feld "_text" enthält den Ergebnistext.