Обнаружение человеческого голоса из ввода аудиофайла

Я пытаюсь реализовать функцию автоматической записи голоса, аналогичную приложению Talking Tom. Я использую следующий код для чтения ввода с аудиорекордера и анализа буфера:

 float totalAbsValue = 0.0f;
 short sample = 0;

 numberOfReadBytes = audioRecorder.read( audioBuffer, 0, bufferSizeInBytes);

 // Analyze Sound.
 for( int i=0; i<bufferSizeInBytes; i+=2 )
 {
     sample = (short)( (audioBuffer[i]) | audioBuffer[i + 1] << 8 );
     totalAbsValue += Math.abs( sample ) / (numberOfReadBytes/2);
 }

 // Analyze temp buffer.
 tempFloatBuffer[tempIndex%3] = totalAbsValue;
 float temp = 0.0f; 

 for( int i=0; i<3; ++i )
 temp += tempFloatBuffer[i];

Теперь я могу обнаруживать голосовой ввод, исходящий от аудиорекордера, и анализировать аудиобуфер.

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

Может ли кто-нибудь помочь мне с анализом буфера для обнаружения только человеческого голоса? Или есть другие альтернативные способы обнаружения человеческого голоса со входа диктофона?

Заранее спасибо,


person Timson    schedule 21.08.2013    source источник
comment
Знаете ли вы характеристики человеческого голоса, которые отличают его от фонового шума?   -  person icedwater    schedule 21.08.2013
comment
@icedwater Понятия не имею, приятель..   -  person Timson    schedule 21.08.2013
comment
частотный анализ в зависимости от времени + нейронная сеть должны помочь. В конце концов, это то, что люди делают естественным образом.   -  person John Dvorak    schedule 21.08.2013
comment
@vkulla42 попробовал распознавание речи. Но не повезло :(   -  person Timson    schedule 22.08.2013
comment
Звонкая речь типичного взрослого мужчины будет иметь основную частоту от 85 до 180 Гц, а речь типичной взрослой женщины — от 165 до 255 Гц (отсюда en.wikipedia.org/wiki/Voice_frequency) — как насчет того, чтобы использовать существующий метод, но сначала пропустить его через полосовой фильтр (сделайте это один раз для мужского голоса и один раз для женского голоса)? При условии, что у вас не так много шума в этих диапазонах, это может сработать для вас.   -  person Wayne Uroda    schedule 30.08.2013


Ответы (9)


Распознавание голоса не так просто. Алгоритмов несколько, некоторые из них опубликованы, например GSM ВАД. Доступно несколько библиотек VAD с открытым исходным кодом, некоторые из них обсуждаются здесь.

person msh    schedule 30.08.2013

Для обнаружения голоса попробуйте алгоритм ftt.

Для шума попробуйте библиотеку speex.

person afpro    schedule 02.09.2013

Если вы хотите иметь чистую запись, вы можете

  1. Отфильтруйте шум от голоса, для этого вы можете использовать БПФ и применить фильтры, такие как фильтры нижних частот, верхних частот и полосовые фильтры Фильтрация с использованием FFT и Фильтры

2. После фильтрации шум уменьшится, и вы сможете использовать API распознавания голоса.

API

Чем больше фильтров, тем лучше меньше шума. Больше распознавания, но будьте осторожны при фильтрации, поскольку она также может удалить голос вместе с шумом.

Также читайте больше о БПФ

Быстрое преобразование Фурье человеческого голоса

Надеюсь это поможет :)

person Albert Laure    schedule 02.09.2013
comment
Ссылка API распознавания голоса не работает. Приносим извинения, но запрошенная вами страница не найдена. - person Timson; 02.09.2013
comment
@Timson, попробуйте этот android-developers.blogspot. ком/2010/03/ - person Albert Laure; 02.09.2013

Что именно вы ищете? Вы просто хотите отфильтровать человеческую речь в аудио или действительно хотите знать, что человек сказал?

Фильтрация человеческой речи выполняется почти на каждом смартфоне путем записи фонового шума вторым микрофоном на задней панели устройства и вычитания двух сигналов. Но, честно говоря, я не видел ни одного Android API, в котором можно было бы получить прямой доступ к двум сигналам.

Если вы хотите преобразовать речь в текст, взгляните на Sphinx4 и Praat. Оба делают эту работу, но опять же, я не видел реализации для Android. Sphinx4 утверждает, что полностью написан на Java, поэтому его можно встроить в приложение для Android.

