itchat个人练习语音与文本图灵测试例程(代码片段)

KeepLearning KeepLearning     2022-11-23     545

关键词:

背景介绍

itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。

使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。

官方文档参考https://itchat.readthedocs.io/zh/latest/

最近要做一个自动应答机器人,获得用户消息GUI+语义分析+机器学习给出答案。

准备工作

需要安装ffmpeg(百度搜索官网,下载windows版解压后把bin目录添加到系统变量的path中)
pip安装 pydub,SpeechRecognition

pip install pydub
pip install SpeechRecognition

绑定消息

GUI这部分使用微信的itchat接口,安装和新手教程可以自己参考官方文档。

绑定语音消息回复的方式为:

@itchat.msg_register(RECORDING)
def tuling_reply(msg):

 其中用的是RECORDING是因为之前代码最开始有from itchat.content import *,否则就要使用itchat.content.RECORDING

关于@修饰符的作用,网上百度就有,说下自己的思考:

    @de
    def func1:
    ----- 等价于 ------
    func1 = de( func1 )

Python解释器读到函数修饰符“@”的时候,后面步骤会是这样了:

1. 去调用de函数,de函数的入口参数就是那个叫“func1”的函数;

2. de函数被执行,入口参数的(也就是func1函数)会被调用(执行);

换言之,修饰符带的那个函数的入口参数,就是下面的那个整个的函数。

参考https://blog.csdn.net/972301/article/details/59537712和 https://blog.csdn.net/fwenzhou/article/details/8733857

所以我们使用@的时候,itchat.msg_register这个函数就被执行了,我们定义的tuling_reply作为参数传了进去,所以才会读取到消息就用这个函数处理消息

 

语音识别

由于微信保存的语音消息都是mp3格式,看了一圈发现只有腾讯语音识别支持mp3,之前尝试过腾讯一句话识别语音API,但是官方没有最新的例程,并且居然不同部分用的是不同版本的文档说明,导致我鉴权一直失败。到后来仔细研读了下,自己写了代码,鉴权应该是通过了,但是返回的消息是x‘98‘这样的一个中文字符,并且解码会失败,这才发现可能是因为腾讯的只支持中文,虽然我在这个随笔的例子是中文语音识别,但我实际项目要做的是英文语音识别。不过在这中间也学到了一些东西,比如加密算法的使用,还有python3的二进制和字符串消息的转换关系。

技术分享图片
 1 import binascii
 2 import hashlib
 3 import hmac
 4 import urllib.parse
 5 import urllib.request
 6 import time
 7 import random
 8 import base64
 9 
