2012-06-18 2 views
1

В моем приложении для Android мне нужно записать речь пользователя с микрофона, а затем передать его на сервер. В настоящее время я использую класс MediaRecorder. Однако это не удовлетворяет мои потребности, потому что я хочу сделать светящийся эффект, исходя из текущего объема входного звука, поэтому мне нужен AudioStream или что-то в этом роде, я думаю. В настоящее время я использую следующие:Соответствующий захват звука и шумоподавление

this.recorder = new MediaRecorder(); 
    this.recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    this.recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
    this.recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    this.recorder.setOutputFile(FILENAME); 

Я пишу с помощью уровня API 7, так что я не вижу никаких других AudioEncoders, но AMR Narrow Band. Возможно, это причина ужасного шума, который я слышу в своих записях.

Вторая проблема, с которой я столкнулся, - это плохое качество звука, шум, поэтому я хочу восстановить (отменить, подавить) его, потому что это действительно ужасно, особенно на моей неамериканской китайской планшете. Это должно быть на стороне сервера, потому что, насколько мне известно, requiers много ресурсов, и не все современные гаджеты (особенно noname китайские планшеты) могут сделать это как можно быстрее. Я свободен в выборе, какую платформу использовать на сервере, поэтому это может быть ASP.NET, PHP, JSP или что-то еще, что помогает мне улучшить звук. Говоря об ASP.NET, я столкнулся с библиотекой под названием NAudio, может быть, это может мне помочь в некотором роде. Я знаю, что в библиотеке нет никакого решения по снижению шума, но я нашел несколько примеров использования FFT и автокоррелирования, поэтому это может помочь.
Если честно, я никогда раньше не работал со звуком, и я не знаю, с чего начать. Я много разбирался в методах шумоподавления, примерах кода и ничего не нашел. Вы, ребята, моя последняя надежда.
Спасибо заранее.

+1

Возможно, вы могли бы разделить этот вопрос на два: (1) как захватить аудио на Android? и (2) как уменьшить шум (на сервере)? – Kaarel

ответ

1

Для записи звука вы можете использовать класс AudioRecord. Это позволяет записывать сырые аудио, т. Е. Вы не ограничены «узкой полосой», и вы также можете измерить громкость.

0

Многие смартфоны имеют два микрофона, один из которых - MIC, а другой - камера для видеосъемки, называемая CAMCORDER. Вы можете получить данные от обоих из них для уменьшения шума. Существует много статей о шумоподавлении с несколькими микрофонами.

Ref: http://developer.android.com/reference/android/media/MediaRecorder.AudioSource.html

https://www.google.com/search?q=noise+reduction+algorithm+with+two+mic

2

Посмотрите this article.

Короче говоря, он использует MediaRecorder.AudioSource.VOICE_RECOGNITION вместо AudioSource.MIC, что дало мне действительно хорошие результаты, и шум на заднем плане значительно уменьшился.

Отличная вещь в этом решении, она может использоваться как с аудиорекордом, так и с классом MediaRecorder.