python 科大讯飞XFS5152CE语音合成芯片串口协议测试,机器人说话so easy

忙中偷闲,搞个机器人语音交互模块备料,接好串口,插上耳机

打开文档

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了。

文档有颜色标注错误的地方,需注意一下,不过无伤大雅

发布了78 篇原创文章 · 获赞 76 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_38288618/article/details/95811957
今日推荐