2016-09-01 13 views
0

Wit.aiを使用しているので、私は音声をテキストに使用しようとしています。私はGithubのWit3Dの例を使用しています:https://github.com/afauch/wit3d/blob/master/Assets/UserScripts/Wit3D.csWit.aiタイムアウトC#Unity

.wavファイルへのサウンドの保存と保存はうまくいきます。要求をサーバーに送信することはできません。 .wavファイルは、手動でPostmanから要求を出したときに応答を受け取るので有効です。 「エラー:要求タイムアウト」の行を削除

私は、次のエラーメッセージが表示されます

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

または要求に応じてタイムアウトを入れずに:

要求コードは次のようになります: エラー:取得時にエラーが発生しまし応答ストリーム

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

は私に応答もらえます(書き込み:認証や暗号解読に失敗しましたが) 解読するものがないので意味があります。 私のファイアウォールは問題ではないようです。タイムアウトがある理由のアイデア?バイトを取得するさまざまな方法を使用しても、それを修正することはできませんでした。

編集: コードを通常のコンソールアプリケーションに入れると機能します。これはUnityの問題のようです。

答えて

1

は、あなたのスクリプトの先頭にこれを追加します。

using System.Collections.Generic; 

は、このコードを使用します。

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

JSONパーサーを使用してwww.text値を解析します。 "_text"フィールドには結果テキストが含まれます。