10 def asr(msg):
11     msg[Text](msg[FileName])#保存mp3语音
12     timeData = str(int(time.time())) # 时间戳
13     nonceData = int(random.random()*10000) # Nonce,官网给的信息:随机正整数,与 Timestamp 联合起来, 用于防止重放攻击
14     with open(msg[FileName], rb) as f:
15         voiceData = f.read()#读取mp3语音,获得byte数据,格式是b‘x..‘
16     os.remove(msg[FileName])#删除mp3语音
17     DataLenData = len(voiceData)#读取未base64编码之前的文件长度
18     tmp = int(timeData)#time stamp
19     signDictData = #需要注意的是字典的key值要按照ascii码升序排序,并不一定是字典序,可以使用sorted(signDictData.keys())来查看ascii码排序结果
20         Action : actionData,
21         Data: base64.b64encode(voiceData).decode(utf8),#base64编码,编码后是二进制,再用decode解码
22         # ‘Data‘: voiceData,
23         DataLen: DataLenData,
24         EngSerViceType: EngSerViceTypeData,
25         Nonce : nonceData,
26         ProjectId:0,
27         Region: ap-shanghai,
28         SecretId : secretId,
29         # ‘SignatureMethod‘: ‘HmacSHA256‘,#加密算法可选,不指定这个参数默认是HmacSHA1加密
30         SourceType: SourceTypeData,
31         SubServiceType: SubServiceTypeData,
32         Timestamp : tmp,
33         UsrAudioKey: UsrAudioKeyData,
34         Version: versionData,
35         VoiceFormat: VoiceFormatData
36     
37     #   请求方法 + 请求主机 +请求路径 + ? + 请求字符串
38     requestStr = "%s%s%s%s%s"%(requestMethod,uriData,"/","?",dictToStr(signDictData))
39     # signData = urllib.parse.quote(sign(secretKey,requestStr,‘HmacSHA1‘))
40     #生成签名字符的时候一定是使用的没有经过urlencode编码的requestStr字符串,下面的加了encode的就是把字符串变成byte,sha1是算法,decode是把二进制解码为字符串。digest()是把hmac.new()的结果解析成字符串,然后经过base64编码为byte,再解码为字符串
41     signData = binascii.b2a_base64(hmac.new(secretKey.encode(utf-8), requestStr.encode(utf-8), hashlib.sha1).digest())[:-1].decode()
42     # 上述操作是实现签名,下面即进行请求
43     # 先建立请求参数, 此处参数只在签名时多了一个Signature
44     actionArgs = 
45         Action : actionData,
46         Data: base64.b64encode(voiceData).decode(utf8),
47         # ‘Data‘: voiceData,
48         DataLen: DataLenData,
49         EngSerViceType: EngSerViceTypeData,
50         Nonce : nonceData,
51         ProjectId:0,
52         Region: ap-shanghai,
53         SecretId : secretId,
54         SourceType: SourceTypeData,
55         SubServiceType: SubServiceTypeData,
56         Timestamp : tmp,
57         UsrAudioKey: UsrAudioKeyData,
58         Version: versionData,
59         VoiceFormat: VoiceFormatData,
60         "Signature": signData
61     
62     # 根据uri构建请求的url
63     requestUrl = "https://%s/?"%(uriData)
64     # 将请求的url和参数进行拼接,使用urlencode会修改掉参数中的/和=等符号的表示方式
65     requestUrlWithArgs = requestUrl + urllib.parse.urlencode(actionArgs)
66 
67     # actionArgs = signDictData #这是深复制,两个字典就是一个字典
68     # actionArgs["Signature"] = signData
69 
70     # # 根据uri构建请求的url
71     # requestUrl = "https://%s/?"%(uriData)
72     # # 将请求的url和参数进行拼接
73     # requestUrlWithArgs = requestUrl + dictToStr(actionArgs)
74 
75     # 获得response
76     responseData = urllib.request.urlopen(requestUrlWithArgs).read().decode("utf-8")# 根据uri构建
77     # return json.loads(responseData)["Response"]["Error"]["Message"] #处理错误消息
78     return json.loads(responseData)["Response"]["Result"]#处理正确消息
读取语音文件和腾讯API语音识别

 后来一直在找能不能用别的语音api,由于百度的参考文档最多,我在其中就发现大家为了能够把音频发到百度语音api上,就使用了pydub对原音频文件进行了转码,这样我们就可以发送wav格式的语音,由于本来是想识别英文呢语音的,所以我还是尝试外国公司的api,尝试了微软语音识别,7天免费的那个,官方文档对于REST接口的参考太少了,并且都不是python的,这时候我在github上发现了一个SpeechRecognition项目,原来以为是只有谷歌语音识别的接口,尝试了一下结果果然被墙了,用了代理之后还是无法访问,然后我就看了github主页的Transcribe an audio file,在里面找到了不止一个接口,其中就有Microsoft Bing Voice Recognition的例程,调用非常简单,只需要语音文件和密钥,并且支持语音文件的格式转码,自动给你转成对应必应api的语音参数格式,各位可以自己进入r.recognize_bing()函数定义,在里面详细描述了如何使用必应语音服务(需要注意的是微软一元试用云服务的活动不支持必应语音识别这个模块),在这里把原话复制下来供参考:

技术分享图片
"""
        Performs speech recognition on ``audio_data`` (an ``AudioData`` instance), using the Microsoft Bing Speech API.

        The Microsoft Bing Speech API key is specified by ``key``. Unfortunately, these are not available without `signing up for an account <https://azure.microsoft.com/en-ca/pricing/details/cognitive-services/speech-api/>`__ with Microsoft Azure.

        To get the API key, go to the `Microsoft Azure Portal Resources <https://portal.azure.com/>`__ page, go to "All Resources" > "Add" > "See All" > Search "Bing Speech API > "Create", and fill in the form to make a "Bing Speech API" resource. On the resulting page (which is also accessible from the "All Resources" page in the Azure Portal), go to the "Show Access Keys" page, which will have two API keys, either of which can be used for the `key` parameter. Microsoft Bing Speech API keys are 32-character lowercase hexadecimal strings.

        The recognition language is determined by ``language``, a BCP-47 language tag like ``"en-US"`` (US English) or ``"fr-FR"`` (International French), defaulting to US English. A list of supported language values can be found in the `API documentation <https://docs.microsoft.com/en-us/azure/cognitive-services/speech/api-reference-rest/bingvoicerecognition#recognition-language>`__ under "Interactive and dictation mode".

        Returns the most likely transcription if ``show_all`` is false (the default). Otherwise, returns the `raw API response <https://docs.microsoft.com/en-us/azure/cognitive-services/speech/api-reference-rest/bingvoicerecognition#sample-responses>`__ as a JSON dictionary.

        Raises a ``speech_recognition.UnknownValueError`` exception if the speech is unintelligible. Raises a ``speech_recognition.RequestError`` exception if the speech recognition operation failed, if the key isn‘t valid, or if there is no internet connection.
        """
