2022-5-4 22:35:21 [显示全部楼层]
278浏览
查看: 278|回复: 0

[问题求助] 【求助】语音识别 不正常工作

[复制链接]
本帖最后由 reihold 于 2022-5-4 22:50 编辑

语音识别#      #asr#     #红外遥控

最近想着自己做一个可以app控制及语音控制的红外遥控器,目前基本的红外光线调制已经写好了,可以正常通信。正在写一个通过巴法云的通信,起到上云,app控制的功能。可是,问题就出现了
大概的情况是
这是没加socket通信前的代码(语音识别控制):

while True:
        # time.sleep(1)
        tmp = t.recognize()
        print(tmp)
        if tmp != None:
            # print(tmp)
            print(type(list(tmp.keys())[0]))
            print(list(tmp.keys())[0])
            tim.stop()
            t.stop()
            tim2.stop()

            if list(tmp.keys())[0] == "guan-bi":
                print("guanbi")
                my_lib.ir_send_gree_off()
            if list(tmp.keys())[0] == "da-kai":
                print("dakai")
                my_lib.ir_send_gree()

到这里,一起都是正常的,我希望通过app也能控制,于是,有了下面的核心代码

    while True:
        # time.sleep(1)
        tmp = t.recognize()
        print(tmp)
        if tmp != None:
            # print(tmp)
            print(type(list(tmp.keys())[0]))
            print(list(tmp.keys())[0])
            tim.stop()
            t.stop()
            tim2.stop()

            if list(tmp.keys())[0] == "guan-bi":
                print("guanbi")
                my_lib.ir_send_gree_off()
            if list(tmp.keys())[0] == "da-kai":
                print("dakai")
                my_lib.ir_send_gree()
            tim.restart()
            tim2.restart()
            t.run()
        print("--------socket 接收中-------")

        data = client.recv(128)    # 从服务器端套接字中读取字节数据, 超时等待1s
        #data = poller.poll(1000)  # time in milliseconds
        if(len(data) != 0):                             # 如果接收数据为0字节时,关闭套接字
            data=data.decode('utf-8')
            print(data.strip())                         # 去掉尾部回车换行符,并打印接收到的字符
        print("-------socket 接收结束-------")

经过测试排查,发现删除clinet.recv(128)之后语音又能正常工作。(我用了data = b'abcdefg')进行了替换,这时候socket不会阻塞读取。(注,我设置了socket的超时等待是1s)

打印的结果如下:语音识别一直是none

attachmentId-3234

我想这个应该问题大概出在语音识别模块的时序上,但是我不知道正确解决问题的方向,希望大佬指点! 不慎感激!
: )



