![]() |
Методы на C# для распознавания голоса через яндекс апиНабросал проходную программу на C# для работы с голосом, тут выложу несколько методов, чтобы не потерялись, мало ли еще пригодится. Методы сырые, писались на скорую руку, многое не по учебнику, так что для продакшн пойдут как основа, не более. Но основа хорошая. Список методов:
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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда. ![]() |
© upread.ru 2013-2023 При перепечатке активная ссылка на сайт обязательна. |