Подтвердить что ты не робот

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

Я пытаюсь реализовать автоматическую функцию записи голоса, аналогичную приложению 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];

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

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

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

Спасибо заранее,

4b9b3361

Ответ 1

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

Ответ 2

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

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

API

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

Также читайте больше о FFt

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

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

Ответ 3

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

Например, http://audacity.sourceforge.net, снимает шум.

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

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

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

Ответ 8

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

Ответ 9

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

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

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