Google Speech Api получает текст из аудиофайла, возвращающего {"result":[]} в C#
Я пытаюсь создать приложение для Windows, в котором я могу взять имеющийся у меня аудиофайл и преобразовать голос в него в текстовый файл с помощью API распознавания речи Google. Вот что я сделал:
1) Я зашел сюда https://groups.google.com/a/chromium.org/forum/?fromgroups и стал участником.
2) Я зашел в консоль разработчиков Google и успешно сгенерировал ключ API.
3) Я получил код онлайн и запустил его:
private void btnGoogle_Click(object sender, EventArgs e)
{
string path = @"Z:\path\to\audio\file\good-morning-google.flac";
try
{
FileStream fileStream = File.OpenRead(path);
MemoryStream memoryStream = new MemoryStream();
memoryStream.SetLength(fileStream.Length);
fileStream.Read(memoryStream.GetBuffer(), 0, (int)fileStream.Length);
byte[] BA_AudioFile = memoryStream.GetBuffer();
HttpWebRequest _HWR_SpeechToText = null;
_HWR_SpeechToText =
(HttpWebRequest)HttpWebRequest.Create(
"https://www.google.com/speech-api/v2/recognize?output=json&lang=en-us&key=your-api-key-here");
_HWR_SpeechToText.Credentials = CredentialCache.DefaultCredentials;
_HWR_SpeechToText.Method = "POST";
_HWR_SpeechToText.ContentType = "audio/x-flac; rate=44100";
_HWR_SpeechToText.ContentLength = BA_AudioFile.Length;
Stream stream = _HWR_SpeechToText.GetRequestStream();
stream.Write(BA_AudioFile, 0, BA_AudioFile.Length);
stream.Close();
HttpWebResponse HWR_Response = (HttpWebResponse)_HWR_SpeechToText.GetResponse();
if (HWR_Response.StatusCode == HttpStatusCode.OK)
{
Console.WriteLine("looks ok...");
StreamReader SR_Response = new StreamReader(HWR_Response.GetResponseStream());
Console.WriteLine(SR_Response.ReadToEnd());
Console.WriteLine(SR_Response.ReadToEnd());
Console.WriteLine("Done");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
Код выше работает. Это дает мне следующий вывод:
looks ok...
{"result":[]}
Таким образом, я знаю, что я получаю HttpStatusCode.OK
ответ, потому что looks ok...
строка журнала выполняется.
Тем не менее, результат совершенно пустой... Почему это так? Я делаю что-то неправильно?
РЕДАКТИРОВАТЬ: Вот где я получил аудио-файл: https://github.com/gillesdemey/google-speech-v2
2 ответа
Прежде всего, ваш код сложнее, чем нужно, я использовал это:
string api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
string path = @"C:\temp\good-morning-google.flac";
byte[] bytes = System.IO.File.ReadAllBytes(path);
WebClient client = new WebClient();
client.Headers.Add("Content-Type", "audio/x-flac; rate=44100");
byte[] result = client.UploadData(string.Format(
"https://www.google.com/speech-api/v2/recognize?client=chromium&lang=en-us&key={0}", api_key), "POST", bytes);
string s = client.Encoding.GetString(result);
Второй вопрос, который у вас есть, это ваш аудиофайл! Это в 32-битном стерео. Это должен быть 16-битный PCM Mono. Так что конвертируйте в моно и уменьшите до 16 бит. Я использовал http://www.audacityteam.org/ для конвертации вашего файла. Смотрите скриншот.
Тогда я получил этот ответ:
{"result":[]}
{"result":[{"alternative":[{"transcript":"good morning Google how are you feeling today","confidence":0.987629}],"final":true}],"result_index":0}
Если API Google не дают результата, существует высокая вероятность того, что он не сможет выполнить запрос. Так что в вашем коде нет ничего плохого, только тестовое аудио. Вы пробовали другой аудио файл? Я знаю это, потому что я работал с Google Custom Search API. Если результат не найден, он вернется пустым.