科大讯飞SDK接入-actionScript3版

本文介绍了一个手机游戏项目中引入语音输入功能的过程,包括选择语音引擎供应商科大讯飞的原因及其实现细节,如SDK集成、语音识别、录音保存等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于游戏而言,提高玩家活跃度是一个一直要做的任务。

我现在所在的项目是一个手机端和网页端互通的双端游戏。网页端还好,聊天打字的难度还不算大。手机端则就痛苦了,玩家在用手机玩游戏的时候想交流,

等手机弹出输入框估打上几个字,估计玩家都不想交流了。(打字太他妈的费劲了)

为了提高玩家在线活跃,减少手机用户交流成本,项目组这边准备用语音输入。刚开始要搞的时候心里一紧,没搞过怕弄砸了。苹果用的是siri,感觉好高大上,我终于要涉足这高大上领域了,哈哈!

中文语音引擎当时找到的有两个:科大讯飞和亲加语音。 我在网上仔细比较了科大讯飞和亲加语音。亲加语音主要是内置聊天系统,因为我们的项目是比较老的,聊天系统已经有很深度的整合,所以out掉。科大讯飞这边比较成熟,社区内容挺多SDK的文档比较齐全,所以就选择了科大讯飞。

讯飞语音应用接入流程,地址是:http://open.voicecloud.cn/index.php/default/doccenter/doccenterInner?itemTitle=a2ZsYw== 。

讯飞语音SDK的地址是:http://open.voicecloud.cn/index.php/default/doccenter/doccenterInner?itemTitle=anN3ZA==。 我是做网页端的,选择网页应用中的flash。

SDK按照功能分为四种:语音合成、语音识别、语音听写、智能语义。

客户端开发只需要 语音识别就可以了。

Recognizer为识别核心类。

1、创建recog = new Recognizer( "appid=5452f370asd,timeout=2000", "dev.voicecloud.cn", -1 )。其中appid是我的私人Id,到时候,应用的时候各位替换成自己的就OK了。 

2、开始识别:recog.recogStart( RATE.rate8k, null, "ssm=1,sub=iat,aue=speex-wb;7,auf=audio/L16;rate=8000,ent=sms8k, rst=plain");(参数不可改变,或者我没改对,更改了参数引擎就报错了。)

3、停止识别:recog.recordStop(); 比较简单没有什么好说的。

4、识别结果:recog注册MSCResultEvent.RESULT_GET事件; 返回结果strRslt = e.result.readMultiByte(e.result.bytesAvailable, "GBK"), strRslt 就是语音识别传回的文本信息。

5、recog注册MSCRecordAudioEvent.AUDIO_ARRIVED事件。返回中 event.volume 代表音量的范围。event.data代表所获得音频数据。(这里面有个坑,在下面填。)

6.recog还有可以注册MSCMicStatusEvent.STATUS、MSCErrorEvent.ERROR、MSCEvent.RECOG_COMPLETED等事件,各位看自己的需要注册应用。

因为,我们这边不仅是要获得用户的用户的语音识别转成的文本,还需要用户原始的录音。

所以在实际应用还踩了以下的坑:

1.语音识别recog.recogStar中t的语音频率rate不可以更改,一改就无法识别,估计是服务器端有限制。

2.因为想获得用户的原始录音,刚开始的时候 我是另外注册一个Microphone类,自己获取录音数据,结果自己顺利的获得了用户录音,recog出错无法获得语音识别文本;后来尝试用 MSCRecordAudioEvent.AUDIO_ARRIVED事件中返回的event.data。结果怎么尝试都无法播放。后来我尝试反编译了科大讯飞的swc,原来是返回的都是PCM数据。 我们在播放的时候格式为WAV,没有加WAV的头。

例:

public function addWaveHeader(dataOutput:ByteArray, dataInput:ByteArray) : void
{
var fileSize:uint = 0;
var compressionCode:int = 1;
var numOfChannels:int = 1;
var samplingRate:int = 16000;
var sampleBitRate:int = 16;
var dataSize:uint = 0;
dataInput.position = 0;
dataSize = dataInput.bytesAvailable;
if (dataInput.bytesAvailable <= 0)
{
throw new Error("No audio data");
}
dataOutput.endian = Endian.LITTLE_ENDIAN;
fileSize = 36 + 8 + dataSize;
dataOutput.writeUTFBytes("RIFF");
dataOutput.writeInt(uint(fileSize));
dataOutput.writeUTFBytes("WAVE");
dataOutput.writeUTFBytes("fmt ");
dataOutput.writeInt(uint(16));
dataOutput.writeShort(uint(compressionCode));
dataOutput.writeShort(uint(numOfChannels));
dataOutput.writeInt(samplingRate);
dataOutput.writeInt(uint(samplingRate * numOfChannels * (sampleBitRate >> 3)));
dataOutput.writeShort(uint(numOfChannels * (sampleBitRate >> 3)));
dataOutput.writeShort(sampleBitRate);
dataOutput.writeUTFBytes("data");
dataOutput.writeInt(dataSize);
dataOutput.writeBytes(dataInput);
dataOutput.position = 0;
return;
flash.media.Microphone
}

别的平台的接入,感觉差别不是很大,原理一样。(只是草草的看了下, 说的不对别喷我。)

好吧,我的应用就用到了这些,希望能帮助大家。 逐梦的人,大家一起前进。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值