Робот ОСА v9.0 [Голосовое управление]
|
|
Администраторы
3417 сообщений
Мужчина
|
Сейчас передо мной состоит задача осуществить голосовое управление автоматизированной системой ОСА (версия 9 - обновленное ПО). Реализация управления осуществляется на C# по примеру рабочей статьи с хабра и использовании сервиса Google по распознованию русской речи(или англоязычной) как вариант управления.
И так, что нужно реализовать: 1. Запись звука в файл .wav 2. Автоматическая отправка файла в сервис Google 3. Вывод распознанного аудио в виде текстовой строки 4. Поиск по строке схожих команд из выборки уже заложенных 5. Выполнение команды 6. Подтверждение выполнения команды. 7. Повтор пункта п.1 цикл.
5421031.jpg
(140.8 Kb)
|
|
|
|
|
Участник
74 сообщений
Мужчина
|
Было бы неплохо, если использовать в комплекте программу, которая делает анализ всего, (до отправки на сервис гугла, до записи в *.wav), ждет записанного слова до этого, чтобы к примеру выглядело так: "ОСА, выполни программу №1", программа слышит надиктованное ключевое слово "ОСА" далее отправляет последующую запись на сервис гугла. Это позволило бы сократить нагрузку на интернет соединение, и "гугл" не будет слышать все, что происходит.. Программу использовать типа драгона; горыныча; диктатора, там вроде можно надиктовать слова, задать последующее выполнение действий. В данном случае - запись и отправку на гугл.
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Ну инициализация запуска нужна конечно, и понятно дело что можно уменьшить нагрузку. Видел этого гарыныча, даже игрался с ним. Можно сделать так: 1. Ключевое слово для запуска программы записи 2. Команда 3. Ключевое слово для закрытия программы записи. 4. Ключевое слово для запуска программы распознавания. 5. Автоматическое завершение программы после выполнения команды. 6. Подтверждение успешного выполнения команды.
Цитата Пример: <ОСА> [Вперед] [200] <Выполнять> <Задачу>
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
И так, программу для распознавания я решил использовать из первого поста. Но, для моей цели нужно автоматизировать процесс записи и его отправки.
Сейчас я собираюсь интегрировать в программу выше, дополнительные функции по записи звука в wav формате.
Вопрос: 1. Использую NAudio, как я понимаю, благодаря ей можно сделать и графики потока, и другие настройки. 2. После окончания разговора с железякой, она должна автоматически завершить сеанс записи, и автоматически отправить его гуглу.
И так, как это реализовать ? По примеру если можно.
В идеале нужно сделать так: запускаем программу, которая прослушивает звук с микрофона\камеры, при достижение определенного пика, запускаем запись и, когда пики перестанут возникать в течении некоторого времени(таймер запускаем после каждого пика и ждем, если по истечению - тишина - запись прекращаем, если появился пик, обнуляем таймер)запись автоматически отправлялась на сервис гугла.
Далее, получив ответ, мы сравниваем его с базой (мб текстовый файл с построчными командами) и найдя из выборки == запускаем соответствующую задачу\процесс.
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Код using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Media; using NAudio; using NAudio.Wave; using NAudio.FileFormats; using NAudio.CoreAudioApi; namespace LL_TVator { public partial class Form1 : Form { WaveIn waveIn; WaveFileWriter writer; string outputFilename = "1.wav"; public Form1() { InitializeComponent(); }
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); } } void StopRecording() { MessageBox.Show("StopRecording"); waveIn.StopRecording(); } private void waveIn_RecordingStopped(object sender, EventArgs e) { if (this.InvokeRequired) { this.BeginInvoke(new EventHandler(waveIn_RecordingStopped), sender, e); } else { waveIn.Dispose(); waveIn = null; writer.Close(); writer = null; } } private void button1_Click(object sender, EventArgs e) { try { MessageBox.Show("Start Recording"); waveIn = new WaveIn(); waveIn.DeviceNumber = 0; waveIn.DataAvailable += waveIn_DataAvailable; waveIn.RecordingStopped += new EventHandler(waveIn_RecordingStopped); waveIn.WaveFormat = new WaveFormat(8000, 1); writer = new WaveFileWriter(outputFilename, waveIn.WaveFormat); waveIn.StartRecording(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button2_Click(object sender, EventArgs e) { if (waveIn != null) { StopRecording(); } } private void Form1_Load(object sender, EventArgs e) { } } }
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Но тут не без проблем =\ Код рабочий, но студии не нравится, одна из функций старая говорит, другая неправильно преобразование делает...
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Цитата Чуть переделанная версия. Запись производится с частотой 8кГц. Судя по описанию, хром жует от 8 -16 кГц, моно файлы. Остальное изрыгает. Сейчас на работе, не могу проверить микрофон, к сожалению, может в обед успею ))
Код using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using NAudio.Wave; using NAudio;
namespace MainWindow { public partial class Form1 : Form { public Form1() { InitializeComponent(); waveIn = new WaveIn(); waveIn.DeviceNumber = 0; waveIn.DataAvailable += waveIn_DataAvailable; waveIn.RecordingStopped += new EventHandler(waveIn_RecordingStopped); waveIn.WaveFormat = new WaveFormat(8000, 1); writer = new WaveFileWriter(outputFilename, waveIn.WaveFormat); } WaveIn waveIn; WaveFileWriter writer; string outputFilename = "demo.wav";
void waveIn_DataAvailable(object sender, WaveInEventArgs e) { writer.WriteData(e.Buffer, 0, e.BytesRecorded); }
void waveIn_RecordingStopped(object sender, EventArgs e) { waveIn.Dispose(); waveIn = null; writer.Close(); writer = null; }
private void Form1_Load(object sender, EventArgs e) {
}
private void button1_Click(object sender, EventArgs e) { waveIn.StartRecording(); }
private void button2_Click(object sender, EventArgs e) { waveIn.StopRecording(); }
private void button3_Click(object sender, EventArgs e) { waveIn.StartRecording(); }
private void button4_Click(object sender, EventArgs e) { waveIn.StopRecording(); } } }
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Это правда сырой пока кусок, имеющий только 2 кнопки - запись и стоп. Нужно сделать график, по которому наглядно можно будет отслеживать пики по OY координате, и активировать или останавливать запись.
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
4772537.png
(22.1 Kb)
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
К примеру, мы имеем ось XY, и заранее известен рабочий(звуки "мира" и тп) фон, в нейтральном положении P1, и пики - точки вершин графика, A1, A2, An, по состоянию которой мы судим обычный ли это фон, или нет. Если пики An имеют диапазон An>P2, то не реагируем, если An>p2 действуем - инициализируем запись.
Судя по примеру, микрофон должен прослушиваться в режиме Online.
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
1046838.png
(24.3 Kb)
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Если А1 превышает пороговое значение P2, активируем запись и считаем 5 секунд таймером, если по истечению 5 секунд нового Аn не появляется - сохраняем запись. Если по во время ожидания (5с) появляется новый пик An, превышающий пороговое значение P2, обнуляем счетчик, запись не останавливаем.
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Бетта тестирование проведено, запись и расспозноание работает. Скриншот с лева расспозновалка, справа запись.
На ошибки в проге не обращайте внимания, просто я запустил прогу в тот момент когда она уничтожала(пересоздавала аудиофайл и гугл не понял что ему пихают)
1067504.png
(315.7 Kb)
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
5487601.png
(18.6 Kb)
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
5054680.png
(100.1 Kb)
|
|
|
|
|