回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

[超越经典]基于掌控板+mPython的人工智能台灯-《小黑的进化》及聊天机器人 简单

头像 老邬 2021.03.12 1226 1

步骤1 设计背景

很感谢主办方举办的这次活动,参加活动以来,学习懒不了,进步很大,再次感谢。

入围赛提交的作品是基于掌控板、Mind+设计的,发现有以下几个问题:.

1、使用Mind+中的wifi语音识别库(那时,没有发现有I2C语音识别模块,应该刚上市,有点贵),感觉识别准确率不高,识别时间长;看I2C语音识别模块的价格,咳咳..

2、使用SYN6288语音合成模块(I2C通信方式),声音太机器化,没有真人效果;

3、没有采用开关触发,开始录音的时间不好把握;

4、设计这个作品本来就想不断完善,想尝试用Mpythom来编程是不是更好些;

5、还有就是想接入百度AI,使用百度的语音技术(语音识别、语音合成、聊天机器人);应该会大大改善原有的效果;

步骤2 挑战开始-小黑的Ⅳ代

1、拆下原来的SYN6288语音合成模块(I2C通信方式),换成微型数字功放板 2*3W D类PAM8403功放模块,使用百度语音合成,不用自带语音合成的板子;现在只要把声音发出来就可以;

project-image

购买链接:微型数字功放板 2*3W D类PAM8403功放模块2.5~5V小功放板迷你音响电路板配件功放块音频放大器diy可USB供电-tmall.com天猫 https://detail.tmall.com/item.htm?id=18574341954&spm=a1z09.2.0.0.1f452e8dtIukNW&_u=cognj552b5

这片价格只有2.7元,太便宜了,配一只好的喇叭,声音效果确实不错,可以DIY音箱了;它只是微型功放,用杜邦线焊接GND、VCC、S(接 R或L声道 ),另一端接I/O扩展板的P8(默认音频输出)。

2、测温免接触测温头先不用了,主要是测试百度语音功能,简单些吧;

3、加一个大按键做触发,接I/O扩展板的P13;

4、在狗狗的耳朵分别装舵机 ,动动耳朵,生动好玩。

project-image
project-image

步骤3 学习百度智能云-语音技术

很多大神都写过该类的帖子,大家可以上网搜,我也是边搜边学。

学习链接:用mPython玩百度语音 - DF创客社区 - 分享创造的喜悦 https://mc.dfrobot.com.cn/thread-306653-1-1.html

有什么不懂的,请加微信:chqzhc,我尽能力回答。

步骤4 Mpython编程

project-image
project-image
project-image
project-image
project-image
project-image
project-image
project-image

以下是注意事项,具体内容看附件

1、打开mPython0.5.4,我用这个版本,版本低的附件可能打不开,添加--百度语音、Neopixel、Bluebit扩展库;

2、连接WIFI或你的手机热点;

3、初始化灯带数量、全亮后,一定要加设置生效;

4、初始化舵机角度45度;

5、设定几个变量为设定文字合成的音频(后缀为.mp3),还有录制音频(后缀为.wav),后缀名不能错了;

6、OLED设置好后,一定要加显示生效。

7、初始化的内容很多,新建一个函数“初始化”全装进去;

8、把第一个要执行的动作编程都装入一个函数,比如“红灯”、“绿灯”…等等;

9、音频播放后,一定要加一个音频释放缓存;

10、录音时间设为2秒为好,延时短,反应快;

材料清单

代码
from mpython import *

import network

my_wifi = wifi()

my_wifi.connectWiFi('GT-ndwz', '******')

import neopixel

my_rgb = neopixel.NeoPixel(Pin(Pin.P14), n=36, bpp=3, timing=1)

from servo import Servo

import audio

import urequests

import gc

def _E5_88_9D_E5_A7_8B_E5_8C_96():
    global B, R, G, blue, white, black, audio1, audio2, audio3
    B = 0
    my_rgb.fill( (0, 0, 0) )
    my_rgb.write()
    R = 'R.mp3'
    blue = 'Blue.mp3'
    G = 'G.mp3'
    white = 'W.mp3'
    black = 'black.mp3'
    audio1 = 'my.mp3'
    audio2 = 'my2.wav'
    audio3 = 'my3.wav'
    servo_15.write_angle(45)
    servo_16.write_angle(45)
    oled.fill(0)
    oled.DispChar('语音狗狗-小黑', 28, 16, 1, False)
    oled.DispChar('将为您服务', 34, 30, 1, False)
    oled.show()
    import gc;gc.collect()
    audio.player_init(i2c)
    audio.set_volume(100)
    baidu_params = {"API_Key":'**********', "Secret_Key":'**************', "text":'您好,我是语音狗狗小黑,我将为您服务。', "filename":audio1}
    _rsp = urequests.post("http://119.23.66.134:8085/baidu_tts", params=baidu_params)
    with open(audio1, "w") as _f:
        while True:
            dat = _rsp.recv(1024)
            if not dat:
                break
            _f.write(dat)
    audio.play(audio1)
    audio.player_deinit()
    gc.collect()

