步骤1 设计背景
很感谢主办方举办的这次活动,参加活动以来,学习懒不了,进步很大,再次感谢。
入围赛提交的作品是基于掌控板、Mind+设计的,发现有以下几个问题:.
1、使用Mind+中的wifi语音识别库(那时,没有发现有I2C语音识别模块,应该刚上市,有点贵),感觉识别准确率不高,识别时间长;看I2C语音识别模块的价格,咳咳..
2、使用SYN6288语音合成模块(I2C通信方式),声音太机器化,没有真人效果;
3、没有采用开关触发,开始录音的时间不好把握;
4、设计这个作品本来就想不断完善,想尝试用Mpythom来编程是不是更好些;
5、还有就是想接入百度AI,使用百度的语音技术(语音识别、语音合成、聊天机器人);应该会大大改善原有的效果;
步骤2 挑战开始-小黑的Ⅳ代
1、拆下原来的SYN6288语音合成模块(I2C通信方式),换成微型数字功放板 2*3W D类PAM8403功放模块,使用百度语音合成,不用自带语音合成的板子;现在只要把声音发出来就可以;
购买链接:微型数字功放板 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、在狗狗的耳朵分别装舵机 ,动动耳朵,生动好玩。
步骤3 学习百度智能云-语音技术
很多大神都写过该类的帖子,大家可以上网搜,我也是边搜边学。
学习链接:用mPython玩百度语音 - DF创客社区 - 分享创造的喜悦 https://mc.dfrobot.com.cn/thread-306653-1-1.html
有什么不懂的,请加微信:chqzhc,我尽能力回答。
步骤4 Mpython编程
以下是注意事项,具体内容看附件
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、感觉用树莓派做聊天机器人,效果可能会更好。下一步就是它了,继续挑战。
BhfdPawZ2022.02.24
有图纸文件吗