项目实例 STM机离线语音辅助指示设备

1引言

1.1编写目的

采用图表等形式简要介绍软硬件设计基本结构,作为后续二次开发的基础材料。

1.2背景

本项目为了解决STM机上禁止代客操作而客户又因UI界面元素复杂对按钮查找不方便之间的矛盾。项目硬件上主要由离线语音识别模块和WIFI模块组成,使用UART,SOCKET等通信方式传递控制信息,采用C/S架构,通过将语音信息转至视觉信心,辅助客户办理业务。

1.3定义

离线语音识别:采用不联网的本地语音模型对语音进行模式匹配,输入匹配结果。

辅助指示:通过对语音识别的内容进行封装传输于STM机上显式的标识按钮位置。

STM机:自主柜员机。

2总体设计

2.1需求规定

语音识别模块:

输入:语音条目

输出:UART 串口信息

处理功能: 对语音信息进行匹配得到待UART发送的数据

功能性能需求:高识别率,识别迅速

输入:UART 串口信息

输出:SOCKET 通信 SOCK_STREAM

处理功能:

a. 接受串口信息,对串口信读取后经处理后通过SOCKET发送至WIFI模块2

b. 根据按钮选择要链接的WIFI模块2

功能性能需求:两块WIFI模块链接速度迅速,SCOKCT链接稳定传输无误

输入:SOCKET 通信 SOCK_STREAM

输出:GPIO控制信息或UART 串口信息

处理功能:

a. 接受SOCKET信息,读取后使STM机对应UI界面元素高亮

b. 可以穿行的接受多个WIFI模块1的控制信息

功能性能需求:两块WIFI模块链接速度迅速,SCOKCT链接稳定传输无误,产生对STM机UI元素的控制信息

2.2运行环境

软件环境:

开发语言:C++,MicroPython

使用服务:SOCKET UART

2.3基本设计概念和处理流程

基本设计概念:

使用两块WIFI模块间的SOCKET通信传递控制信息,服务端通过按钮选择要链接的客户端,服务端检测链接成功后即可开始客户端的信心传输工作。离线语音芯片将语音指令转换为二进制信息通过WIFI从客户端传递至服务端,客户端响应产生对STM机UI元素的控制信息

流程图:

  1. 使用按钮选择链接对应的服务端

  2. 等待WIFI链接成功

  3. 说出语音指令

  4. 语音指令经芯片处理后由客户端发送至服务端

  5. 服务端接受信息UI界面相应

  6. 如改比业务完成选择结束

  7. 断开两块WIFI芯片(服务端,客户端)的链

2.4结构

硬件结构分为服务端和客户端两个部分:

客户端为服务人员携带的便携设设备,应使用电池供电。主要组成部分为语音识别芯片VB-01以及ESP-32WIFI模块(拾音器以及喇叭未画出)。负责语音信息的接受产生控制信息以及对控制信息的传输,在客户端设备上可由按钮选择需要链接的STM机客户端对其进行控制。

服务端由一块ESP-8266芯片和UART转USB器组成,负责将从客户端接受到的控制信息转换成控制UI界面的控制信息。

关系结构:

一对一通信:一个客户端于一个服务端链接,产生控制信息,点对点通信。

多对一通信:多个客户端于一个服务端链接,并行的传递控制信息。

2.5尚未问决的问题

说明在概要设计过程中尚未解决而设计者认为在系统完成之前必须解决的各个问题。

  1. 未考虑到传输过程中的安全性以及与STM机连接的到形式和在该机上运行的服务程序的传输协议和接入方式。

  2. 未设计详细的PCB走线,原型模型使用开发板以杜邦线形式链接。按键较少,对应方式为一对一对于多机的链接有一定问题。

  3. 离线语音识别芯片的语音条目目前支持只有50条可以考虑使用存储空间更大的芯片。

3软件设计

客户端源码:

#通过按钮链接网络测试
import time

import network
import utime
from machine import  Pin



