Arduino小车语音控制

大体思路:

  1. 用Python做服务器
  2. ESP8266WIFI模块接受服务器信息,
  3. 麦克风录制语音上传百度识别,识别后返回结果
  4. 服务器判断返回的结果并发出相应的指令信息(让车前进、后退等)给ESP8266
  5. ESP8266通过串口通信再给Arduino发射信息控制小车

所需物品:

  1. Arduino主板及组装小车所需主板(item.taobao.com/item.htm
  2. WIFI模块,ESP8266(item.taobao.com/item.htm
  3. 杜板线多条
  4. 麦克风

一:按照教程组装好小车,此时小车有寻迹、超声波避障、蓝牙遥控

二:ESP8266烧入程序(zhongbest.com/2017/01/02/esp8266-01%E6%97%A0%E7%BA%BF%E6%A8%A1%E5%9D%97%E7%9A%84arduino%E7%83%A7%E5%86%99%E6%96%B9%E5%BC%8F/

三:Python编写服务器

1. 语音录制
2. 语音识别
3. 服务器

语音录制(record.py):

import wave
from pyaudio import PyAudio,paInt16
from speech import speechChina

framerate=8000
NUM_SAMPLES=2000
channels=1
sampwidth=2
TIME=2
def save_wave_file(filename,data):
    '''save the date to the wavfile'''
    wf=wave.open(filename,'wb')
    wf.setnchannels(channels)
    wf.setsampwidth(sampwidth)
    wf.setframerate(framerate)
    wf.writeframes(b"".join(data))
    wf.close()

def my_record():
    pa=PyAudio()
    stream=pa.open(format = paInt16,channels=1,
                   rate=framerate,input=True,
                   frames_per_buffer=NUM_SAMPLES)
    my_buf=[]
    count=0
    while count<TIME*3:#控制录音时间
        string_audio_data = stream.read(NUM_SAMPLES)
        my_buf.append(string_audio_data)
        count+=1
        print('.')
    save_wave_file('record/01.wav',my_buf)
    stream.close()

chunk=2014
def play():
    wf=wave.open(r"record/01.wav",'rb')
    p=PyAudio()
    stream=p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=
    wf.getnchannels(),rate=wf.getframerate(),output=True)
    while True:
        data=wf.readframes(chunk)
        if data=="":break
        stream.write(data)
    stream.close()
    p.terminate()

def record():
    # while True:
    isPass = input("开始录音(时间5秒):")
    if isPass == '0':
        print("录音")
        my_record()
        print("语音识别")
        return speechChina()
    else:
        return "前进"

语音识别(speech.cy):

  1. 百度AI开放平台注册开发者账号获取APP_ID,API_KEY,SECRET_KEY
  2. 下载Python语音识别SDK
from aip import AipSpeech
import json

APP_ID = '997'
API_KEY = '7yopVC8Y7WlRq1VnU'
SECRET_KEY = 'P33gdGkbuBByrSjquk'

aipSpeech = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
result = aipSpeech.synthesis('你好阿里巴巴', 'zh', 1, {
    'vol': 5,
})

# 读取文件
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        print(filePath)
        return fp.read()

def speechChina():
    results = aipSpeech.asr(get_file_content('record/01.wav'), 'wav', 8000, {
        'lan': 'zh',
    })
    print(results['result'])
    return results['result'][0]

if __name__ == '__main__':
    results = speechChina()
    print(results)

服务器(service.py):

# 导入 socket、sys 模块
import socket
import sys
# 创建 socket 对象
from record import record

serversocket = socket.socket(
    socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
port = 8866
# 绑定端口
serversocket.bind((host, port))
# 设置最大连接数,超过后排队
serversocket.listen(5)
while True:
    # 建立客户端连接
    print("进来了")
    clientsocket, addr = serversocket.accept()
    print(addr)
    while True:
        # accept_data = clientsocket.recv(8024)## conn.recv()接收客户端的内容,接收到的是bytes类型数据
        # accept_data2 = str(accept_data, encoding="utf8")  # str(data,encoding="utf8")用“utf8”进行解码
        # if accept_data2 == 'byebye':
        #     break
        # print("".join(("接收内容:", accept_data2, "客户端口:", str(addr[1]))))
        #send_data = input("输入发送内容:")
        control = record()
        if control.find(u"前") != -1:
            control = 'A'
            print('前进')
        elif control.find(u"后") != -1:
            control = 'B'
            print('后退')
        elif control.find(u"左") != -1:
            control = 'C'
            print('左边')
        elif control.find(u"右") != -1:
            control = 'D'
            print('右边')
        elif control.find(u"停") != -1:
            control = 'E'
            print('停止')
        else:
            control = 'A'
        clientsocket.sendall(bytes(control, encoding="utf8"))  # 发送内容必须为bytes类型数据,bytes(data, encoding="utf8")用“utf8”格式进行编码
    clientsocket.close()
    print("关闭了吗?")

最后放张小车图片:

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

推荐阅读更多精彩内容