老规矩:晒测试视频
【项目背景】
2020注定是个不平常的时期,知识爆炸,AI技术广泛推广。语音识别就是最典型的案例。作为钢铁侠的忠实粉丝,一直计划拥有自己的语音助手贾维斯。恰逢DF推出了“”将懒进行到底的活动“”,项目开始已“”懒“”为目标,抱着走捷径的想法,侧重于问度娘;但一路走下来才发现理想很丰满,现实很骨感,网上坑实在太多。在经历了无数次的出坑,入坑,懒人收获颇丰、语音助手贾维斯1.0版顺利诞生,可以语音对话,解析指令,控制硬件。
以下部分
-贴图为证,让懒进行到底
【项目功能】
【项目流程】
步骤1 软件选择(IDE-Thonny Python IDE)
1.win7下的pycharm(目前主流,教程满天飞)
通过对高中信息技术新课改的学习,我理解新课程围绕人工智能技术,推广PBL教学模式,进行学生教学;如何合理的在教学中渗透python,是我一直在思考的问题;前期测试时,为机房安装python教学环境选择的是pycharm,程序写到playsound时一直良好;但识别指令如何调用硬件开灯,关灯遇到了小困扰(台式机没有GPIO接口,用蓝牙、网络服务器过于繁琐);此处只能忍痛放弃。
2.树莓派4B安装 brust 2020-02-13版系统+virtualenv 虚拟环境,可python开发,带GPIO接口;但缺点是虚拟环境不知何故,总是报错,百度无果,为了赶进度,又换了第三个软件。
python2.7马上要停止维护,本案例python版本为3.7
3.树莓派brust系统自带开发IDE-Thonny Python IDE,简单高效,安装库也很方便,友好的图形化界面,很适合学生;最重要的是运行流畅,没报错误。
安装库超级简单
步骤2 硬件选择
话筒测试可以参考我下面的帖子:
https://mc.dfrobot.com.cn/thread-304981-1-1.html
步骤3 采集声音,并转换为百度语音识别的PCM文件
虽然麦克风录制的声音惨不忍睹,但百度的识别还是很给力的。
pyaudio用法可参考:http://people.csail.mit.edu/hubert/pyaudio/
百度语音识别参考: https://cloud.baidu.com/doc/SPEECH/s/1k4o0bmc7
声音采集WAV
# -*- coding: utf-8 -*-
import pyaudio
import wave
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
RECORD_SECONDS = 5
def rec(file_name):
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("开始录音,请说话......")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("录音结束,謝謝!")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(file_name, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
WAV转PCM格式
# -*- coding: utf-8 -*-
import os
def wav_to_pcm(wav_file):
pcm_file = "%s.pcm" %(wav_file.split(".")[0])
os.system("ffmpeg -y -i %s -acodec pcm_s16le -f s16le -ac 1 -ar 16000 %s"%(wav_file,pcm_file))
return pcm_file
步骤4 主程序
# -*- coding: utf-8 -*-
import pyrec
import wav2pcm
from aip import AipSpeech
from pydub import AudioSegment #pip install pydub
from pydub.playback import play#pip install pydub
import RPi.GPIO as GPIO
pyrec.rec("rec.wav")
pcm_file=wav2pcm.wav_to_pcm("rec.wav")
#百度AI語音識別 申请地址 https://ai.baidu.com/
APP_ID = '此处替换成自己的'
API_KEY = '此处替换成自己的'
SECRET_KEY = '此处替换成自己的'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
# 识别本地文件
res=client.asr(get_file_content('rec.pcm'), 'pcm', 16000, {
'dev_pid': 1537,
})
#反饋語音識別結果
print(res)
text = res['result'][0]
print(text)
#按照語音指令進行相關操作
if text=='贾维斯,贾维斯。':
result = client.synthesis('緩衝 嗨~主人您今天真帥啊,', 'zh', 1, {
'vol': 6, 'per': 4, 'spd': 5
})
with open('auido.mp3', 'wb') as f:
f.write(result)
sound = AudioSegment.from_mp3('auido.mp3')
play(sound)
elif text=='开灯。':
result = client.synthesis(' 緩衝 主人,燈已經打開!', 'zh', 1, {
'vol': 6, 'per': 4, 'spd': 5
})
with open('auido.mp3', 'wb') as f:
f.write(result)
sound = AudioSegment.from_mp3('auido.mp3')
play(sound)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)
elif text=='关灯。':
result = client.synthesis(' 緩衝主人,燈已經關閉!', 'zh', 1, {
'vol': 6, 'per': 4, 'spd': 5
})
with open('auido.mp3', 'wb') as f:
f.write(result)
sound = AudioSegment.from_mp3('auido.mp3')
play(sound)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.LOW)
else:
result = client.synthesis(' 對不對不起,您的街頭暗號不對。', 'zh', 1, {
'vol': 6, 'per': 4, 'spd': 5
})
with open('auido.mp3', 'wb') as f:
f.write(result)
sound = AudioSegment.from_mp3('auido.mp3')
play(sound)
【项目改进】
代码精简,整理封装,拓展新功能
自强不熄2023.09.15
语音存储为PCM文件,再经过转换,没有收到语音即刻转为文本的功能吗?
自强不熄2023.09.15
语音存储为PCM文件,再经过转换,没有收到语音即刻转为文本的功能吗?
自强不熄2023.09.15
语音存储为PCM文件,再经过转换,没有收到语音即刻转为文本的功能吗?
自强不熄2023.09.15
语音存储为PCM文件,再经过转换,没有收到语音即刻转为文本的功能吗?
自强不熄2023.09.15
语音存储为PCM文件,再经过转换,没有收到语音即刻转为文本的功能吗?
山语2021.06.08
写一个简单的通讯协议
山语2021.06.08
用Python和arduino串口通信即可得到无限的gpio