def uartGet():
   from machine import UART

   # 初始化一个UART对象
   uart = UART(2, baudrate=115200, rx=16, tx=17, timeout=10)

   #初始化socket 对象
   import socket
   client = socket.socket()
   client.connect(('192.168.4.1', 10000))

   while True:
    

       if uart.any():
           bin_data = uart.readline()
           print(bin_data)


           client.send(bin_data)



def connectnetWifi(essid,password):
   sta_if = network.WLAN(network.STA_IF)  # 配置wifi模式为station
   if not sta_if.isconnected():   # 判断有无连接
       print('connecting to network...')
       sta_if.active(True)        # 激活wifi接口
       sta_if.connect(essid, password)  # 连接现有wifi网络,需要替换为已知的热点名称和密码
       while not sta_if.isconnected():
           utime.sleep(1)   # 未连接上就等待一下,直到连接成功
   print("essid: {},password: {}".format(essid,password))
   print(sta_if.config("essid"))
   print('network config:', sta_if.ifconfig())  # 输出当前wifi网络给自己分配的网络参数
   print('------------------------------------')


def disconnectWifi():
   '''
   断开网络连接
   '''
   sta_if = network.WLAN(network.STA_IF)
   if sta_if.isconnected():
       sta_if.disconnect()
       print('the network had been disconnect')



#初始化 按钮对应的针脚
pressKey1 = Pin(32)
pressKey2 = Pin(33)
pressKey3 = Pin(14)
pressKey4 = Pin(12)


flag = True

while True:

   if flag == True:

       if pressKey1.value()==1:
           print("1")
           flag = False

       if pressKey1.value()==1:
           print("2")
           flag = False

       if pressKey3.value()==1:

           disconnectWifi()
           print('3')
           flag = False
           connectnetWifi('ESP-32','1234567890')

           uartGet()


       if pressKey4.value()==1:
           disconnectWifi()
           print("4")
           flag = False
           connectnetWifi('ESP-8266', '1234567890')
           # socketClinet()
   #每次接受的数据为持续的000 或111  通过判断只输出单次的结果
   if pressKey1.value()==0 and pressKey2.value() == 0 and pressKey3.value()==0 and pressKey4.value()==0:
       flag = True

服务端源码:

import network
import socket
import time

# SSID = "7-704"  # 修改为你的WiFi名称
# PASSWORD = "qmy980902"  # 修改为你WiFi密码
port = 10000  # 端口号
wlan = None  # wlan
listenSocket = None  # 套接字


from machine import UART

import time

uart = UART(1,baudrate=9600)




import network
ap = network.WLAN(network.AP_IF)  # 指定用ap模式
ap.active(True)                   # 启用wifi前需要先激活接口
ap.config(essid="ESP-32")      # 设置热点名称
ap.config(authmode=3, password='1234567890')  # 设置认证模式与密码
print(ap.ifconfig())

# Catch exceptions,stop program if interrupted accidentally in the 'try'
try:
    # connectWifi(SSID, PASSWORD)
    ip = ap.ifconfig()[0]  # 获取IP地址
    listenSocket = socket.socket()  # 创建套接字
    print("bind ip:{} port:{}".format(ip,port))
    listenSocket.bind((ip, port))  # 绑定地址和端口号
    listenSocket.listen(2)  # 监听套接字
    listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 设置套接字
    print('tcp waiting...')

    while True:
        print("accepting.....")
        conn, addr = listenSocket.accept()  # 接收连接请求,返回收发数据的套接字对象和客户端地址
        print(addr, "connected")

        while True:
            data = conn.recv(1024)  # 接收数据(1024字节大小)
            if (len(data) == 0):  # 判断客户端是否断开连接
                print("closesocket")
                conn.close()  # 关闭套接字
                break
            print(data)
            print(type(data))
            print("send uart data")
            uart.write(data)
            # ret = conn.send(data)  # 发送数据
except:
    if (listenSocket):  # 判断套接字是否为空
        listenSocket.close()  # 关闭套接字

演示视频:
https://www.bilibili.com/video/BV1tf4y1M7Ae?spm_id_from=333.999.0.0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容