p13 = MPythonPin(13, PinMode.IN)

import time

def make_rainbow(_neopixel, _num, _bright, _offset):
    _rgb = ((255,0,0), (255,127,0), (255,255,0), (0,255,0), (0,255,255), (0,0,255), (136,0,255), (255,0,0))
    for i in range(_num):
        t = 7 * i / _num
        t0 = int(t)
        r = round((_rgb[t0][0] + (t-t0)*(_rgb[t0+1][0]-_rgb[t0][0]))*_bright)>>8
        g = round((_rgb[t0][1] + (t-t0)*(_rgb[t0+1][1]-_rgb[t0][1]))*_bright)>>8
        b = round((_rgb[t0][2] + (t-t0)*(_rgb[t0+1][2]-_rgb[t0][2]))*_bright)>>8
        _neopixel[(i + _offset) % _num] = (r, g, b)

def _E5_8A_A8_E8_80_B3_E6_9C_B5():
    global B, R, G, blue, white, black, audio1, audio2, audio3
    servo_15.write_angle(5)
    servo_16.write_angle(85)
    time.sleep(3)
    servo_15.write_angle(85)
    servo_16.write_angle(5)

def _E7_BB_BF_E7_81_AF():
    global B, R, G, blue, white, black, audio1, audio2, audio3
    if '绿' in (baidu_iat_result["result"][0]):
        _E5_8A_A8_E8_80_B3_E6_9C_B5()
        my_rgb.fill( (0, 153, 0) )
        my_rgb.write()
        baidu_params = {"API_Key":'***************', "Secret_Key":'*****************', "text":'主人,绿灯开了', "filename":G}
        _rsp = urequests.post("http://119.23.66.134:8085/baidu_tts", params=baidu_params)
        with open(G, "w") as _f:
            while True:
                dat = _rsp.recv(1024)
                if not dat:
                    break
                _f.write(dat)
        audio.play(G)
        audio.player_deinit()
        gc.collect()

def _E7_BA_A2_E7_81_AF():
    global B, R, G, blue, white, black, audio1, audio2, audio3
    if '红' in (baidu_iat_result["result"][0]):
        _E5_8A_A8_E8_80_B3_E6_9C_B5()
        my_rgb.fill( (255, 0, 0) )
        my_rgb.write()
        baidu_params = {"API_Key":'***********************', "Secret_Key":'******************', "text":'主人,红灯开了', "filename":R}
        _rsp = urequests.post("http://119.23.66.134:8085/baidu_tts", params=baidu_params)
        with open(R, "w") as _f:
            while True:
                dat = _rsp.recv(1024)
                if not dat:
                    break
                _f.write(dat)
        audio.play(R)
        audio.player_deinit()
        gc.collect()

def _E8_93_9D_E7_81_AF():
    global B, R, G, blue, white, black, audio1, audio2, audio3
    if '蓝' in (baidu_iat_result["result"][0]):
        _E5_8A_A8_E8_80_B3_E6_9C_B5()
        my_rgb.fill( (0, 0, 153) )
        my_rgb.write()
        baidu_params = {"API_Key":'**********************', "Secret_Key":'**********************', "text":'主人,蓝灯开了', "filename":blue}
        _rsp = urequests.post("http://119.23.66.134:8085/baidu_tts", params=baidu_params)
        with open(blue, "w") as _f:
            while True:
                dat = _rsp.recv(1024)
                if not dat:
                    break
                _f.write(dat)
        audio.play(blue)
        audio.player_deinit()
        gc.collect()