现阶段的全部代码如下:
  1. from machine import Timer
  2. import my_lib
  3. import utime
  4. from speech_recognizer import asr
  5. from Maix import GPIO, I2S
  6. from fpioa_manager import fm
  7. import socket
  8. import network
  9. import gc
  10. import os
  11. import machine
  12. from fpioa_manager import fm
  13. from board import board_info
  14. import time
  15. fm.register(20, fm.fpioa.I2S0_IN_D0, force=True)
  16. fm.register(32, fm.fpioa.I2S0_SCLK, force=True)  # dock 32
  17. fm.register(30, fm.fpioa.I2S0_WS, force=True)   # dock 30
  18. rx = I2S(I2S.DEVICE_0)
  19. rx.channel_config(rx.CHANNEL_0, rx.RECEIVER, align_mode=I2S.STANDARD_MODE)
  20. rx.set_sample_rate(16000)
  21. print(rx)
  22. #需要修改的地方
  23. wifiName = "*******"                   #wifi 名称,不支持5G wifi
  24. wifiPassword = "**********"       #wifi 密码
  25. clientID = "***************"   # Client ID ,密钥,巴法云控制台获取
  26. myTopic='************'                     # 需要订阅的主题值,巴法MQTT控制台创建
  27. #默认设置
  28. serverIP = 'bemfa.com'    # mqtt 服务器地址
  29. port = 8344
  30. class maix_asr(asr):
  31.     asr_vocab = ["lv", "shi", "yang", "chun", "yan", "jing", "da", "kuai", "wen", "zhang", "de", "di", \
  32.         "se", "si", "yue", "lin", "luan", "geng", "xian", "huo", "xiu", "mei", "yi", "ang", "ran", "ta",\
  33.             "jin", "ping", "yao", "bu", "li", "liang", "zai", "yong", "dao", "shang", "xia", "fan", "teng",\
  34.             "dong", "she", "xing", "zhuang", "ru", "hai", "tun", "zhi", "tou", "you", "ling", "pao",\
  35.             "hao", "le", "zha", "zen", "me", "zheng", "cai", "ya", "shu", "tuo", "qu", "fu", "guang",\
  36.             "bang", "zi", "chong", "shui", "cuan", "ke", "shei", "wan", "hou", "zhao", "jian", "zuo", "cu",\
  37.                  "hei", "yu", "ce", "ming", "dui", "cheng", "men", "wo", "bei", "dai", "zhe", "hu", "jiao",
  38.                  "pang", "ji", "lao", "nong", "kang", "yuan", "chao", "hui", "xiang", "bing", "qi", "chang",
  39.                  "nian", "jia", "tu", "bi", "pin", "xi", "zou", "chu", "cun", "wang", "na", "ge", "an", "ning",
  40.                   "tian", "xiao", "zhong", "shen", "nan", "er", "ri", "zhu", "xin", "wai", "luo", "gang", "qing",
  41.                   "xun", "te", "cong", "gan", "lai", "he", "dan", "wei", "die", "kai", "ci", "gu", "neng", "ba",
  42.                   "bao", "xue", "shuai", "dou", "cao", "mao", "bo", "zhou", "lie", "qie", "ju", "chuan", "guo",
  43.                   "lan", "ni", "tang", "ban", "su", "quan", "huan", "ying", "a", "min", "meng", "wu", "tai",
  44.                    "hua", "xie", "pai", "huang", "gua", "jiang", "pian", "ma", "jie", "wa", "san", "ka",
  45.                     "zong", "nv", "gao", "ye", "biao", "bie", "zui", "ren", "jun", "duo", "ze", "tan",
  46.                      "mu", "gui", "qiu", "bai", "sang", "jiu", "yin", "huai", "rang", "zan", "shuo", "sha", "ben",
  47.             "yun", "la", "cuo", "hang", "ha", "tuan", "gong", "shan", "ai", "kou", "zhen", "qiong",
  48.             "ding", "dang", "que", "weng", "qian", "feng", "jue", "zhuan", "ceng", "zu", "bian", "nei",
  49.              "sheng", "chan", "zao", "fang", "qin", "e", "lian", "fa", "lu", "sun", "xu", "deng",
  50.              "guan", "shou", "mo", "zhan", "po", "pi", "gun", "shuang", "qiang", "kao", "hong",
  51.              "kan", "dian", "kong", "pei", "tong", "ting", "zang", "kuang", "reng", "ti", "pan",
  52.               "heng", "chi", "lun", "kun", "han", "lei", "zuan", "man", "sen", "duan", "leng",
  53.                "sui", "gai", "ga", "fou", "kuo", "ou", "suo", "sou", "nu", "du", "mian", "chou",
  54.                 "hen", "kua", "shao", "rou", "xuan", "can", "sai", "dun", "niao", "chui",
  55.                 "chen", "hun", "peng", "fen", "cang", "gen", "shua", "chuo", "shun", "cha",
  56.                 "gou", "mai", "liu", "diao", "tao", "niu", "mi", "chai", "long", "guai", "xiong",
  57.                 "mou", "rong", "ku", "song", "che", "sao", "piao", "pu", "tui", "lang", "chuang",
  58.                 "keng", "liao", "miao", "zhui", "nai", "lou", "bin", "juan", "zhua", "run", "zeng",
  59.                  "ao", "re", "pa", "qun", "lia", "cou", "tie", "zhai", "kuan", "kui", "cui", "mie",
  60.                  "fei", "tiao", "nuo", "gei", "ca", "zhun", "nie", "mang", "zhuo", "pen", "zun", "niang",
  61.                  "suan", "nao", "ruan", "qiao", "fo", "rui", "rao", "ruo", "zei", "en", "za", "diu",
  62.                  "nve", "sa", "nin", "shai", "nen", "ken", "chuai", "shuan", "beng", "ne", "lve", "qia",
  63.                   "jiong", "pie", "seng", "nuan", "nang", "miu", "pou", "cen", "dia", "o", "zhuai", "yo",
  64.                    "dei", "n", "ei", "nou", "bia", "eng", "den", "_"]
  65.     def get_asr_list(string='xiao-ai-fas-tong-xue'):
  66.         return [__class__.asr_vocab.index(t) for t in string.split('-') if t in __class__.asr_vocab]
  67.     def get_asr_string(listobj=[117, 214, 257, 144]):
  68.         return '-'.join([__class__.asr_vocab[t] for t in listobj if t < len(__class__.asr_vocab)])
  69.     def unit_test():
  70.         print(__class__.get_asr_list('xiao-ai'))
  71.         print(__class__.get_asr_string(
  72.             __class__.get_asr_list('xiao-ai-fas-tong-xue')))
  73.     def config(self, sets):
  74.         self.set([(sets[key], __class__.get_asr_list(key)) for key in sets])
  75.     def recognize(self):
  76.         res = self.result()
  77.         # print(tmp)
  78.         if res != None:
  79.             sets = {}
  80.             for tmp in res:
  81.                 sets[__class__.get_asr_string(tmp[1])] = tmp[0]
  82.                 #print(tmp[0], get_asr_string(tmp[1]))
  83.             return sets
  84.         return None
  85. # WIFI 连接函数   maixpy 适配完成
  86. def do_connect():
  87.     fm.register(7,fm.fpioa.UART2_TX) # wifi的引脚,详见
  88.                                      # https://github.com/sipeed/MaixPy_scripts
  89.                                      # /blob/master/board/config_maix_dock.py 配置文件
  90.     fm.register(6,fm.fpioa.UART2_RX)
  91.     uart = machine.UART(machine.UART.UART2,115200,timeout=1000, read_buf_len=4096)
  92.     nic=network.ESP8285(uart)
  93.     nic.connect(wifiName,wifiPassword)
  94.     if not nic.isconnected():
  95.         print('connecting to network...')
  96.         nic.connect(wifiName, wifiPassword)
  97.         while not nic.isconnected():
  98.             pass
  99.     print('connect  WiFi ok')
  100. # tcp 客户端初始化 #TODO
  101. def connect_and_subscribe():
  102.   addr_info = socket.getaddrinfo(serverIP, port)
  103.   addr = addr_info[0][-1]
  104.   client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   # 创建TCP的套接字,也可以不给定参数。默认为TCP通讯方式
  105.   client.connect(addr)                                 # 设置要连接的服务器端的IP和端口,并连接
  106.   print('set socket delay')
  107.   client.settimeout(1) # 设置1s的超时
  108.   print('finish socket delay setting')
  109.   substr = 'cmd=1&uid='+clientID+'&topic='+myTopic+'\r\n'
  110.   client.send(substr.encode("utf-8"))
  111.   print("Connected to %s" % serverIP)
  112.   return client
  113. #心跳 #TODO
  114. def Ping(timer):
  115.     # 发送心跳
  116.     try:
  117.         print("send alive, ping!")
  118.         keeplive = 'ping\r\n'
  119.         timer.callback_arg().send(keeplive.encode("utf-8"))
  120.         #client.send(keeplive.encode("utf-8"))
  121.     except:
  122.         restart_and_reconnect()
  123. # 重新连接  #TODO
  124. def restart_and_reconnect():
  125.   print('Failed to connect to TCP  broker. Reconnecting...')
  126.   time.sleep(10)
  127.   machine.reset()
  128. def on_timer(timer):
  129.     #print("time up:",timer)
  130.     print("param:",timer.callback_arg())
  131.     timer.callback_arg().state()
  132. try:
  133.     # 连接局域网wifi
  134.     do_connect()
  135.     #开始连接TCP
  136.     try:
  137.         client = connect_and_subscribe()
  138.     except OSError as e:
  139.         print(e)
  140.         restart_and_reconnect()
  141.     # 与巴法云的ping连接, 保持心跳连接, 配置周期回调
  142.     tim2 = Timer(Timer.TIMER2, Timer.CHANNEL0, mode=Timer.MODE_PERIODIC,
  143.                 period=10000, callback=Ping, arg = client)
  144.     tim2.start()
  145.     # default: maix dock / maix duino set shift=0
  146.     t = maix_asr(0x500000, I2S.DEVICE_0, 3, shift=0)  # maix bit set shift=1
  147.     tim = Timer(Timer.TIMER0, Timer.CHANNEL0,
  148.                 mode=Timer.MODE_PERIODIC, period=10000, callback=on_timer, arg=t)
  149.     t.config({
  150.         'da-kai': 0.3,
  151.         'guan-bi': 0.3
  152.     })
  153.     print(t.get())
  154.     while True:
  155.         # time.sleep(1)
  156.         tmp = t.recognize()
  157.         print(tmp)
  158.         if tmp != None:
  159.             # print(tmp)
  160.             print(type(list(tmp.keys())[0]))
  161.             print(list(tmp.keys())[0])
  162.             tim.stop()
  163.             t.stop()
  164.             tim2.stop()
  165.             if list(tmp.keys())[0] == "guan-bi":
  166.                 print("guanbi")
  167.                 my_lib.ir_send_gree_off()
  168.             if list(tmp.keys())[0] == "da-kai":
  169.                 print("dakai")
  170.                 my_lib.ir_send_gree()
  171.             tim.restart()
  172.             tim2.restart()
  173.             t.run()
  174.         print("--------socket 接收中-------")
  175.         data = client.recv(128)    # 从服务器端套接字中读取字节数据, 超时等待1s
  176.         #data = poller.poll(1000)  # time in milliseconds
  177.         if(len(data) != 0):                             # 如果接收数据为0字节时,关闭套接字
  178.             data=data.decode('utf-8')
  179.             print(data.strip())                         # 去掉尾部回车换行符,并打印接收到的字符
  180.         print("-------socket 接收结束-------")
  181. except Exception as e:  # 如果出错就重新启动
  182.     print(e)
  183.     print('or Failed to connect to  broker. Reconnecting...')
  184.     restart_and_reconnect()
  185. finally:
  186.     tim.stop()
  187.     tim2.stop()
  188.     client.close()
  189.     t.__del__()
  190.     del t
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail