項(xiàng)目實(shí)例 STM機(jī)離線語(yǔ)音輔助指示設(shè)備

1引言

1.1編寫(xiě)目的

采用圖表等形式簡(jiǎn)要介紹軟硬件設(shè)計(jì)基本結(jié)構(gòu)憾儒,作為后續(xù)二次開(kāi)發(fā)的基礎(chǔ)材料。

1.2背景

本項(xiàng)目為了解決STM機(jī)上禁止代客操作而客戶又因UI界面元素復(fù)雜對(duì)按鈕查找不方便之間的矛盾役电。項(xiàng)目硬件上主要由離線語(yǔ)音識(shí)別模塊和WIFI模塊組成,使用UART,SOCKET等通信方式傳遞控制信息售淡,采用C/S架構(gòu),通過(guò)將語(yǔ)音信息轉(zhuǎn)至視覺(jué)信心瞄摊,輔助客戶辦理業(yè)務(wù)勋又。

1.3定義

離線語(yǔ)音識(shí)別:采用不聯(lián)網(wǎng)的本地語(yǔ)音模型對(duì)語(yǔ)音進(jìn)行模式匹配,輸入匹配結(jié)果换帜。

輔助指示:通過(guò)對(duì)語(yǔ)音識(shí)別的內(nèi)容進(jìn)行封裝傳輸于STM機(jī)上顯式的標(biāo)識(shí)按鈕位置楔壤。

STM機(jī):自主柜員機(jī)。

2總體設(shè)計(jì)

2.1需求規(guī)定

語(yǔ)音識(shí)別模塊:

輸入:語(yǔ)音條目

輸出:UART 串口信息

處理功能: 對(duì)語(yǔ)音信息進(jìn)行匹配得到待UART發(fā)送的數(shù)據(jù)

功能性能需求:高識(shí)別率惯驼,識(shí)別迅速

輸入:UART 串口信息

輸出:SOCKET 通信 SOCK_STREAM

處理功能:

a. 接受串口信息蹲嚣,對(duì)串口信讀取后經(jīng)處理后通過(guò)SOCKET發(fā)送至WIFI模塊2

b. 根據(jù)按鈕選擇要鏈接的WIFI模塊2

功能性能需求:兩塊WIFI模塊鏈接速度迅速,SCOKCT鏈接穩(wěn)定傳輸無(wú)誤

輸入:SOCKET 通信 SOCK_STREAM

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

處理功能:

a. 接受SOCKET信息,讀取后使STM機(jī)對(duì)應(yīng)UI界面元素高亮

b. 可以穿行的接受多個(gè)WIFI模塊1的控制信息

功能性能需求:兩塊WIFI模塊鏈接速度迅速祟牲,SCOKCT鏈接穩(wěn)定傳輸無(wú)誤隙畜,產(chǎn)生對(duì)STM機(jī)UI元素的控制信息

2.2運(yùn)行環(huán)境

軟件環(huán)境:

開(kāi)發(fā)語(yǔ)言:C++,MicroPython

使用服務(wù):SOCKET UART

2.3基本設(shè)計(jì)概念和處理流程

基本設(shè)計(jì)概念:

使用兩塊WIFI模塊間的SOCKET通信傳遞控制信息说贝,服務(wù)端通過(guò)按鈕選擇要鏈接的客戶端议惰,服務(wù)端檢測(cè)鏈接成功后即可開(kāi)始客戶端的信心傳輸工作。離線語(yǔ)音芯片將語(yǔ)音指令轉(zhuǎn)換為二進(jìn)制信息通過(guò)WIFI從客戶端傳遞至服務(wù)端乡恕,客戶端響應(yīng)產(chǎn)生對(duì)STM機(jī)UI元素的控制信息

流程圖:

  1. 使用按鈕選擇鏈接對(duì)應(yīng)的服務(wù)端

  2. 等待WIFI鏈接成功

  3. 說(shuō)出語(yǔ)音指令

  4. 語(yǔ)音指令經(jīng)芯片處理后由客戶端發(fā)送至服務(wù)端

  5. 服務(wù)端接受信息UI界面相應(yīng)

  6. 如改比業(yè)務(wù)完成選擇結(jié)束

  7. 斷開(kāi)兩塊WIFI芯片(服務(wù)端言询,客戶端)的鏈

2.4結(jié)構(gòu)

硬件結(jié)構(gòu)分為服務(wù)端和客戶端兩個(gè)部分:

客戶端為服務(wù)人員攜帶的便攜設(shè)設(shè)備,應(yīng)使用電池供電傲宜。主要組成部分為語(yǔ)音識(shí)別芯片VB-01以及ESP-32WIFI模塊(拾音器以及喇叭未畫(huà)出)运杭。負(fù)責(zé)語(yǔ)音信息的接受產(chǎn)生控制信息以及對(duì)控制信息的傳輸,在客戶端設(shè)備上可由按鈕選擇需要鏈接的STM機(jī)客戶端對(duì)其進(jìn)行控制函卒。

服務(wù)端由一塊ESP-8266芯片和UART轉(zhuǎn)USB器組成辆憔,負(fù)責(zé)將從客戶端接受到的控制信息轉(zhuǎn)換成控制UI界面的控制信息。

關(guān)系結(jié)構(gòu):

一對(duì)一通信:一個(gè)客戶端于一個(gè)服務(wù)端鏈接,產(chǎn)生控制信息虱咧,點(diǎn)對(duì)點(diǎn)通信熊榛。

多對(duì)一通信:多個(gè)客戶端于一個(gè)服務(wù)端鏈接,并行的傳遞控制信息彤钟。

2.5尚未問(wèn)決的問(wèn)題

