前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python语音智能对话聊天机器人--linux&&树莓派双平台兼容

python语音智能对话聊天机器人--linux&&树莓派双平台兼容

作者头像
十四君
发布2022-04-02 09:23:59
2.1K0
发布2022-04-02 09:23:59
举报
文章被收录于专栏:UrlteamUrlteam

此项目只不过是之前大三刚学python就想做点好玩的项目试试看(因此技术含量不高),后来这个成为毕业设计的一部分,长期看博客上访问量也不错,就发布出来,希望有想入门python 的朋友可以参考写来玩玩,用项目练技术,用成果获取编码的乐趣。

-------------------*********---------********

项目简介:运用百度语音进行声音转中文的识别与合成,智能对话使用图灵机器人,录音则,linux端用pythonaudio 模块.树莓派端因为pythonaudio不兼容问题,因此用arecord进行录音.最终代码约150行.

代码发布在github上:luyishisi/python_yuyinduihua

博客有该文的原文:python语音智能对话聊天机器人,linux&&树莓派双平台兼容 | | URl-team

0.目录:

  • 1:环境搭建
  • 2:百度语音合成与识别
  • 3:图灵机器人
  • 4:linux下使用pythonaudio进行音频解析
  • 5:树莓派下使用arecord进行录音
  • 6:linux整体调试
  • 7:主要bug解析
  • 8:源代码树莓派下的

1.环境搭建

这点非常关键,在后期多数问题都是出现在环境不兼容上.

1.1:linux 版本

代码语言:javascript
复制
# -*- coding: utf-8 -*-
from pyaudio import PyAudio, paInt16
import numpy as np
from datetime import datetime
import wave
import time
import urllib, urllib2, pycurl
import base64
import json
import os
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

这部分环境最好搭建,只需要

apt-get install python-wave* 这类的安装命令就可以轻松搞定.本质上安装模块就是在找安装的命令.我一半就是把模块肯定会有的名词后面接上*用于模糊匹配.

如果有模块不懂得装,还是百度一下,难度不大.还有mpg123用来播发

1.2:树莓派版本

如果你出现这个博文下出现的错误,请果断弃坑.换用命令行录音实现,不要折腾pyaudio了.

http://komey.utdme.com/archives/2321?utm_source=tuicool&utm_medium=referral

代码语言:javascript
复制
##先更新软件包
sudo apt-get update
sudo apt-get upgrade
##安装必要的程序
sudo apt-get -y install alsa-utils alsa-tools alsa-tools-gui alsamixergui

主要使用的工具

想通过终端来调整扬声器的音量,只需要输入alsamixer.这个很重要你使用的录音设备的录音音量需要这里设置,而且你可以明显的看到自己的声卡是否有问题.

使用的录音设备我用的是 Raspberry Pi B+ 3代 USB麦克风 话筒 免驱动 pcduino 树莓派专用

录音的命令使用的是arecord

arecord,aplay是命令行的ALSA声卡驱动的录音和播放工具. arecord是命令行ALSA声卡驱动的录音程序.支持多种文件格式和多个声卡. aplay是命令行播放工具,支持多种文件格式.

命令格式:这部分需要研读一下.主要使用dfr三个参数

代码语言:javascript
复制
       arecord [flags] [filename]
  参数比较多,请从博客获取。

示例:

代码语言:javascript
复制
       aplay -c 1 -t raw -r 22050 -f mu_law foobar
	播放raw文件foobar.以22050Hz,单声道,8位,mu_law格式.

       arecord -d 10 -f cd -t wav -D copy foobar.wav
	以CD质量录制foobar.wav文件10秒钟.使用PCM的"copy".

2:百度语音合成与识别

这部分难度不大,测试代码如下.如有以为情参看之前的博文

代码语言:javascript
复制
代码比较长请从博客或者github获取

3:图灵机器人

官方网址:图灵机器人-中文语境下智能度最高的机器人大脑

图灵机器人部分的测试代码

难度不大非常轻松.你得去注册一下,然后使用他们给你的key和api.剩下的就是json的文本提取

代码语言:javascript
复制
# -*- coding: utf-8 -*-
import urllib
import json

def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

if __name__ == '__main__':

    key = '05ba411481c8cfa61b91124ef7389767'
    api = 'http://www.tuling123.com/openapi/api?key=' + key + '&info='
    while True:
        info = raw_input('我: ')
        request = api + info
        response = getHtml(request)
        dic_json = json.loads(response)
        print '机器人: '.decode('utf-8') + dic_json['text']

4:linux下使用pythonaudio进行音频解析

这部分,在正常电脑上,只要环境没有大问题就很轻松,代码放在整体的源代码中,这里做个小说明.

这部分代码不可运行,在整体源代码中可以.不过这部分稍微需要抽取出来,作为理解

建立的pa是pyudio对象,可以获取当前的音高,然后检测当音高超过200就启动,录音.同时有一个5秒的额外限制.

代码语言:javascript
复制
NUM_SAMPLES = 2000      # pyAudio内部缓存的块的大小
SAMPLING_RATE = 8000    # 取样频率
LEVEL = 1500            # 声音保存的阈值
COUNT_NUM = 20          # NUM_SAMPLES个取样之内出现COUNT_NUM个大于LEVEL的取样则记录声音
SAVE_LENGTH = 8         # 声音记录的最小长度:SAVE_LENGTH * NUM_SAMPLES 个取样
# 开启声音输入
pa = PyAudio()
stream = pa.open(format=paInt16, channels=1, rate=SAMPLING_RATE, input=True,
                frames_per_buffer=NUM_SAMPLES)\
