Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Тема не новая многими уже расписана поэтому не надо кричать что то в духе Чувак это олд скул когда я искал

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 24.11.2024

Хае представителям расы программистов, кодеров и прочей нечисти ….Итак, речь пойдет о том, как заставить заговорить компьютер и главное, чтобы он хоть немного понимал, что вы говорите и отвечал. Да – да, именно говорил с вами.

Тема не новая, многими уже расписана, поэтому не надо кричать, что то в духе «Чувак, это олд скул», когда я искал материал на эту тему я выдирал ее по кусочкам, а тут все вместе будет.

Предисловие к идеи: познакомился с одной девушкой, мне она сразу очень понравилась. Естественно, встал вопрос о том, как сказать ей это по – нашему, по – программерский, я тут не буду расписывать про цветы и все такое, так как речь не о том, как понравиться девушке (здесь работает только один принцип: «Влюбитесь в девушку и она влюбиться в вас»), но концепция понятна……….(кстати, если ты это читаешь: «Привет, милая! Вот как выглядит эта магия.»)

Итак, что нам понадобиться?

  1. Руки из нужного места и навык программирования на языке высокого уровня(в моем случае это C#)
  2. Библиотека распознавания SpeechLib.dll (за ней можете стукнуть в лс)
  3. Установленный синтезатор голоса в моем случае RHVoice.
  4. Библиотека для работы со звуком NAudio.dll
  5. Понимание, что такое нейронная сеть и как она работает (класс нейронки настроен под общение о девушке поэтому вряд ли она вам понадобиться)

Начнем естественно с захвата звука из микрофона, тут нам на помощь придет либа NAudio

  1. Итак подключаем либу к шарпу (если вы не знаете как это сделать, то начните с вывода на экран «Привет, мир»)

Для того, чтобы все заработала и звук писался с майка необходимо явно определить событие

Из листинга 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;

           }

       }




1. РЕФЕРАТ Ганс Гольбейн ОГЛАВЛЕНИЕ ВВЕДЕНИЕ 1
2. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата медичних наук Київ Дисертац
3. 10 План- Введение
4. 17 в глазаВнимание Применение отличается от рекомендованного разработчиками Так вот моей маме я капал
5. ра Зборнік шванкаў Штыкера ldquo;Поп Амісrdquo;
6. Реферат- Современный этикет
7. РСО от 8 декабря 2013 г
8. Эффективность использования собственного капитала предприятия
9. Пояснительная записка3
10. Этническая психология
11. Оренбургская государственная медицинская академия министерства здравоохранения и социального развития РФ
12. тематики Вчені Філософи Мистецтво- Письменники Поети Георафія життя- Італія Рід діяльності- лік
13. экономикос появилось 2500 лет назад в заглавии сочинения древнегреческого философа Ксенофонта ойкос ~ д
14. Данилевский С.Н. Валк В
15. вариантов действий и осуществляет его например любой ход в шахматной игре
16. Клуб Внимательных Пешеходов Конкурс игра «СВЕТОФОР»
17.  Масаж і його дії на організм
18. Тема проекта- Безопасность на дорогах Название проекта- Красный жёлтый зелёный Тип- творческоинфор
19. 01 ~акушерство та гінекологія А в т о р е ф е р а т дисертації на здобуття наукового ступеня кандид
20. Тема- Створення запитів за допомогою конструктора запитів та за допомогою оператора SELECT в Visul FoxPro Мета- при