如何像talking tom那样,自动监听到外部声音,和,简单的变声_1

也许有外部的第三方库(c/c++)来解决问题,但是,我只想用纯java来解决

背景:我并没有太多的关于音视频解码的知识,也不想了解音量音色等专业概念


*************************************


解决途径:

我在stackoverflow上貌似找到了答案,参见:http://stackoverflow.com/questions/7955041/voice-detection-in-android-application
帖子的问题描述:
I want to change my application in this way,
when application start work it begin to analyze sound coming from microphone,
if user keep silent application continue to analyze income sound from microphone,
if user start to talk application begin to Record sound coming from microphone
and then user finish talking application stops recording and give me back same buffer, with voice data in .wav format.
帖子的解决:
1.问题的提出者和解答者是同一个人,他贴出了源码,但是有一些变量的具体数值没有给出
2.然后,我貌似找到了那个人的主页,他又贴出了不完整的源码(但是这段代码设置了上面的参数值,虽然有download,但是链接失效)参见:http://vitosolutions.wordpress.com/tag/voice/
3.在早些时候,好心的网友给出了类似的解答,参见:http://wapiknow.baidu.com/question/416835390.html?fr=ala3&ssid=0&from=1097d&uid=wiaui_1295711782_6667&pu=usm%401%2Csz%401320_240&bd_page_type=1&tj=zhidao_2_0_10


*************************************


已经按照stackoverflow的方法,进行了实现,通过


原代码的问题:因为他的代码中,设置的是350这个阀值,而这个是比较大的,往往检测不到正常的说话,建议,将其调整至50左右

关于循环监听:
tom猫的说话监听往往是一个循环过程,而原代码只监听一次
该循环过程可能还需要在某个时刻进行阻塞,然后在某个时刻被唤醒
在下一次监听时,建议生成新的AudioRecord,而不是利用原有的,因为:他会将上一次的声音残留保存至本次监听,而这会影响:后续的录音的播放

关于变声:
我也是找了很多的资料,不过貌似,都推荐用soundtouch,他是LGPL
他是c/c++编写,所以,你需要将他编译成so
如果对变声的效果不是那么苛刻的话,另外一种推荐:使用soundpool,方法:SoundPool.play(soundid, 1, 1, 0, 0, 2f);。那将改变语速,第一次听起来,变的效果还不错

关于录音的bufferSizeInBytes
你也许通常使用以下方式,来进行监听:
int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
	RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
audioRecorder = new AudioRecord(AUDIO_SOURCE, SAMPLE_RATE,
	RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING,
	bufferSizeInBytes);
numberOfReadBytes = audioRecorder.read(audioBuffer, 0,
	bufferSizeInBytes);
这种方法在某些情况下,没有错误,但是,你忽略了一些细节:
在华为u8800+和三星galaxy nexus上分别进行了实验,发现:
华为上,一切正常,而,三星上,录音并不是完整的(read中的数据是不完整的)
这是android碎片化表现,因为bufferSizeInBytes小了,抛出了:RecordThread: buffer overflow异常
官方解释(关于getMinBufferSize ):


 
 
Returns the minimum buffer size required for the successful creation of an AudioRecord object. Note that this size doesn't guarantee a smooth recording under load, and higher values should be chosen according to the expected frequency at which the AudioRecord instance will be polled for new data.
解决(不完美):bufferSizeInBytes*=5

华丽的连接线:

如何像talking tom那样,自动监听到外部声音,和,简单的变声_2

绑架一个wav

图片+音频->视频

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值