忙中偷闲,搞个机器人语音交互模块备料,接好串口,插上耳机
打开文档
python代码
import structimport arrayfrom event import *class XFSCommand():#帧头1字节=0xfd 数据长度2字节=n数据(命令字 参数 文本)=n个字节XFS_H=0xFDXFS_COMS={"play": 0x01,"stop":0x02,"pause": 0x03,"resume": 0x04,"state": 0x21,"sleep": 0x88,"weakup": 0xFF,"sendtobuf":0x31,#4K,共分 16 个区,区参数X=(0-15),每个区的空间为 256 字节。 参数后直接跟文本(缓存时没有编码设置)"playbuf":0x32,#参数字节高4是播放次数,低4位是文本编码}XFS_BACK = {"init ok": 0x4A,"com ok": 0x41,"com err": 0x45,"busy": 0x4E,"notbusy": 0x4F}txt_encode_params={"gb2312":0x00,"gbk":0x01,"big5":0x02,"unicode":0x03}def __init__(self):passdef print_cmd_hex(self,cmd):dat = "".join(map(lambda x: (' ' if len(hex(x)) >= 4 else ' 0') + hex(x)[2:], cmd))print(dat)def cmd_play(self,_str,_encode):pd = array.array('B')arraydata = _str.encode(_encode)datalen=len(arraydata)if(datalen>1024*4):#超过4K出错return pdpassreallen=datalen+2pd.append(self.XFS_H)#framehead#length 2 bytesif(reallen>0xff):pd.append(reallen>>8)pd.append(reallen&0xff)else:pd.append(0x00)pd.append(reallen)pd.append(self.XFS_COMS["play"])#cmdpd.append(self.txt_encode_params[_encode])#param#txtdatafor i in range(datalen):pd.append(arraydata[i])return pdpassdef cmd_stop(self):return self.cmd_1_byte( "stop")def cmd_pause(self):return self.cmd_1_byte( "pause")def cmd_resume(self):return self.cmd_1_byte( "resume")def cmd_state(self):return self.cmd_1_byte( "state")def cmd_sleep(self):return self.cmd_1_byte( "sleep")def cmd_weakup(self):return self.cmd_1_byte( "weakup")def cmd_1_byte(self,_n):pd = array.array('B')pd.append(self.XFS_H)pd.append(0x00)pd.append(0x01)pd.append(self.XFS_COMS[_n])return pdpass'''帧头 1 Byte 定义为十六进制“0xFD”数据长度 2 Bytes 用两个字节表示,高字节在前,低字节在后数据区 小于 4k + 2 Bytes 命令字和命令参数,长度和“数据区长度”一致'''#play("科大讯飞",gb2312) [0xFD,0x00, 0x0A, 0x01, 0x00 ,0xBF, 0xC6, 0xB4, 0xF3, 0xD1, 0xB6, 0xB7, 0xC9]# FD 00 0A 01 00 BF C6 B4 F3 D1 B6 B7 C9#big5是繁体字编码,如果文本是简体,需要先转换为繁体#科大訊飛# FD 00 0A 01 02 ac ec a4 6a b0 54 ad b8#stop() [0xFD, 0x00, 0x01, 0x02]'''语音识别返回结果帧头 1 Byte 定义为十六进制“0xFC”数据长度 2 Bytes 用两个字节表示,高字节在前,低字节在后数据区 命令字1字节 识别结果命令字节 1234 为 成功 超时 无结果 错误'''if __name__ == '__main__':#a=u'科大讯飞'print(a.encode())utf8_a=bytearray(a,"utf-8")gb2312_a=a.encode("gb2312")gbk_a = a.encode("gbk")print(utf8_a)print(gb2312_a)print(gbk_a)#big5_a = a.encode('big5')#print(unicode(s, 'big5'))#print(big5_a)print("-------------")cmdObj = XFSCommand()#print(cmdObj.cmd_1_byte("pause"))#print(cmdObj.XFS_COMS["pause"])#print(cmdObj.cmd_pause())cmdObj.print_cmd_hex(cmdObj.cmd_pause())cmdObj.print_cmd_hex(cmdObj.cmd_play("科大讯飞", "gb2312"))cmdObj.print_cmd_hex(cmdObj.cmd_play("科大訊飛", "big5"))#import timewhile 1:time.sleep(1)print(1)
输出与文档示例相同
-------------fd 00 01 03fd 00 0a 01 00 bf c6 b4 f3 d1 b6 b7 c9fd 00 0a 01 02 ac ec a4 6a b0 54 ad b8
这个模块用起来很方便,有了它机器人说话就so easy了。
文档有颜色标注错误的地方,需注意一下,不过无伤大雅