string_audio_data = stream.read(NUM_SAMPLES)
    # 将读入的数据转换为数组
    audio_data = np.fromstring(string_audio_data, dtype=np.short)
    # 计算大于LEVEL的取样的个数
    large_sample_count = np.sum( audio_data > LEVEL )

    temp = np.max(audio_data)
    if temp > 2000 and t == 0:
        t = 1#开启录音
        print "检测到信号,开始录音,计时五秒"
        begin = time.time()
        print temp

5:树莓派下使用arecord进行录音

这里主要还是记录下整体的一些资料.在树莓派上能够成功运行下面的命令就算ok.别的是一路研究的资料.

sudo arecord -D "plughw:1,0" -d 5 f1.wav

参数释义: -D这个参数的意思就选择设备,外部设备就是plughw:1,0 内部设备就是plughw:0,0,树莓派本身并没有录音模块,故没有内部设备。-d 5

的意思就是录制时间为5秒,如果不加这个参数就是一直录音直到ctrol+C停止, 最后生成的文件名字叫做f1.wav

百度语音要求的是16比特的所以还需要设定-f

具体pcm的说明如下:

这都是PCM的一种表示范围的方法,所以表示方法中最小值等价,最大值等价,中间的数据级别就是对应的进度了,可以都映射到-1~1范围。

  • S8: signed 8 bits,有符号字符 = char, 表示范围 -128~127
  • U8: unsigned 8 bits,无符号字符 = unsigned char,表示范围 0~255
  • S16_LE: little endian signed 16 bits,小端有符号字 = short,表示范围 -32768~32767
  • S16_BE: big endian signed 16 bits,大端有符号字 = short倒序(PPC),表示范围 -32768~32767
  • U16_LE: little endian unsigned 16 bits,小端无符号字 = unsigned short,表示范围 0~65535
  • U16_BE: big endian unsigned signed 16 bits,大端无符号字 = unsigned short倒序(PPC),表示范围 0~65535
  • 还有S24_LE,S32_LE等,都可以表示数字的方法,PCM都可以用这些表示。
  • 上面这些值中,所有最小值-128, 0, -32768, -32768, 0, 0对应PCM描叙来说都是一个值,表示最小值,可以量化到浮点-1。所有最大值也是一个值,可以量化到浮点1,其他值可以等比例转换。

PCMU应该是指无符号PCM:可以包括U8,U16_LE,U16_BE,... PCMA应该是指有符号PCM:可以包括S8,S16_LE,S16_BE,...

查看声卡

代码语言:javascript
复制
cat/proc/asound/cards 

cat/proc/asound/modules

6:整体调试linux平台下的

源代码如下:解析在注释上

代码语言:javascript
复制
比较长,请从github获取。

7:主要bug解析

这里算是解析一下主要坑的地方.除了环境因素,就是中文编码,还有对象解析了.源代码中从百度语音识别出来返回的是一个字典对象,而字典对象中有部分是直接一个字符串,有的则是数组,首先得读出字符串来确定是否是succees.然后再读取text数组.中的中文.

另外一个bug是中文编码.要这么处理

代码语言:javascript
复制
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

#还有

#print '机器人: '.decode('utf-8') + dic_json['text']
#huida = ' '.decode('utf-8') + dic_json['text']
a = dic_json['text']
print type(a)
unicodestring = a

# 将Unicode转化为普通Python字符串:"encode"
utf8string = unicodestring.encode("utf-8")

然后移植到树莓派上出现的主要问题是有aercode命令出现文件目录找不到.那么说明是你声卡选择错了,录音声音太小了也是,使用alsamixer选择清楚.

还有录音识别效率问题,问题主要集中在百度有他的要求,所以得设定16bit.然后再听一遍录制的声音,看看音量会不会太大,,有没有很粗糙的声音.最好能分开测试

8:源代码-树莓派环境下

pyaudio错误得我不要不要的,,所以还是绕开,使用aercode进行录音命令,然后python进行掉用..代码也短很多,但是失去了实时处理音波的能力.

代码语言:javascript
复制
代码比较长,请从github获取

原创文章,转载请注明: 转载自URl-team

本文链接地址: python语音智能对话聊天机器人,linux&&树莓派双平台兼容

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0.目录:
  • 1.环境搭建
    • 1.1:linux 版本
      • 1.2:树莓派版本
        • 2:百度语音合成与识别
          • 3:图灵机器人
            • 4:linux下使用pythonaudio进行音频解析
              • 5:树莓派下使用arecord进行录音
                • 6:整体调试linux平台下的
                  • 7:主要bug解析
                    • 8:源代码-树莓派环境下
                    相关产品与服务
                    腾讯智能对话平台
                    腾讯智能对话平台(Tencent Bot Platform,TBP)专注于“对话即服务”的愿景,全面开放腾讯对话系统核心技术,为大型企业客户、开发者和生态合作伙伴提供开发平台和机器人中间件能力,实现便捷、低成本构建人机对话体验和高效、多样化赋能行业。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档