4
回答
Android 怎么实现变声呀   如:男声变女声,男声变机器人声,女声变童声这样的用户体验效果.

实现魔音的思路: 1)获取通话音频流.2)把获取到的音频流通过某种算法,某种数字处理技术,改变原有音频流.3)将改变后的音频流传出去,让通话对方听到改变后的音频流,感觉到说话方声音的变化.

①: 如何获取通话音频流.

Android本身没有提供获取通话流的接口,让上层程序去调用***方法获取到具体音频流.也不能通过内录的方式录制到音频流.目前来说可行的只有通过外录,录制MIC声音获取到通话音频流.目前这种方法已经尝试过了,可以通过MIC录音.判断接通电话时,调用MediaRecord.start()方法录音.这种方式录到的文件可以播放.通过MIC录音,现在可以录制到双方通话,自己说话声音大,对方说话声音小.

关于为什么MIC能录制到对方的声音,我觉得应该是通过听筒把对方声音扩散出来后,MIC将声音作为声源,和自己说话声一起被录制到录音文件了.

我认为通过MIC录音对于魔音这个功能似乎很牵强,噪音多,如果用这种声音源做处理,处理后再把处理后的音效播放出去,应该对方早就听到说话方原来的声音了.

②: 如何处理音频,让音频失真

这个就要用到其他第三方技术了,如IIR(Infinite Impulse Response)数字滤波器,这个技术用到了高等数学很多数学公式,网上有详细的介绍,大家可以了解下.

我看到changebox(变声盒子)用到了这个技术.

还有就是第三方类库,soundtouch这个东西,他是用C++写的,关于改变声音的类库.

我看到会说话的汤姆猫在用这个技术.这些技术本身涉及的领域比较多,看懂这些代码,理解这些技术也是一项挑战.

③: 如何把这些处理后的结果传给用户,让用户感知说话方声音变化

这个我还没具体研究过,曾经考虑过把这些处理后的声音用AudioTracck播放,现在觉得从前两步骤得到处理后的声音,再播放的话,延迟会很严重的,通话对方会听到一次原声(系统通话自身传播的声音),一次改变后的声音(声音处理后传播的声音).总之是了解越深入,发现问题越多.

举报
wang.shuai
发帖于7年前 4回/13K+阅
顶部