person jboi    schedule 30.08.2013

Способ обработки ввода — использование специализированной библиотеки, удаляющей шум.

Например, http://audacity.sourceforge.net удаляет шум.

Пока вы охарактеризовали основные типы шума, у вас должна остаться только речь.

Было бы целесообразно собрать данные выборки перед захватом от пользователя и после того, как пользователь завершил захват, так как это позволит получить актуальные образцы шума в окружающей среде. Это полезно, если каждый пользователь сталкивается с уникальными проблемами фонового шума.

person Faisal Memon    schedule 26.08.2013
comment
Audacity не является библиотекой Android. - person null pointer; 27.08.2013
comment
Справедливо; Вы говорите, что желаемое решение ограничено библиотеками только для Android, или вы рассматриваете возможность переноса библиотеки в рамках проекта? - person Faisal Memon; 29.08.2013

Рассматривали ли вы возможность использования API распознавания речи Microsoft? Вы можете использовать голосовую клавишу, чтобы начать запись, например, как они говорят «компьютер», прежде чем спрашивать компьютер о чем-то в «Звездном пути». Используйте ISpRecognizer::CreateRecoContext, чтобы загрузить грамматику распознавания и начать распознавание. Затем выполните проверку с помощью ISpPhrase, чтобы узнать, следует ли начинать запись или нет.

person Scott Solmer    schedule 30.08.2013
comment
Не могли бы вы объяснить, как установить это на устройство Android? - person Henry; 30.08.2013

В совершенно общем случае это нерешенная проблема. В практическом смысле...

Первый шаг — сделать запись максимально бесшумной. Как уже отмечали другие, это начинается с направленного микрофона, максимально сфокусированного на звуке, который вы хотите сохранить.

Второй шаг — фильтрация. Как отмечалось ранее, телефонная компания проделала большую работу над тем, какие частотные диапазоны на самом деле нужны людям для понимания речи. Отфильтровывая частоты за пределами этого диапазона, голос будет звучать как... ну, телефонный... но избавится от большего количества фонового шума.

Если вы хотите выйти за рамки этого, все может стать очень сложным. Есть некоторые алгоритмы, которые, если вы можете показать им образец того, что вы считаете шумом на этой конкретной записи, проанализируют его и попытаются вычесть его, не повреждая звук, который вы хотите сохранить слишком сильно. Это не простое программирование; на вашем месте я бы серьезно подумал о покупке его у кого-то, кто уже понял это правильно, а не пытался заново изобрести/повторно реализовать его. Я не знаю, доступны ли какие-либо из них для Android и достаточно ли вычислительной мощности типичной коробки Android, чтобы выполнять их в режиме реального времени. (Я использовал SoundSoap в студии для удаления шума кондиционера, и он работает очень хорошо.)

На самом деле, я хотел бы упростить проблему до решаемой: использовать самый направленный и ближайший микрофон, который я могу получить, позволить Android сделать запись ... но затем выполнить обработку сигнала, чтобы очистить его позже, используя off инструменты на полке. Но я признаю, что я предвзят, потому что я уже инвестировал в последнее.

person Xaknp    schedule 01.09.2013

Я пытался решить аналогичную проблему на Windows. Одна вещь, которую я быстро усвоил: простого частотного анализа с быстрым преобразованием Фурье недостаточно. Многие шумы достигают человеческих частот — от простых постукиваний по микрофону до хлопков в ладоши. Даже некоторый уровень изощренной фильтрации не поможет. Я обнаружил, что самый простой способ — передать шум в облачный API и попросить его расшифровать речь. Если облачный API может транскрибировать строку разумной длины, я могу продолжить запись — в противном случае остановите запись. Это требует, чтобы вы сэмплировали шум и отправляли его облачному провайдеру.

person HelloNoggy    schedule 17.09.2015

Большинство из них неправильно поняли вопрос, и их ответы решают проблемы, отличные от ваших.

Вы должны проанализировать аудио в своем буфере, ища частоты в диапазоне человеческого голоса. Как только вы их обнаружите, это будет означать, что кто-то начал говорить, и вы можете начать запись (не забудьте также включить буфер, так как он содержит первую часть речи).

Найдите подпрограммы, которые печатают список частот в необработанном аудиопотоке.

person Marco Marsala    schedule 01.09.2013