Методы на C# для распознавания голоса через яндекс апи
Набросал проходную программу на C# для работы с голосом, тут выложу несколько методов, чтобы не потерялись, мало ли еще пригодится. Методы сырые, писались на скорую руку, многое не по учебнику, так что для продакшн пойдут как основа, не более. Но основа хорошая. Список методов:
- Получение iam токена
- Отправка файла на синхронное распознавание в speechkit
- Запись с микрофона
- Конвертация из wav в ogg
async void getIamToken(string ya_url, string yandexPassportOauthToken) { try { HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "https://iam.api.cloud.yandex.net/iam/v1/tokens"); request.Content = new StringContent("{\"yandexPassportOauthToken\":\""+ yandexPassportOauthToken +"\"}"); request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); HttpResponseMessage response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); iamToken = responseBody.Split('"')[3]; } catch (System.Net.Http.HttpRequestException exx) { //return "err"; } }Отправка файла на синхронное распознавание в speechkit
async void sendFileToSpeech(){ string filePath = recordFile; var data = ConvertToByteArray("2.ogg"); string token = iamToken; // IAM-токен string folderId = "bекн567m"; // Идентификатор каталога string ya_url = "https://stt.api.cloud.yandex.net/speech/v1/stt:recognize?folderId=" + folderId; try{ var content = new ByteArrayContent(data); content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("audio/ogg"); client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); var response = await client.PostAsync(ya_url, content); var responseString = await response.Content.ReadAsStringAsync(); strRespYand = responseString.ToString(); Console.WriteLine(strRespYand); } catch (System.Net.Http.HttpRequestException exx) { //return "err"; } }Запись с микрофона (используем NAudio.Wave)
waveIn = new WaveIn(); waveIn.DeviceNumber = 0; string outputFilename = @"1.wav"; waveIn.WaveFormat = new WaveFormat(44100, 1); waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(waveIn_DataAvailable); waveWriter = new WaveFileWriter(outputFilename, waveIn.WaveFormat); waveIn.StartRecording(); //тут пишем if (waveIn != null){ waveIn.StopRecording(); waveIn.Dispose(); waveIn = null; } if (waveWriter != null){ waveWriter.Dispose(); waveWriter = null; }Конвертация из wav в ogg (с помощью NReco.VideoConverter )
NReco.VideoConverter.ConvertSettings st = new NReco.VideoConverter.ConvertSettings(); st.AudioCodec = "libopus"; var output = new MemoryStream(); var ffMpeg = new NReco.VideoConverter.FFMpegConverter(); ffMpeg.ConvertMedia("1.wav", (string)null, recordFile, (string)null, st); output.Seek(0, SeekOrigin.Begin); output.Dispose();С конвертацией пришлось повозиться, пока нашел решение. Ну нет простого способа, преобразовать, пришлось подключать комбайн NReco. Получилось тяжеловесно, но заработало. Но не до конца. Оказалось, что такие сконвертированные файлы яндекс не хочет распознавать – пишет ошибку длительности. Списавшись с техподдержкой, получил ответ:
То есть надо было просто добавить строчку:
st.AudioCodec = "libopus";А кто знал? Вот так и живем. Но главное, что все заработало.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.