如何在Android中结合麦克风使用TarsosDSP的MFCC
看起来你已经搭好了TarsosDSP结合麦克风实时获取MFCC的基础框架,我来帮你把剩下的代码补全,并且解释清楚每个关键部分的作用~
完整实现代码
import be.tarsos.dsp.AudioDispatcher; import be.tarsos.dsp.AudioProcessor; import be.tarsos.dsp.io.android.AudioDispatcherFactory; import be.tarsos.dsp.mfcc.MFCC; // 提前说明:确保已添加TarsosDSP依赖,比如在build.gradle中引入: // implementation 'com.github.mthli:TarsosDSP:v2.4.1' public class RealTimeMfccCapture { public void startMfccCapture() { int sampleRate = 44100; int bufferSize = 8192; int bufferOverlap = 128; // 从默认麦克风创建音频调度器,负责实时拉取音频数据 final AudioDispatcher dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(sampleRate, bufferSize, bufferOverlap); // 初始化MFCC处理器:参数依次为缓冲区大小、采样率、梅尔滤波器数量、倒谱系数数量、最低分析频率、最高分析频率 final MFCC mfcc = new MFCC(bufferSize, sampleRate, 40, 50, 300, 3000); dispatcher.addAudioProcessor(mfcc); // 添加自定义音频处理器,用于捕获每帧的MFCC结果 dispatcher.addAudioProcessor(new AudioProcessor() { @Override public boolean process(be.tarsos.dsp.AudioEvent audioEvent) { // 获取当前音频帧的MFCC系数数组 float[] mfccCoefficients = mfcc.getMFCC(); // 这里可以对MFCC系数做后续业务处理:比如打印日志、存入缓存、输入机器学习模型等 if (mfccCoefficients != null) { StringBuilder sb = new StringBuilder("当前帧MFCC系数: "); for (float coeff : mfccCoefficients) { sb.append(String.format("%.2f ", coeff)); } System.out.println(sb.toString()); } // 返回true表示继续处理后续音频帧,返回false则终止整个音频捕获流程 return true; } @Override public void processingFinished() { // 音频捕获停止时的回调:可以在这里释放资源、做收尾逻辑 System.out.println("MFCC实时捕获已结束"); } }); // 启动音频调度器线程(dispatcher.run()是阻塞操作,必须放在子线程中执行) new Thread(dispatcher, "AudioDispatcher-Worker").start(); } }
关键细节说明
- 音频调度器配置:
bufferOverlap设为128是为了让相邻音频帧有重叠区域,避免特征信息丢失,提升MFCC结果的连续性;采样率44100是音频领域的标准采样率,兼容性最好。 - MFCC参数调整建议:
- 梅尔滤波器数量建议设为20-40之间(示例中是40)
- 倒谱系数数量一般取12-20就足够覆盖核心特征(示例中设50是为了展示上限,实际可以按需缩减)
- 频率范围300-3000Hz覆盖了大部分人声和常见环境音的核心特征区间,如果你处理的是特定音频(比如乐器),可以调整这个范围
- Android权限要求:别忘了在
AndroidManifest.xml中添加麦克风权限:
对于Android 6.0及以上版本,还需要动态申请RECORD_AUDIO权限,否则会直接抛出权限异常。<uses-permission android:name="android.permission.RECORD_AUDIO" />
内容的提问来源于stack exchange,提问作者Atheel Massalha
相关产品推荐
相关产品推荐