def _E7_99_BD_E7_81_AF():
    global B, R, G, blue, white, black, audio1, audio2, audio3
    if '白' in (baidu_iat_result["result"][0]):
        _E5_8A_A8_E8_80_B3_E6_9C_B5()
        my_rgb.fill( (255, 255, 255) )
        my_rgb.write()
        baidu_params = {"API_Key":'*********************', "Secret_Key":'*******************', "text":'主人,白灯开了', "filename":white}
        _rsp = urequests.post("http://119.23.66.134:8085/baidu_tts", params=baidu_params)
        with open(white, "w") as _f:
            while True:
                dat = _rsp.recv(1024)
                if not dat:
                    break
                _f.write(dat)
        audio.play(white)
        audio.player_deinit()
        gc.collect()

def _E5_85_B3_E7_81_AF():
    global B, R, G, blue, white, black, audio1, audio2, audio3
    if '关' in (baidu_iat_result["result"][0]):
        _E5_8A_A8_E8_80_B3_E6_9C_B5()
        my_rgb.fill( (0, 0, 0) )
        my_rgb.write()
        baidu_params = {"API_Key":'************************', "Secret_Key":'*************************', "text":'主人,您不要我了吗。再见', "filename":black}
        _rsp = urequests.post("http://119.23.66.134:8085/baidu_tts", params=baidu_params)
        with open(black, "w") as _f:
            while True:
                dat = _rsp.recv(1024)
                if not dat:
                    break
                _f.write(dat)
        audio.play(black)
        audio.player_deinit()
        gc.collect()

servo_15 = Servo(15, min_us=500, max_us=2500, actuation_range=180)

servo_16 = Servo(16, min_us=500, max_us=2500, actuation_range=180)
_E5_88_9D_E5_A7_8B_E5_8C_96()
while True:
    B = p13.read_digital()
    time.sleep(0.2)
    if B == 1:
        oled.fill(0)
        oled.DispChar('语音狗狗-小黑', 28, 0, 1, False)
        oled.DispChar('正在录音,时长 2 秒 ...', 0, 16, 1, False)
        oled.show()
        rgb[0] = (int(255), int(0), int(0))
        rgb.write()
        time.sleep_ms(1)
        audio.recorder_init(i2c)
        audio.record(audio2, 2)
        audio.recorder_deinit()
        oled.fill(0)
        oled.DispChar('语音狗狗-小黑', 28, 0, 1, False)
        oled.DispChar('正在识别语音文字 ...', 0, 16, 1, False)
        oled.show()
        rgb[0] = (int(51), int(255), int(51))
        rgb.write()
        time.sleep_ms(1)
        baidu_params = {"API_Key":'*******************', "Secret_Key":'*************************'}
        _rsp = urequests.post("http://119.23.66.134:8085/baidu_asr", files={"file":(audio2, "audio/wav")}, params=baidu_params)
        try:
            baidu_iat_result = _rsp.json()
            if not "result" in baidu_iat_result:
                baidu_iat_result["result"] = ["ERRNO " + str(baidu_iat_result["err_no"])]
        except:
            baidu_iat_result = {"err_msg":"","result":[""]}
        oled.fill(0)
        oled.DispChar('语音狗狗-小黑', 28, 0, 1, False)
        oled.DispChar(str('识别内容:') + str((baidu_iat_result["result"][0])), 0, 32, 1, False)
        oled.DispChar('按下 按键 开始录音', 0, 16, 1, False)
        oled.show()
        rgb[0] = (0, 0, 0)
        rgb.write()
        time.sleep_ms(1)
        import gc;gc.collect()
        audio.player_init(i2c)
        _E7_99_BD_E7_81_AF()
        _E5_85_B3_E7_81_AF()
        _E7_BA_A2_E7_81_AF()
        _E8_93_9D_E7_81_AF()
        _E7_BB_BF_E7_81_AF()
        if '彩' in (baidu_iat_result["result"][0]):
            make_rainbow(my_rgb, 36, 100, 0)
            my_rgb.write()

步骤5 写在最后

1、语音识别的准确率高了很多,合成的声音温柔很多,有点人性化;

2、发现mPython图形化编程中没有将OLED显示屏翻180度的编程模块,Mind+可以翻转;

3、想用代码,找了很久,好象也没有,哪位大神能帮我,求教求教;

4、感觉自己编程水平太差,呆板;得抓紧时间学习;

5、随手也编了个百度聊天机器人,能够语音对话,实在好玩;老男人有点沾沾自喜;

6、感觉用树莓派做聊天机器人,效果可能会更好。下一步就是它了,继续挑战。

评论

user-avatar
  • BhfdPawZ

    BhfdPawZ2022.02.24

    有图纸文件吗

    0