Bing语音识别使用说明

所以我们只需要获得正确的密钥,调用这个函数就可以啦,要注意的是中文语音识别需要在传入参数中设置language="zh-CN"

代码

全代码如下:

# -*- coding: UTF-8 -*-
import requests
import itchat
import json
from itchat.content import *
import os
import speech_recognition as sr
from pydub import AudioSegment

def get_response_tuling(msg):
    # 这里我们就像在“3. 实现最简单的与图灵机器人的交互”中做的一样
    # 构造了要发送给服务器的数据
    apiUrl = http://www.tuling123.com/openapi/api
    data = 
        key    : 8edce3ce905a4c1dbb965e6b35c3834d,
        info   : msg,
        userid : wechat-robot,
    
    try:
        r = requests.post(apiUrl, data=data).json()
        # 字典的get方法在字典没有‘text‘值的时候会返回None而不会抛出异常
        return r.get(text)
    # 为了防止服务器没有正常响应导致程序异常退出,这里用try-except捕获了异常
    # 如果服务器没能正常交互(返回非json或无法连接),那么就会进入下面的return
    except:
        # 将会返回一个None
        return

def asr(msg):
    #语音消息识别转文字输出
    msg[Text](msg[FileName])
    song = AudioSegment.from_mp3(msg[FileName])
    song.export("tmp.wav", format="wav")
    r = sr.Recognizer()
    with sr.AudioFile(tmp.wav) as source:
        audio = r.record(source) # read the entire audio file
    os.remove(tmp.wav)
    os.remove(msg[FileName])
    # recognize speech using Microsoft Bing Voice Recognition
    BING_KEY = "======修改成你自己的密钥======="  # Microsoft Bing Voice Recognition API keys 32-character lowercase hexadecimal strings
    try:
        text = r.recognize_bing(audio, key=BING_KEY,language="zh-CN")
        print("Microsoft Bing Voice Recognition thinks you said " + text)
        return text
    except sr.UnknownValueError:
        print("Microsoft Bing Voice Recognition could not understand audio")
    except sr.RequestError as e:
        print("Could not request results from Microsoft Bing Voice Recognition service; 0".format(e))

@itchat.msg_register(TEXT)#因为之前把itchat.content全部import了,里面有TEXT变量
def tuling_reply_text(msg):
    # 注册文字消息获取后的处理
    # 为了保证在图灵Key出现问题的时候仍旧可以回复,这里设置一个默认回复
    defaultReply = I received a:  + msg[Text]
    return get_response_tuling(msg[Text]) or defaultReply

@itchat.msg_register(RECORDING)
def tuling_reply(msg):
    # 注册语音消息获取后的处理
    # 为了保证在图灵Key出现问题的时候仍旧可以回复,这里设置一个默认回复
    defaultReply = I received a:  + msg[Type]

    # 如果图灵Key出现问题,那么reply将会是None
    asrMessage = asr(msg)
    return get_response_tuling(asrMessage) or defaultReply

# 为了让实验过程更加方便(修改程序不用多次扫码),我们使用热启动hotReload=True
itchat.auto_login(hotReload=True)
itchat.run()

 











基于itchat定制聊天机器人

#coding=utf8importrequestsimportitchat#key自己到图灵注册一个KEY=‘****************************************‘defget_response(msg):  #这里我们就像在“3.实现最简单的与图灵机器人的交互”中做的一样 #构造了要发送给服务器的数据  ... 查看详情

python微信操控(itchat)(代码片段)

itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。开源地址https://github.com/littlecodersh/ItChat文档:https://itchat.readthedocs.io/zh/latest/安装:pip3installitchat登入与登出登入并向文件助手发送一句话,登入时会经过扫码... 查看详情

人工智能1.语音合成,语音识别,相似度,图灵机器人,智能对话(代码片段)

目录一.准备工作(基于百度ai) 二.语音合成 三.语音识别 四.相似度五.图灵机器人 六.识别+合成+图灵七.智能对话  一.准备工作(基于百度ai)  1.创建应用① ②  ③  ④    2.用pytho... 查看详情

什么是深度学习?从图灵测试谈到chatgpt(文末送书)

...否具有人类水平的智能。图灵测试的基本思路是:一个人与一台机器在隔开的房间里进行对话,另一个人需要根据对话内容来判断哪个是机器,哪个是人。如果这个人无法区分出哪个是机器,哪个是人,则可... 查看详情

代码片--练习匿名内部类