說(shuō)明在概要設(shè)計(jì)過(guò)程中尚未解決而設(shè)計(jì)者認(rèn)為在系統(tǒng)完成之前必須解決的各個(gè)問(wèn)題来候。

  1. 未考慮到傳輸過(guò)程中的安全性以及與STM機(jī)連接的到形式和在該機(jī)上運(yùn)行的服務(wù)程序的傳輸協(xié)議和接入方式。

  2. 未設(shè)計(jì)詳細(xì)的PCB走線逸雹,原型模型使用開(kāi)發(fā)板以杜邦線形式鏈接营搅。按鍵較少,對(duì)應(yīng)方式為一對(duì)一對(duì)于多機(jī)的鏈接有一定問(wèn)題梆砸。

  3. 離線語(yǔ)音識(shí)別芯片的語(yǔ)音條目目前支持只有50條可以考慮使用存儲(chǔ)空間更大的芯片转质。

3軟件設(shè)計(jì)

客戶端源碼:

#通過(guò)按鈕鏈接網(wǎng)絡(luò)測(cè)試
import time

import network
import utime
from machine import  Pin



def uartGet():
   from machine import UART

   # 初始化一個(gè)UART對(duì)象
   uart = UART(2, baudrate=115200, rx=16, tx=17, timeout=10)

   #初始化socket 對(duì)象
   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():   # 判斷有無(wú)連接
       print('connecting to network...')
       sta_if.active(True)        # 激活wifi接口
       sta_if.connect(essid, password)  # 連接現(xiàn)有wifi網(wǎng)絡(luò),需要替換為已知的熱點(diǎn)名稱(chēng)和密碼
       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())  # 輸出當(dāng)前wifi網(wǎng)絡(luò)給自己分配的網(wǎng)絡(luò)參數(shù)
   print('------------------------------------')


def disconnectWifi():
   '''
   斷開(kāi)網(wǎng)絡(luò)連接
   '''
   sta_if = network.WLAN(network.STA_IF)
   if sta_if.isconnected():
       sta_if.disconnect()
       print('the network had been disconnect')



#初始化 按鈕對(duì)應(yīng)的針腳
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()
   #每次接受的數(shù)據(jù)為持續(xù)的000 或111  通過(guò)判斷只輸出單次的結(jié)果
   if pressKey1.value()==0 and pressKey2.value() == 0 and pressKey3.value()==0 and pressKey4.value()==0:
       flag = True

服務(wù)端源碼:

import network
import socket
import time

# SSID = "7-704"  # 修改為你的WiFi名稱(chēng)
# PASSWORD = "qmy980902"  # 修改為你WiFi密碼
port = 10000  # 端口號(hào)
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")      # 設(shè)置熱點(diǎn)名稱(chēng)
ap.config(authmode=3, password='1234567890')  # 設(shè)置認(rèn)證模式與密碼
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()  # 創(chuàng)建套接字
    print("bind ip:{} port:{}".format(ip,port))
    listenSocket.bind((ip, port))  # 綁定地址和端口號(hào)
    listenSocket.listen(2)  # 監(jiān)聽(tīng)套接字
    listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 設(shè)置套接字
    print('tcp waiting...')

    while True:
        print("accepting.....")
        conn, addr = listenSocket.accept()  # 接收連接請(qǐng)求休蟹,返回收發(fā)數(shù)據(jù)的套接字對(duì)象和客戶端地址
        print(addr, "connected")

        while True:
            data = conn.recv(1024)  # 接收數(shù)據(jù)(1024字節(jié)大小)
            if (len(data) == 0):  # 判斷客戶端是否斷開(kāi)連接
                print("closesocket")
                conn.close()  # 關(guān)閉套接字
                break
            print(data)
            print(type(data))
            print("send uart data")
            uart.write(data)
            # ret = conn.send(data)  # 發(fā)送數(shù)據(jù)
except:
    if (listenSocket):  # 判斷套接字是否為空
        listenSocket.close()  # 關(guān)閉套接字

演示視頻:
https://www.bilibili.com/video/BV1tf4y1M7Ae?spm_id_from=333.999.0.0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末日矫,一起剝皮案震驚了整個(gè)濱河市赂弓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哪轿,老刑警劉巖盈魁,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異窃诉,居然都是意外死亡杨耙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)飘痛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)珊膜,“玉大人,你說(shuō)我怎么就攤上這事宣脉〕的” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵塑猖,是天一觀的道長(zhǎng)堪遂。 經(jīng)常有香客問(wèn)我,道長(zhǎng)萌庆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任币旧,我火速辦了婚禮践险,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己巍虫,他們只是感情好彭则,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著占遥,像睡著了一般俯抖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓦胎,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天芬萍,我揣著相機(jī)與錄音,去河邊找鬼搔啊。 笑死柬祠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的负芋。 我是一名探鬼主播漫蛔,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旧蛾!你這毒婦竟也來(lái)了莽龟?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锨天,失蹤者是張志新(化名)和其女友劉穎毯盈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體绍绘,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奶镶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陪拘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厂镇。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖左刽,靈堂內(nèi)的尸體忽然破棺而出捺信,到底是詐尸還是另有隱情,我是刑警寧澤欠痴,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布迄靠,位于F島的核電站,受9級(jí)特大地震影響喇辽,放射性物質(zhì)發(fā)生泄漏掌挚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一菩咨、第九天 我趴在偏房一處隱蔽的房頂上張望吠式。 院中可真熱鬧陡厘,春花似錦、人聲如沸特占。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)是目。三九已至谤饭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懊纳,已是汗流浹背揉抵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留长踊,地道東北人功舀。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像身弊,于是被迫代替她去往敵國(guó)和親辟汰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容