忙中偷闲,搞个机器人语音交互模块备料,接好串口,插上耳机
打开文档
python代码
import struct
import array
from event import *
class XFSCommand():
#帧头1字节=0xfd 数据长度2字节=n 数据(命令字 参数 文本)=n个字节
XFS_H=0xFD
XFS_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):
pass
def 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 pd
pass
reallen=datalen+2
pd.append(self.XFS_H)#framehead
#length 2 bytes
if(reallen>0xff):
pd.append(reallen>>8)
pd.append(reallen&0xff)
else:
pd.append(0x00)
pd.append(reallen)
pd.append(self.XFS_COMS["play"])#cmd
pd.append(self.txt_encode_params[_encode])#param
#txtdata
for i in range(datalen):
pd.append(arraydata[i])
return pd
pass
def 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 pd
pass
'''
帧头 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 time
while 1:
time.sleep(1)
print(1)
输出与文档示例相同
-------------
fd 00 01 03
fd 00 0a 01 00 bf c6 b4 f3 d1 b6 b7 c9
fd 00 0a 01 02 ac ec a4 6a b0 54 ad b8
这个模块用起来很方便,有了它机器人说话就so easy了。
文档有颜色标注错误的地方,需注意一下,不过无伤大雅