packagecom.dreamy.day04;/***@authordreamy*需求:*补足代码,通过匿名内部类。*/interfaceInter{voidmethod();}classTest{//补足代码,通过匿名内部类。/*staticclassInnerimplementsInter{publicvoidmethod{System.out.println("methodrun");}} 查看详情

使用python实现一个简单的智能聊天机器人(代码片段)

...,目前刚刚测试了一下可以实现,就是能够实现个人与机器的智能对话(语音交流)。总体的思路大家可以设想一下,如果要实现人与机器的智能对话,肯定要有以下几个步骤:计算机接收用户的语音输入将用户输入的语音输入... 查看详情

第四次团队作业-软件实现与测试

一、代码地址https://github.com/jmu201521121021/speech_demo605二、实现结果 调用微软的语音识别SDK实现了语音转文本的功能  查看详情

用python配合微信api接口将微信个人号变为聊天机器人(代码片段)

操作系统:Ubuntu16.04  首先我们先安装itchat:这里我之前安装过了,先在又安装了一边使用 python3-c"importitchat"检查是否安装成功了如果没有任何输出,则表明安装成功了然后我们需要去图灵注册一个账号,来获取key,这里... 查看详情

第九届“图灵杯”neuq-acm程序设计竞赛个人题解(代码片段)

https://ac.nowcoder.com/acm/contest/27302#question目录大学期末现状【签到】G1024【签到】NEUQ【模拟】小G的任务【签到】nn与游戏【bfs】第二大数【第二大】Num【思维】特征值【找规律模拟】最大公约数【思维】玄神的字符串【贪心】WireCon... 查看详情

浅谈语音测试方案(一)

...与机器之间的交流也渐渐脱离了传统的沟通模式,进入了语音交流时代。语音交流更是拉近了人和机器之间情感,现在的语音技术就是为了使机器更好的识别人声、并合成接近人类的声音以达到更好的交流。目前国内研究语音相... 查看详情

alpha版本测试报告(代码片段)

...添加新的联系人设置模块功能描述效果描述测试结果查看个人资料查看用户或联系人的个人资料查看用户或联系人的个人资料,若是用户个人资料则可修改修改个人资料修改用户的个人资料修改用户的个人资料添加应用添加消息... 查看详情

图灵测试

...题从行为主义的角度给出了定义,由此提出一假想:即一个人在不接触对方的情况下,通过一种特殊的方式,和对方进行一系列的问答。如果在相当长时间 查看详情

安信可esp32-a1s开发板适配百度dueros例程实现在线语音功能(代码片段)

文章目录前言一、准备工作1.硬件准备2.软件准备二、验证ESP-ADF是否正常1.代码简单修改2.播放MP3测试三、dueros例程适配1.替换连接文件2.内存卡准备3.代码修改(1)屏蔽触摸按键(2)修改唤醒提示音4.修改lyrat_v4_3... 查看详情

基于讯飞语音的识别和图灵机器人的具体智能反馈,百度语音的播放,原因是讯飞语音的free版似乎播放做了限制(代码片段)

https://github.com/1158114251/-Intelligent-speech-robothttps://www.kancloud.cn/turing/web_api/522992 图灵网站:https://www.kancloud.cn/turing/web_api/522992 apikey:820c4a6ca4694063ab6002be1d1c63d 查看详情

itchat和matplotlib的结合使用

...爬了爬自己的微信朋友》,这篇文章写的是使用python中的itchat爬取微信中朋友的信息,其中信息包括,昵称、性别、地理位置等,然后对这些信息进行统计并且以图像形式显示。文章对itchat的使用写的很详细,但是代码是贴图,... 查看详情

文本处理与脚本的简单编写练习(代码片段)

1、统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户个数,并将用户都显示出来[root@centos7scripts]#grep-v‘/sbin/nologin$‘/etc/passwd|cut-d:-f1rootsyncshutdownhaltkyletest[root@centos7~]#awk-F:‘if($NF!="/sbin/nologin")p 查看详情

pythonitchat+机器人webapi实现个人微信机器人(代码片段)

模块itchat功能实现微信回复机器人(调用图灵机器人api)代码#!/usr/bin/envpython3#-*-coding:utf-8-*-#Author:EricimportrequestsimportitchatdefgetResponse(_info):#print(_info)apiUrl=‘http://www.tuling123.com/openapi/api‘data=‘ke 查看详情

人工智能---语音合成识别图灵机械人语音交互(代码片段)

...ECRET_KEY)12client_NLp=AipNlp(APP_ID,API_KEY,SECRET_KEY)131415#文字合成语音16deftext_audio(text):17result=client.synthesis(text,‘zh‘,1,18‘vol‘:5,19‘per‘:4,20‘pit‘:8,21‘spd‘:5,22)2324#识别正确返回语音二进制错误则返回dict参照下面错误码25ifnotisinstance(... 查看详情