zoukankan      html  css  js  c++  java
  • 树莓派打造对话机器人 Python(转)

    工具列表

     1. **树莓派**(型号不要求,本人使用的是3B)
    
     2. **usb麦克风**(某宝有卖,我就不打广告了) 用来录音
    
     3. **音响或者喇叭**(某宝也有卖) 用来播放     
    

    以上就是需要的工具


    对话机器人分成5步

    1. 第一步:“录音”:录音我用到的是使用了*arecord* 
    安装arecord: sudo apt-get install arecord

                   使用arecord录音:
                   `arecord -D "plughw:1" -f S16_LE -r 16000 -d 3 /home/pi/Desktop/voice.wav`
    

    2.第二步:”语音识别”:语音识别自我感觉使用百度的比较不错,识别率也挺高的 下面附上语音识别代码

    “`

    coding: utf-8

    import sys 
    import json 
    import urllib2 
    import base64 
    import requests

    reload(sys) 
    sys.setdefaultencoding(“utf-8”)

    def get_access_token(): 
    url = “https://openapi.baidu.com/oauth/2.0/token” 
    body = { 
    “grant_type”:”client_credentials”, 
    “client_id” :”此处填写自己的client_id”, 
    “client_secret”:”此处填写自己的client_secret”, 
    }

    r = requests.post(url,data=body,verify=True)
    respond = json.loads(r.text)
    return respond["access_token"]
    

    def yuyinshibie_api(audio_data,token): 
    speech_data = base64.b64encode(audio_data).decode(“utf-8”) 
    speech_length = len(audio_data) 
    post_data = { 
    “format” : “wav”, 
    “rate” : 16000, 
    “channel” : 1, 
    “cuid” : “B8-27-EB-BA-24-14”, 
    “token” : token, 
    “speech” : speech_data, 
    “len” : speech_length 
    }

    url = "http://vop.baidu.com/server_api"
    json_data = json.dumps(post_data).encode("utf-8")
    json_length = len(json_data)
    #print(json_data)
    
    req = urllib2.Request(url, data=json_data)
    req.add_header("Content-Type", "application/json")
    req.add_header("Content-Length", json_length)
    
    #print("asr start request
    ")
    resp = urllib2.urlopen(req)
    #print("asr finish request
    ")
    resp = resp.read()
    resp_data = json.loads(resp.decode("utf-8"))
    if resp_data["err_no"] == 0:
       return resp_data["result"]
    else:
        print(resp_data)
        return None
    

    def asr_main(filename,tok): 
    try: 
    f = open(filename, “rb”) 
    audio_data = f.read() 
    f.close() 
    resp = yuyinshibie_api(audio_data,tok) 
    return resp[0] 
    except Exception,e: 
    print “e:”,e 
    return “识别失败”.encode(“utf-8”)

    **识别完成之后呢 我们就要开始第三步了 我们要和机器人对话 那么它一定得回复我们,对吧。为了能够智能点,我们就用到了图灵得接口 图灵真的非常好用 能够 查天气语音讲故事讲笑话 下面附上第三步的代码 
    “`**

    3.第三步:“图灵回复”

    # coding: utf-8
    
    import requests
    import json
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    
    
    def Tuling(words):
        Tuling_API_KEY = "此处填写自己的Turling KEY"
    
        body = {"key":Tuling_API_KEY,"info":words.encode("utf-8")}
    
        url = "http://www.tuling123.com/openapi/api"
        r = requests.post(url,data=body,verify=True)
    
        if r:
            date = json.loads(r.text)
            print date["text"]
            return date["text"]
        else:
            return None
    

    4.第四步:“语音合成” 图灵回复了之后 我们要让它播放出来 就用到了百度的语音合成**

    coding: utf-8

    import sys 
    import urllib2 
    import json 
    import os 
    import yuyinshibie

    reload(sys) 
    sys.setdefaultencoding(“utf-8”)

    def yuyinhecheng_api(tok,tex): 
    cuid = “XX-XX-XX-XX-XX-XX” 
    spd = “4” 
    url = “http://tsn.baidu.com/text2audio?tex=“+tex+”&lan=zh&cuid=”+cuid+”&ctp=1&tok=”+tok+”&per=3” 
    #print url 
    #response = requests.get(url) 
    #date = response.read() 
    return url

    def tts_main(filename,words,tok): 
    voice_date = yuyinhecheng_api(tok,words)

    f = open(filename,"wb")
    f.write(voice_date)
    f.close()
    

    语音合成之后 我们要播放出来 用到了mpg123 为什么我会用这个呢 因为它可以直接播放网页上的音频 非常的好用 
    安装mpg123: sudo apt-get install mpg123 
    安装好了之后 我后面等用到了再说怎么用 现在先不说

    现在录音 语音识别 语音合成 播放 所需要的工具 代码都准备好了 下面就开始整合在一起

    5.第五步:“整合”

    先贴上代码 我再具体说说

    # coding: utf-8
    
    import os
    import time
    import yuyinhecheng
    import Turling
    import yuyinshibie
    
    
    tok = yuyinshibie.get_access_token()
    
    switch = True
    while switch:
        os.system('sudo arecord -D "plughw:1" -f S16_LE -r 16000 -d 3 /home/pi/Desktop/voice.wav')
        time.sleep(0.5)
        info = yuyinshibie.asr_main("/home/pi/Desktop/voice.wav",tok)
        if '关闭'.encode("utf-8") in info:
            while True:
                os.system('sudo arecord -D "plughw:1" -f S16_LE -r 16000 -d 10 /home/pi/Desktop/voice.wav')
                time.sleep(10)
    
                info = yuyinshibie.asr_main("/home/pi/Desktop/voice.wav",tok)
                if '开启'.encode("utf-8") in info:
                    break
    
            url = "http://tsn.baidu.com/text2audio?tex=开启成功&lan=zh&cuid=B8-27-EB-BA-24-14&ctp=1&tok="+tok+"&per=3"
            os.system('mpg123 "%s"'%url)
    
    
        elif '暂停'.encode("utf-8") in info:
            url = "http://tsn.baidu.com/text2audio?tex=开始暂停&lan=zh&cuid=B8-27-EB-BA-24-14&ctp=1&tok="+tok+"&per=3"
            os.system('mpg123 "%s"'%url)
            time.sleep(10)
    
            url = "http://tsn.baidu.com/text2audio?tex=暂停结束&lan=zh&cuid=B8-27-EB-BA-24-14&ctp=1&tok="+tok+"&per=3"
            os.system('mpg123 "%s"'%url)
            continue
    
    
        else:
            tex = Turling.Tuling(info)
            url = yuyinhecheng.yuyinhecheng_api(tok,tex)
            os.system('mpg123 "%s"'%url)
            time.sleep(0.5)
    

    首先我用到了录音工具 先录一段话 然后用语音识别去识别我说了什么 然后用if来判断我说的话

    里面有没有关键字 如果有关键字的话 例如“关闭”那么就会进入一个无限循环 一直来识别我说

    的话,一直到识别到了我说 关键字“开启”之后就退出这个循环 回到主循环。为什么我加这个

    功能,因为我们总不可能一直把机器人开在那 一直识别我们说的话 然后一直回复我们 对吧。

    为了实现这个功能 我想了很久 虽然这个办法不好 因为它会一直循环识别 但这也是没有办法的办

    法了。如果各位有更好的办法可以联系我Qq:1281248141。继续往下 识别了我的话之后呢 图灵

    就会回复我一个信息 然后把这个信息文本提交给语音合成,语音合成就把这段文字给合成好了

    然后用上面说到的mpg123来播放这段音频 mpg123用法mpg123 “url”这样就能够实现对话了

  • 相关阅读:
    有几种不同类型的自动代理?
    使用 Spring 通过什么方式访问 Hibernate?
    单片,SOA 和微服务架构有什么区别?
    如何给 Spring 容器提供配置元数据?
    在 Spring AOP 中,关注点和横切关注的区别是什么?
    Java Concurrency API 中的 Lock 接口(Lock interface) 是什么?对比同步它有什么优势?
    移动文件用哪个命令?改名用哪个命令?
    synchronized 的作用?
    “a==b”和”a.equals(b)”有什么区别?
    什么是 Spring beans?
  • 原文地址:https://www.cnblogs.com/Pond-ZZC/p/6718205.html
Copyright © 2011-2022 走看看