android/iphone/windows/linux声波通讯库
前一段时间为了实现声波传输,网上找了半天,好不容易找到一个实现,但准确性远不能满足要求,没办法,只好自己写了一个。
后来一哥们要求在mipsel平台和arm平台上使用,就帮他用c移植到了mipsel平台,实现了在不到普通电脑千分之一cpu的系统平台上的运行。搞定这个后cpu消耗非常低,基本上应该算是没有运行不了的平台了。
准确性95%以上,如果有识别有问题的情况,你可以开启调试模式,该模式下会自动保存识别失败的的音频段,你可以发给我分析识别失败的原因,如果真是识别器没有考虑到的情况的话,调整识别规则就可以完善识别到了。而且传输中加入了校验码,校验码有两个目的,一个是保证识别正确性。保证识别结果不然就识别失败,而如果识别到了就一定是对的,也就是说不会出现传输的是1,而识别提示为0;另一个是错误自动修正,从而保证传输中可以有20%左右(取决于你传输的数据长度)的错误而可以自动修正,从而使得使用过程中基本上识别是不会出错的。识别接口中参数指定了识别是否成功完成,错误码指出了如果识别失败的话,失败的原因。
我的接口尽量做得简单,这样用起来也比较小白,既然是当成一个库,使用起来越简单越好,就尽量不要去管底层的一些控制参数,比如说声音采样频率、采样精度、采样格式、传输频率、传输码表、音量、缓冲区大小,这些在参数中你就不用管了,当然你想定制的话其实这些参数也全部是都是可以定制的。在这里,这些参数的默认值我也说一下:声音方面默认参数为:声音采样频率为44100,单声道,2个字节(16位)长的采样精度,小端编码,桢大小就为1*2=2个字节,那么每秒处理的数据量就是44100*2=88200字节。传输频率为高频段,抗干扰能力非常好,不管你是在闹市、马路、×××、或者其它室外场景下,或者你在家里开着大音箱听歌都不会影响到数据的传输。码表为16进制的数据编码,也就是所有数据都会编成16进制后传输。缓冲区的话默认需10k左右的缓冲区(里面其它的内存分配都在内存池中完成,长时间运行解码不会再分配内存)。如果这些参数你完全不懂,就忽略就算了,因为接口足够简单,能用就可以了,也不用理解那么多原理。不过×××要求你传入的音频数据是这些格式,特别是输入数据要求为44100,单声道,16bits采样精度,小端编码的音频数据。
另外实际上因为传输频率属于高频段,开始超出正常人可听到的阶段,所以发送的时候感觉没什么反应一样,所以可以在人耳可听到的范围另外加一段可听到的音频音效(咻咻咻、啾啾啾随便你,呵呵)让用户知道系统正在通讯中,最后的效果就是人听到的是人耳可听到那部分你加的音频音效,可实际上设备则可解码出真正的信号,而不会相互干扰。
传输距离的话是取决于音量的,音量比较大的,传输距离就大,一般以手机的最大音量5-10米没问题,音量设小的话可以控制在10cm-30cm左右。
至于性能,系统有两种工作模式:一种是优化内存模式,耗CPU稍多一点,但耗内存小,在当前正常使用的电脑或者现在的智能手机下使用是没有问题的,正常pc机的cpu基于可以看到在1%以下,反正windows任务管理器里显示的是0,应该是1%以下就会显示为0%,估计在百分之零点几左右吧。另一种是优化CPU模式,如果你是在计算能力非常有限的平台上使用,比如说计算能力不到pc千分之一的平台上使用,你可以使用这种模式,这种模式下,基本不会占用你的CPU,但会占内存会大一些,但如果你的CPU真的非常慢,你解码时间会长一点,但无论你的系统有多慢,都不会解不出来,也不会影响解码正确性,只是速度慢的话解码出来的时间就稍长一些。
说一说传输数据量的问题,首先我要说一下,我最先了解声波通讯的时候还以为传输率可以达到几k/秒,实际上声波1秒也就传输个十几个字符左右,而且一般来说传输总字符如果达到40个以上,解码正确率就会下降,数据量越大,出错率就会升高。所以想以k级来传输数据量的人就不要想了。当然这也是对怎么使用声波通讯的机制不了解的原因:声波传输使用时主要是作为握手和对接使用,真正的数据是通过对接后在互联网上传输。比如说面对面的声波支付,A要付款给B,那么声波通讯在这里面主要是传输用户标志,或者付款单编号来快速握手(这当然跟你设计的支付流程有关)。我这里以一种模拟刷卡的流程举例说明:A(客户)要付款给B(商家),我们设想如果是刷卡的话,流程可能是这样的,A(客户)在B(商家)的POS机上刷一下银行卡,B(商家)就知道A(客户)是哪张银行卡,从而把该卡和金额传到支付公司去扣款。那么换成声波后也是一样的,A(客户)在手机上点一下付款,A(客户)的手机发出一串声波,声波上传输A(客户)的用户标识,传到B(商家)的手机,这时B(商家)就可以把A(客户)的标志和扣款金额传到支付公司去扣款了。当然你也可以设计一个反过来的流程,就是由B端(商家端)发出一串账单音频,而由A端接收(客户关),但原理是一样的。所以在这整个流程里面,声波是做系统对接使用的,替代刷银行卡、或者扫二维码的对接方式,然后真正的数据传输还是在互联网上传输。
我这里采用的是16进制的传输码,你自己要传输的信息可以自己先编成16进制码,不过码表其实是可以定制的,比如说你想传输数据量更大一点,那也可以扩展到32进制,这样相对来说传输数据量编码后会更小,数据量可以传输得更大一些。如果你要传输的是数字,先把数字编成16进制编码,如果你要传字母,那么一个字母可以编成2个16进制的字符。
我这里列出几种编码的情况,比如说你要传输QQ号,手机号这类数字,那就最好转成16进制后再传输。以传输手机号为例:因为手机号肯定是以1开始的,那么1就可以不传了,而且都是以13,15,18开头,那么你可以把3,5,8先映射为1,2,3,然后再做16进制转码。当然解码端你自己怎么做的编码就怎么做解码,这样一个手机号本来有11位,优化下来就可以做到9位,或者8位。呵呵,声波传输就是要做到尽量小的数据量,数据量越小传输准确率就越可靠,你的系统就越可靠。
我这里列出几种编码的示例。
手机号编成16进制声波通讯编码:
[java]view plaincopy
/************************************************************************
声波通讯库示例,16进制声波通讯编码
声波通讯库特征:
准确性95%以上,其实一般是不会出错的。
接口非常简单,有完整的示例,3分钟就可以让你的应用增加声波通讯功能
抗干扰性强,基本上无论外界怎么干扰,信号都是准确的
基本的编码为16进制,而通过编码可传输任何字符
性能非常强,没有运行不了的平台,而且通过内存池优化,长时间解码不再分配新内存,可7*24小时运行
可支持任何平台,常见的平台android,iphone,windows,linux,arm,mipsel都有示例
详情可查看:http://blog.csdn.net/softlgh
作者:夜行侠QQ:3116009971邮件:3116009971@qq.com
************************************************************************/
//13,14,15,18开头的手机号,手机号去除1以后,16进制在9位以内
publicstaticStringencode(String_mobile)
{
if(_mobile.length()==11&&_mobile.startsWith("1"))
{
long_number=Long.parseLong(_mobile.substring(1));
Strings=Long.toHexString(_number);
while(s.length()<9)
{
s="0"+s;
}
returns;
}
returnnull;
}
任意字符串(先换成byte[])编成16进制声波通讯编码:
[java]view plaincopy
/************************************************************************
声波通讯库示例,16进制声波通讯编码
声波通讯库特征:
准确性95%以上,其实一般是不会出错的。
接口非常简单,有完整的示例,3分钟就可以让你的应用增加声波通讯功能
抗干扰性强,基本上无论外界怎么干扰,信号都是准确的
基本的编码为16进制,而通过编码可传输任何字符
性能非常强,没有运行不了的平台,而且通过内存池优化,长时间解码不再分配新内存,可7*24小时运行
可支持任何平台,常见的平台android,iphone,windows,linux,arm,mipsel都有示例
详情可查看:http://blog.csdn.net/softlgh
作者:夜行侠QQ:3116009971邮件:3116009971@qq.com
************************************************************************/
publicstaticfinalchar[]hexChars={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
publicstaticStringencodeString(byte[]_val)
{
StringBufferresult=newStringBuffer(_val.length*2);
for(inti=0;i<_val.length;i++)
{
result.append(hexChars[(_val[i]>>4)&0x0f]);
result.append(hexChars[_val[i]&0x0f]);
}
returnresult.toString();
}
八、使用场景这里也把现在市场上的一些应用到了声波的先列一下:支付宝的声波支付,微信的声波雷达加好友,QQ音乐中的歌曲的声波分享,茄子快传,蛐蛐儿等等,国外的apple,google对声波通讯也都有应用。
声波实际上可以看成是一种比二维码可友好的传输方式,二维码能实现的功能与声波有很大的相似性,但声波使用时会更友好。做以上这些功能的时候,基本上都是只要靠近在手机上点一下/划一下/推一下/甩一下/摇一下(这是你自己定的)就可以了,而不需要像二维码一样还要打开摄像头、对准去拍那样比较麻烦。相比来说,声波传输更像刷卡一样方便简单,可以理解为类似NFC的一种近场通讯技术。
比如说你可以用声波支付,声波会员卡,声波券票,声音名片,声波签到,声波排队,做wifi和密码共享或者设定,做文件/图片、你App里面的任何项目分享,用声波关注微博、微信等等。
声波支付的流程前面有讲过,实际上有可能稍微复杂一点,但大概是这样的思路。
声波会员卡是指用户到店铺后不需要带物理卡了,而是手机代替了所有的会员卡,在商家一碰,会员信息就自动显示出来了。
声波券票也很简单,比如说一张电子团购券,电子电影券,可以设置成一个唯一的编码,到场后与录音设备一碰,系统就能识别到这张券票
声波签到是指在固定位置安装签到软件,用户到达后,可以快速完成签到操作。
声波分享以文件/图片、或者你App里面的任何项目为例:比如A要把一张图片发送给B,那么A点击一下共享按钮(或者一推一丢都行),这时手机通过声音把这个图片的编号发送出去,当B收到这个标志时,马上从你平台的服务器上下载这张图片。最后的效果就是A在要分享的图片上一点,B就能收到该张图片,非常的方便快捷。
九、运行平台这个声波传输库可以运行在windows平台(所有windows系统), linux平台, mipsel平台, arm平台, iphone平台, android平台,全部都有SDK,后面的附件中有各个平台的库,你自己可以选择下载
库的结构非常简单:一个发送端,一个接收端。发送端很简单,基本上就是一个send函数。接收端稍微复杂一点,但也是很简单的:创建一个×××,设置监听,往×××送音频数据(×××就会开始分析音频数据,并在监听到信号后通知你),最后停止×××和销毁×××。使用还是很简单的,下面和附件中有例子说明。
这种库的使用毕竟是商用,所以就不能免费了,呵呵。不过如果你完全是没有任何商业目的的公益项目,我也是完全可以免费给你用的。
试用库识别次数有限,或者没有进行降噪处理
各个平台的例子及源码
android平台声波通讯发送端接口:
[java]view plaincopy
/************************************************************************
声波通讯库示例,android平台声波通讯发送端
声波通讯库特征:
准确性95%以上,其实一般是不会出错的。
接口非常简单,有完整的示例,3分钟就可以让你的应用增加声波通讯功能
抗干扰性强,基本上无论外界怎么干扰,信号都是准确的
基本的编码为16进制,而通过编码可传输任何字符
性能非常强,没有运行不了的平台,而且通过内存池优化,长时间解码不再分配新内存,可7*24小时运行
可支持任何平台,常见的平台android,iphone,windows,linux,arm,mipsel都有示例
详情可查看:http://blog.csdn.net/softlgh
作者:夜行侠QQ:3116009971邮件:3116009971@qq.com
************************************************************************/
//创建声波通讯播放器
player=newVoicePlayer();
//开始播放
player.play("12345678abcdef",1,200);
iphone平台声波通讯发送端接口:
[objc]view plaincopy
/************************************************************************
声波通讯库示例,iphone平台声波通讯发送端
声波通讯库特征:
准确性95%以上,其实一般是不会出错的。
接口非常简单,有完整的示例,3分钟就可以让你的应用增加声波通讯功能
抗干扰性强,基本上无论外界怎么干扰,信号都是准确的
基本的编码为16进制,而通过编码可传输任何字符
性能非常强,没有运行不了的平台,而且通过内存池优化,长时间解码不再分配新内存,可7*24小时运行
可支持任何平台,常见的平台android,iphone,windows,linux,arm,mipsel都有示例
详情可查看:http://blog.csdn.net/softlgh
作者:夜行侠QQ:3116009971邮件:3116009971@qq.com
************************************************************************/
NSAutoreleasePool*tempPool=[[NSAutoreleasePoolalloc]init];
//创建声波通讯播放器
VoicePlayer*player=[[VoicePlayeralloc]init];
//播放
[playerplay:@"12345678"playCount:1muteInterval:0];
//没播放完之前,不要释放内存
while(![playerisStopped]){
usleep(3300*1000);//300ms
}
[tempPooldrain];
Android平台声波通讯解码端代码:
[java]view plaincopy
/************************************************************************
声波通讯库示例,Android平台声波通讯解码端
声波通讯库特征:
准确性95%以上,其实一般是不会出错的。
接口非常简单,有完整的示例,3分钟就可以让你的应用增加声波通讯功能
抗干扰性强,基本上无论外界怎么干扰,信号都是准确的
基本的编码为16进制,而通过编码可传输任何字符
性能非常强,没有运行不了的平台,而且通过内存池优化,长时间解码不再分配新内存,可7*24小时运行
可支持任何平台,常见的平台android,iphone,windows,linux,arm,mipsel都有示例
详情可查看:http://blog.csdn.net/softlgh
作者:夜行侠QQ:3116009971邮件:3116009971@qq.com
************************************************************************/
VoiceRecognitionmRecognition=newVoiceRecognition();
mRecognition.setListener(newVoiceRecognitionListener()
{
@Override
publicvoidonRecognitionStart(){
}
publicvoidonRecognitionEnd(int_recogStatus,String_val)
{
if(_recogStatus==VoiceRecognition.Status_Success)
{
System.out.println(_val);
}
}
});
mRecognition.start();
c通用声波通讯解码端接口
[cpp]view plaincopy
/************************************************************************
声波通讯库示例,声波通讯库c解码接口
声波通讯库特征:
准确性95%以上,其实一般是不会出错的。
接口非常简单,有完整的示例,3分钟就可以让你的应用增加声波通讯功能
抗干扰性强,基本上无论外界怎么干扰,信号都是准确的
基本的编码为16进制,而通过编码可传输任何字符
性能非常强,没有运行不了的平台,而且通过内存池优化,长时间解码不再分配新内存,可7*24小时运行
可支持任何平台,常见的平台android,iphone,windows,linux,arm,mipsel都有示例
详情可查看:http://blog.csdn.net/softlgh
作者:夜行侠QQ:3116009971邮件:3116009971@qq.com
************************************************************************/
#ifdefVOICE_RECOG_DLL
#defineVOICERECOGNIZEDLL_API__declspec(dllexport)
#else
#ifdefWIN32
#defineVOICERECOGNIZEDLL_API__declspec(dllimport)
#else
#defineVOICERECOGNIZEDLL_API
#endif
#endif
#ifndefVOICE_RECOG_H
#defineVOICE_RECOG_H
#ifdef__cplusplus
extern"C"{
#endif
enumVRErrorCode
{
VR_SUCCESS=0
};
enumDecoderPriority
{
CPUUsePriority=1//不占内存,但CPU消耗比较大一些
,MemoryUsePriority=2//不占CPU,但内存消耗大一些
};
typedefenum{vr_false=0,vr_true=1}vr_bool;
typedefvoid(*vr_pRecognizerStartListener)(void);
//_result如果为VR_SUCCESS,则表示识别成功,否则为错误码,成功的话_data才有数据
typedefvoid(*vr_pRecognizerEndListener)(int_result,char*_data,int_dataLen);
//创建声波识别器
VOICERECOGNIZEDLL_APIvoid*vr_createVoiceRecognizer(DecoderPriority_decoderPriority=CPUUsePriority);
//销毁识别器
VOICERECOGNIZEDLL_APIvoidvr_destroyVoiceRecognizer(void*_recognizer);
//设置识别到信号的监听器
VOICERECOGNIZEDLL_APIvoidvr_setRecognizerListener(void*_recognizer,vr_pRecognizerStartListener_startListener,vr_pRecognizerEndListener_endListener);
//开始识别
//这里一般是线程,这个函数在停止识别之前不会返回
VOICERECOGNIZEDLL_APIvoidvr_runRecognizer(void*_recognizer);
//停止识别,该函数调用后vr_runRecognizer会返回
//该函数只是向识别线程发出退出信号,判断识别器是否真正已经退出要使用以下的vr_isRecognizerStopped函数
VOICERECOGNIZEDLL_APIvoidvr_stopRecognize(void*_recognizer);
//判断识别器线程是否已经退出
VOICERECOGNIZEDLL_APIvr_boolvr_isRecognizerStopped(void*_recognizer);
//要求输入数据要求为44100,单声道,16bits采样精度,小端编码的音频数据
//小端编码不用特别处理,一般你录到的数据都是小端编码的
VOICERECOGNIZEDLL_APIintvr_writeData(void*_recognizer,char*_data,int_dataLen);
#ifdef__cplusplus
}
#endif
#endif
使用c声波通讯接口从wav文件中解码的例子:
[cpp]view plaincopy
/************************************************************************
声波通讯库示例,从wav文件中读取音频信号进行解码,该工程示例是可跨平台的
声波通讯库特征:
准确性95%以上,其实一般是不会出错的。
接口非常简单,有完整的示例,3分钟就可以让你的应用增加声波通讯功能
抗干扰性强,基本上无论外界怎么干扰,信号都是准确的
基本的编码为16进制,而通过编码可传输任何字符
性能非常强,没有运行不了的平台,而且通过内存池优化,长时间解码不再分配新内存,可7*24小时运行
可支持任何平台,常见的平台android,iphone,windows,linux,arm,mipsel都有示例
详情可查看:http://blog.csdn.net/softlgh
作者:夜行侠QQ:3116009971邮件:3116009971@qq.com
************************************************************************/
//当次解码结束的回调函数
voidwaveRecognizerEnd(int_recogStatus,char*_data,int_dataLen)
{
if(_recogStatus==VR_SUCCESS)
{
charbuf[51];
memcpy(buf,_data,_dataLen);
buf[_dataLen]=0;
printf("------------------recognizeddata:%s\n",buf);
}
else
{
printf("------------------recognizeinvaliddata,errorCode:%d\n",_recogStatus);
}
}
//识别到有信号时开始解码回调函数
voidwaveRecognizerStart()
{
printf("------------------recognizestart\n");
}
//WIN32与linux所需的线程函数原型有点不一样
#ifdefWIN32
DWORDWINAPIwaveRunVoiceRecognize(LPVOID_recognizer)
{
#else
void*waveRunVoiceRecognize(void*_recognizer)
{
printf("voicerecognizerthreadstart:%d\n",getpid());
#endif
vr_runRecognizer(_recognizer);
return0;
}
//从wav文件中装载数据进入声波识别器
voidtest_voiceRecog_from_wav(intargc,char*argv[])
{
char*wavFile=(char*)"data.wav";
if(argc>1)
{
wavFile=argv[1];
}
//读入wav文件
structWavDatawavData;
memset(&wavData,0,sizeof(wavData));
readWave(wavFile,&wavData);
printf("%sdatasize:%d\n",wavFile,(int)wavData.size);
//创建识别器,并开始运行
void*recognizer=vr_createVoiceRecognizer(MemoryUsePriority);
vr_setRecognizerListener(recognizer,waveRecognizerStart,waveRecognizerEnd);
#ifdefWIN32
HANDLErecogThread=CreateThread(NULL,0,waveRunVoiceRecognize,recognizer,0,0);
//_beginthread(waveRunVoiceRecognize,0,recognizer);
#else
pthread_trecogThread;
pthread_create(&recogThread,NULL,waveRunVoiceRecognize,recognizer);
//printf("voicerecognizerthreadid:%lu\n",(recogThread));
#endif
//往识别器写入数据,这里可以反复写
vr_writeData(recognizer,wavData.data,wavData.size);
//通知识别器停止,并等待识别器真正退出
do
{
vr_stopRecognize(recognizer);
printf("recognizerisquiting\n");
#ifdefWIN32
Sleep(1000);
#else
sleep(1);
#endif
}while(!vr_isRecognizerStopped(recognizer));
//销毁识别器
vr_destroyVoiceRecognizer(recognizer);
printf("pressenterkeytoexit.......\n");
charc;
scanf("%c",&c);
}
使用c声波通讯接口从实时录音数据中解码的例子:
[cpp]view plaincopy
/************************************************************************
声波通讯库示例,从实时录音数据获取音频信号进行解码,该工程示例是可跨平台的
声波通讯库特征:
准确性95%以上,其实一般是不会出错的。
接口非常简单,有完整的示例,3分钟就可以让你的应用增加声波通讯功能
抗干扰性强,基本上无论外界怎么干扰,信号都是准确的
基本的编码为16进制,而通过编码可传输任何字符
性能非常强,没有运行不了的平台,而且通过内存池优化,长时间解码不再分配新内存,可7*24小时运行
可支持任何平台,常见的平台android,iphone,windows,linux,arm,mipsel都有示例
详情可查看:http://blog.csdn.net/softlgh
作者:夜行侠QQ:3116009971邮件:3116009971@qq.com
************************************************************************/
//识别到有信号时开始解码回调函数
voidrecorderRecognizerStart()
{
printf("------------------recognizestart\n");
}
//当次解码结束的回调函数
voidrecorderRecognizerEnd(int_recogStatus,char*_data,int_dataLen)
{
if(_recogStatus==VR_SUCCESS)
{
charbuf[51];
memcpy(buf,_data,_dataLen);
buf[_dataLen]=0;
printf("------------------recognizeddata:%s\n",buf);
}
else
{
printf("------------------recognizeinvaliddata,errorCode:%d\n",_recogStatus);
}
}
#ifdefWIN32
voidrunRecorderVoiceRecognize(void*_recognizer)
#else
void*runRecorderVoiceRecognize(void*_recognizer)
#endif
{
vr_runRecognizer(_recognizer);
}
intrecorderShortWrite(void*_writer,constvoid*_data,unsignedlong_sampleCout)
{
char*data=(char*)_data;
void*recognizer=_writer;
returnvr_writeData(recognizer,data,(int)_sampleCout);
}
voidtest_recorderVoiceRecog()
{
//创建识别器,并设置监听器
void*recognizer=vr_createVoiceRecognizer();
vr_setRecognizerListener(recognizer,recorderRecognizerStart,recorderRecognizerEnd);
//创建录音机
void*recorder=NULL;
intr=initRecorder(44100,1,16,512,&recorder);//要求录取short数据
if(r!=0)
{
printf("recorderiniterror:%d",r);
return;
}
//开始录音
//r=startRecord(recorder,recognizer,recorderFloatWrite);//float数据
r=startRecord(recorder,recognizer,recorderShortWrite);//short数据
if(r!=0)
{
printf("recorderrecorderror:%d",r);
return;
}
//开始识别
#ifdefWIN32
//CreateThread(NULL,0,runRecorderVoiceRecognize,recognizer,0,0);
_beginthread(runRecorderVoiceRecognize,0,recognizer);
#else
pthread_tntid;
pthread_create(&ntid,NULL,runRecorderVoiceRecognize,recognizer);
#endif
printf("\n\n\nrecognizestart,waitingforsignals............\n");
charc=0;
do
{
printf("pressqtoendrecognize\n");
scanf_s("%c",&c);
}while(c!='q');
//停止录音
r=stopRecord(recorder);
if(r!=0)
{
printf("recorderstoprecorderror:%d",r);
}
r=releaseRecorder(recorder);
if(r!=0)
{
printf("recorderreleaseerror:%d",r);
}
//通知识别器停止,并等待识别器真正退出
do
{
vr_stopRecognize(recognizer);
printf("recognizerisquiting\n");
#ifdefWIN32
Sleep(1000);
#else
sleep(1);
#endif
}while(!vr_isRecognizerStopped(recognizer));
//销毁识别器
vr_destroyVoiceRecognizer(recognizer);
}
所有代码都在附件中
附件说明:
各平台相应的文件在相应平台的文件夹下,有些平台文件夹下只有编码端或者解码端,或者是因为不需要,或者是我自己现在没用到,也懒得去编译了,你自己需要的时候找我吧。各平台的库是demo版,c语言版是限制了解码次数,android的java版是没有去除噪音功能,你自己如果真正需要相应的正式版,再找我吧。各个平台的编码端都没有任何限制
本文件夹下包含:
VoiceRecogFromRecorder.exe:从windows录音设备读取音频数据解码信号的示例程序,其代码在windows文件夹下。该示例工程是可跨平台编译的,链接时去链接相应平台的.so文件就可以了。使用时确保windows录音正常,然后从android手机播放信号后windows上就能识别到了。
VoiceRecogFromWav.exe:从本目录下的data.wav文件读取音频数据解码信号的示例,代码在windows文件夹下。该示例工程是可跨平台编译的,链接时去链接相应平台的.so文件就可以了。
声波通讯测试.apk:android平台上同时进行音频编码和解码的示例,其代码在android文件夹下
voiceDemoWithNoise.jar:android平台上同时进行音频编码和解码库,此库为没有处理噪音的开发版,不是正式版
各平台文件夹:
android:示例apk,java版的编码和解码库,相应的解码、解码使用示例代码,但解码库没有降噪处理,错误率比正式版高。
iphone:现在我只用到了编码端和使用示例代码,解码端没有编译。
windows:现在我只用到了解码端,所以只有解码库,限制了使用次数。windows平台文件夹下有使用声波通讯库的完整示例代码,这些示例代码实际上是跨平台,可在任何支持c的平台上编译运行,包括linux,arm,mipsel等平台,arm平台,linux平台,mipsel平台上使用解码库与windows相同,链接时去链接相应平台的.so文件就可以了。示例中包括从wav文件读取音频数据,或者从录音机读取音频数据。
arm:现在我只用到了解码端,所以只有解码库,限制了使用次数。解码使用示例代码见windows文件夹下
linux:现在我只用到了解码端,所以只有解码库,限制了使用次数。解码使用示例代码见windows文件夹下
mipsel:现在我只用到了解码端,所以只有解码库,限制了使用次数。解码使用示例代码见windows文件夹下
下载附件:附件
51CTO下载附件地址
作者: 夜行侠 QQ:3116009971 邮件:3116009971@qq.com
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。