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

语音助手贾维斯1.0 简单

头像 gray6666 2020.05.11 3702 7

老规矩:晒测试视频

【项目背景】

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


以下部分

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

project-image

【项目功能】


project-image

【项目流程】

project-image

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

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

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

project-image
project-image

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

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

project-image

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

project-image

安装库超级简单

project-image

步骤2 硬件选择

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

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

材料清单

  • 树莓派4代B型2GB Raspberry Pi X1 链接
  • 树莓派4B/3B+ IO扩展板 X1 链接
  • LED模块 X1 链接
  • USB话筒(某宝10元,音质较差) X1 链接
  • 蓝牙音响(老哥赠送的) X1

步骤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)

【项目改进】

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

project-image

评论

user-avatar
  • 自强不熄

    自强不熄2023.09.15

    语音存储为PCM文件,再经过转换,没有收到语音即刻转为文本的功能吗?

    0
    • 自强不熄

      自强不熄2023.09.15

      语音存储为PCM文件,再经过转换,没有收到语音即刻转为文本的功能吗?

      0
      • 自强不熄

        自强不熄2023.09.15

        语音存储为PCM文件,再经过转换,没有收到语音即刻转为文本的功能吗?

        0
        • 自强不熄

          自强不熄2023.09.15

          语音存储为PCM文件,再经过转换,没有收到语音即刻转为文本的功能吗?

          0
          • 自强不熄

            自强不熄2023.09.15

            语音存储为PCM文件,再经过转换,没有收到语音即刻转为文本的功能吗?

            0
            • 山语

              山语2021.06.08

              写一个简单的通讯协议

              0
              • 山语

                山语2021.06.08

                用Python和arduino串口通信即可得到无限的gpio

                0