Время ожидания Wit.ai C # Unity

Итак, используя Wit.ai, я пытаюсь преобразовать речь в текст. Я использую пример Wit3D из Github: https://github.com/afauch/wit3d/blob/master/Assets/UserScripts/Wit3D.cs

Запись звука и сохранение в файл .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.


person Hespen    schedule 01.09.2016    source источник


Ответы (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» содержит текст результата.

person Wellenbrecher    schedule 06.09.2016