所有分类
主题 主题
平台 平台
我的工作台
userHead
注册时间 [[userInfo.create_time]]
创造力 [[userInfo.creativity]]
[[userInfo.remark]]
[[d.project_title]]
articleThumb
[[d.material_name]]
timelineThumb
进入工作台
折叠
所有分类 我的工作台
展开
语音助手贾维斯1.0
gray6666 gray6666 2020-05-11 15:27:53
6
0
简单

老规矩:晒测试视频

【项目背景】

  2020注定是个不平常的时期,知识爆炸,AI技术广泛推广。语音识别就是最典型的案例。作为钢铁侠的忠实粉丝,一直计划拥有自己的语音助手贾维斯。恰逢DF推出了“”将懒进行到底的活动“”,项目开始已“”懒“”为目标,抱着走捷径的想法,侧重于问度娘;但一路走下来才发现理想很丰满,现实很骨感,网上坑实在太多。在经历了无数次的出坑,入坑,懒人收获颇丰、语音助手贾维斯1.0版顺利诞生,可以语音对话,解析指令,控制硬件。


以下部分

-贴图为证,让懒进行到底

projectImage

【项目功能】


projectImage

【项目流程】

projectImage
步骤1 步骤1
软件选择(IDE-Thonny Python IDE)

1.win7下的pycharm(目前主流,教程满天飞)

通过对高中信息技术新课改的学习,我理解新课程围绕人工智能技术,推广PBL教学模式,进行学生教学;如何合理的在教学中渗透python,是我一直在思考的问题;前期测试时,为机房安装python教学环境选择的是pycharm,程序写到playsound时一直良好;但识别指令如何调用硬件开灯,关灯遇到了小困扰(台式机没有GPIO接口,用蓝牙、网络服务器过于繁琐);此处只能忍痛放弃。

projectImage
projectImage

2.树莓派4B安装  brust 2020-02-13版系统+virtualenv 虚拟环境,可python开发,带GPIO接口;但缺点是虚拟环境不知何故,总是报错,百度无果,为了赶进度,又换了第三个软件。

python2.7马上要停止维护,本案例python版本为3.7

projectImage

3.树莓派brust系统自带开发IDE-Thonny Python IDE,简单高效,安装库也很方便,友好的图形化界面,很适合学生;最重要的是运行流畅,没报错误。

projectImage

安装库超级简单

projectImage
步骤2 步骤2
硬件选择

话筒测试可以参考我下面的帖子:

https://mc.dfrobot.com.cn/thread-304981-1-1.html

材料清单 材料清单
1x
树莓派4代B型2GB Raspberry Pi
1x
树莓派4B/3B+ IO扩展板
1x
LED模块
1x
USB话筒(某宝10元,音质较差)
1x
蓝牙音响(老哥赠送的)
步骤3 步骤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 步骤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)
	                    				

【项目改进】

代码精简,整理封装,拓展新功能

projectImage
Makelog作者原创文章,未经授权禁止转载。
6
0
评论
[[c.user_name]] [[c.create_time]]
[[c.parent_comment.count]]
[[c.comment_content]]