Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Хае представителям расы программистов, кодеров и прочей нечисти ….Итак, речь пойдет о том, как заставить заговорить компьютер и главное, чтобы он хоть немного понимал, что вы говорите и отвечал. Да да, именно говорил с вами.
Тема не новая, многими уже расписана, поэтому не надо кричать, что то в духе «Чувак, это олд скул», когда я искал материал на эту тему я выдирал ее по кусочкам, а тут все вместе будет.
Предисловие к идеи: познакомился с одной девушкой, мне она сразу очень понравилась. Естественно, встал вопрос о том, как сказать ей это по нашему, по программерский, я тут не буду расписывать про цветы и все такое, так как речь не о том, как понравиться девушке (здесь работает только один принцип: «Влюбитесь в девушку и она влюбиться в вас»), но концепция понятна……….(кстати, если ты это читаешь: «Привет, милая! Вот как выглядит эта магия.»)
Итак, что нам понадобиться?
Начнем естественно с захвата звука из микрофона, тут нам на помощь придет либа NAudio
Для того, чтобы все заработала и звук писался с майка необходимо явно определить событие
Из листинга 1. В нем мы просто вызывает наш event с шаблонным делегатом:
Событие определили, теперь, конечно, нам нужен сам объект и подписаться на сие событие:
Но мы программисты засранцы еще те, поэтому мы забыли определить другое событие, а именно, остановка записи, которое будет срабатывать вызовом метода StopRecording()!
Итак вешаем на кнопку «Начать запись» следующий код
wave = new WaveIn();
//Дефолтное устройство для записи (если оно имеется)
wave.DeviceNumber = 0;
//Прикрепляем к событию DataAvailable обработчик, возникающий при наличии записываемых данных
wave.DataAvailable += waveIn_DataAvailable;
//Прикрепляем обработчик завершения записи
wave.RecordingStopped += waveIn_RecordingStopped;
//Формат wav-файла - принимает параметры - частоту дискретизации и количество каналов(здесь mono)
wave.WaveFormat = new WaveFormat(8000, 1);
//Инициализируем объект WaveFileWriter
writer = new WaveFileWriter(FILE_NAME, wave.WaveFormat);
//Начало записи
wave.StartRecording();
В данном случае имя файла находиться в константе FILE_NAME
И в дальнейшем я доработал это дело до частотного анализа, чтобы не приходилось нажимать кнопки, но в силу на тот момент ограниченности времени (так как у меня времени было меньше 5 часов, до встречи) мне пришлось действовать именно так. Кому интересно могу скинуть доработку с UI графикой и полной автоматизацией.
А теперь к делу, звук то мы записали, всё, мы клевые парни, но это только начало пути, теперь машина должна понять, че вы там нагородили ей в микрофон. Для этого, мы конечно будем использовать уже всем нам полюбившуюся распознавалочку от гугл! Вот тут то нам и понадобиться либа (собственного написания) SpeechLib.dll (не путать со стандартной либой встроенной в любую ОС от Майкрософта).
В принципе, внутренности опишу вкратце, сначала мы конвертирует из Wave во формат Flac, так как именно этот формат гугл принимает, после чего собственно его и отправляем на гугл, и читаем уже ответ в формате JSon. В моем случае пришлось применить еще либу CUETools для перевода формата……..а после реализации дело свелось только к вызове двух методов:
Итак останавливаем запись с помощью метода: wave.StopRecording();
И собственно начинаем само распознавание:
label1.Text = JSon.Parse(SpeechLibBySooLFAA.SendFileRequest(FILE_NAME, "voice.flac")).hypotheses[0].utterance;
в одну строчку мы вызываем все действия: конвертирование отсылка чтение ответа парсинг в объект формата JSon.
УРА! Мы получили распознанный текст, теперь дело нашей нейронки, класс нейронной сети подбирался с помощью Neuro. Обучение происходило шаблонами…..я не буду описывать как писать нейронку так как это выходит за рамки данной статьи, просто скажу что она содержала.
Во первых, конечно программа должна была поздороваться со мной, если я произношу свое имя в разном контексте и здороваюсь сам с ней.
Во вторых, я должен представить программе девушку, опять же в разных контекстах программа в общем должна понять и отреагировать примерно так:
- (Я)«Знакомься это девушка, <Имя девушки>!»
- (Программа)«<Имя девушки>, очень приятно, (представляется, говорит, что я рассказывал ей про эту девушку, и что она мне нравится)»
- Дальше я с ней начинаю сердито ругаться, чтобы мол программа не болтала лишнего, а она наоборот должна была настоять на своем, обвинить меня в том, что нечего стрематься и так далее….. после нашего диалога, программа уже сама включает красивую музыку и выводит сообщение с признанием…… (Вот так мне удалось оригинально немного удивить девушку)
В планах разработать программу по типу «Умный дом» и основные рутинные действия перенести на голос.
Ну а сам синтез проще простого, установив RHVoicе мы используем стандартный .Net класс SpeechSynthesizer.
Сам код выглядит вот так:
SpeechSynthesizer speaker = new SpeechSynthesizer();
speaker.SelectVoice("RHVoice Elena (Russian)"); //выбор голоса
speaker.Rate = 1; //Десритизация
speaker.Volume = 100; //Уровень звука
speaker.SpeakAsync(Neuro.Answer(label.text)); //Метод для воспроизведения
Ну вот в принципе и все, статья обозреватель, поэтому детализировано писать не вижу смысла….Ну а чем все кончилось?! А это уже [Access Denied].
Листинг 1. Начало записи.
void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new EventHandler<WaveInEventArgs>(waveIn_DataAvailable), sender, e);
}
else
{
//Записываем данные из буфера в файл
writer.WriteData(e.Buffer, 0, e.BytesRecorded);
}
}
Листинг 2. Остановка записи!
private void waveIn_RecordingStopped(object sender, EventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new EventHandler(waveIn_RecordingStopped), sender, e);
}
else
{
wave.Dispose();
wave = null;
writer.Close();
writer = null;
}
}