Android 如何实现人声加强?

1,946 阅读1分钟

如果你听过播客,肯定遇到过这样的情况:主播声音太小或者因为收音设备故障的原因导致很难听清主播在说什么,或者遗漏一些关键的信息点,让你不得不倒回去重新听,让人很抓狂。作为播客客户端,有什么办法解决这个问题吗?

答案是 「LoudnessEnhancer」

LoudnessEnhancer 是一个音效处理类,继承自 AudioEffect,使用很简单:

  1. 使用 audioSessionId 构建一个实例对象
  2. 通过 setTargetGain(gainmB: Int) 设置好音量需要放大的倍数
  3. 通过 setEnabled(enabled: Boolean) 控制是否打开

有人可能要问了,这里的 audioSessionId 是什么,如何获取?

这里的 audioSessionId 表示需要放大的音频资源,可以通过下面的方法获取:

  1. 如果是用 MediaPlayer 播放,使用 MediaPlayer.getAudioSessionId()
  2. 如果使用 AudioTrack 播放,使用 AudioTrack.getAudioSessionId()
  3. 如果是用 ExoPlayer 播放,使用如下方式
SimpleExoplayer.addAnalyticsListener(object: AnalyticsListener {
  override fun onAudioSessionId(
    eventTime: AnalyticsListener.EventTime, 
    audioSessionId: Int
  ) {
    val enhancer = LoudnessEnhancer(audioSessionId)
  }
})

LoudnessEnhancer 实例创建好了,下一步是设置增强参数 gainmB,这里的单位是 mB(毫贝),不太熟悉?没关系,你肯定知道 dB(分贝),它和毫贝的换算关系:

1dB = 100mB

分贝表示两个相同单位数值的比例,在这里用来表示增强程度刚好合适,常见的分贝数值和增强比例可以参考维基百科

听播客 就用小宇宙! 小宇宙 app Android 1.9 版本可以体验上述方案的效果