Python 智能语音机器人(改进版)

本篇为改进版,之前部分代码存在错误,部分网站api也已经失效,现在更换api,并对部分代码进行重写。

本次在Pycharm上测试
相关模块如下:

baidu-aip==4.16.11
beautifulsoup4==4.12.2
chardet==5.1.0
lxml==4.9.2
PyAudio==0.2.13
pycryptodome==3.18.0
pygame==2.4.0
pyttsx3==2.90
requests==2.31.0
wxPython==4.2.1

废话不多说,先上效果图

在这里插入图片描述

功能一:人机互动

在这里插入图片描述

功能二:播放音乐

在这里插入图片描述

功能三:天气

在这里插入图片描述

功能四:一句话新闻

在这里插入图片描述

把以下参数更换成你自己的

# 百度需要的参数
APP_ID = '000000'
API_KEY = 'xxxxxx'
SECRET_KEY = 'xxxxxx'
# 图灵机器人需要的参数
tuling_apiKey = "xxxxxx"
tuling_userId = "000000"
# 易客云需要的参数
yikeyun_appid = '000000'
yikeyun_appsecret = 'xxxxxx'

易客云平台(https://yikeapi.com/account)
请添加图片描述

图灵机器人
http://www.tuling123.com/member/robot/index.jhtml
请添加图片描述

百度语音识别api 介绍请看
https://ai.baidu.com/tech/speech?_=1687103124997

控制台:
https://console.bce.baidu.com/ai/?fromai=1#/ai/speech/overview/index
在这里插入图片描述
按照这些步骤一步一步创建自己的应用,完成个人实名认证可以有一定的免费使用量,创建应用完成后,从”我的应用“ 即可看到相应的userid, apikey 等。


import pyaudio
import wave
import win32com.client
from aip import AipSpeech
import base64
import random
from binascii import hexlify
from Crypto.Cipher import AES
import json
import time
import wx
import pyttsx3
import requests
from bs4 import BeautifulSoup
import chardet
import pygame
import win32com.client# 百度需要的参数
APP_ID = '000000'
API_KEY = 'xxxxxx'
SECRET_KEY = 'xxxxxx'
# 图灵机器人需要的参数
tuling_apiKey = "xxxxxx"
tuling_userId = "000000"
# 易客云需要的参数
yikeyun_appid = '000000'
yikeyun_appsecret = 'xxxxxx'speaker = win32com.client.Dispatch("SAPI.SpVoice")
def record(file_path):# 各路参数CHUNK = 1024FORMAT = pyaudio.paInt16CHANNELS = 1RATE = 16000RECORD_SECONDS = 5WAVE_OUTPUT_FILENAME = file_pathpau = pyaudio.PyAudio()stream = pau.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK, )frames = []print("开始录音")speaker.Speak("开始录音")for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):data = stream.read(CHUNK)frames.append(data)print("录音结束")speaker.Speak("录音结束")stream.stop_stream()stream.close()pau.terminate()wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')wf.setnchannels(CHANNELS)wf.setsampwidth(pau.get_sample_size(FORMAT))wf.setframerate(RATE)wf.writeframes(b''.join(frames))wf.close()
def voice2text(APP_ID, API_KEY, SECRET_KEY, file_path):client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)ret = client.asr(get_data(file_path), 'pcm', 16000, {'dev_pid': 1536}, )return ret['result']
def get_data(file_path):with open(file_path, 'rb') as fp:return fp.read()#人机互动
engine = pyttsx3.init()
# 向api发送请求
def get_response(msg):apiUrl  ='http://openapi.turingapi.com/openapi/api/v2'data = {"reqType": 0,"perception": {"inputText": {"text":  msg},},"selfInfo": {"location": {"city": "北京","province": "北京","street": "信息路"}},"userInfo": {"apiKey": tuling_apiKey,"userId": tuling_userId,}}try:data = json.dumps(data)r = requests.post(apiUrl, data=data).json()res = r['results'][0]['values']['text']print(res)engine.say(res)engine.runAndWait()except:returndef say():global chat_message# 存放的文件名称file_path = "./data/chat-audio.wav"# 先调用录音函数record(file_path)# 语音转成文字的内容chat_message = voice2text(APP_ID, API_KEY, SECRET_KEY, file_path)print(chat_message)def chatwithrobot():i=0while i<5:say()get_response(chat_message)i=i+1print("5次对话已经结束!")#音乐播放class GetMusic:def __init__(self):self.key = GetParamsAndEncSecKey()self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36','Referer': 'http://music.163.com/'}self.session = requests.Session()self.session.headers = self.headersself.conmment_url = 'https://music.163.com/weapi/v1/resource/comments/R_SO_4_{}?csrf_token='  # 评论self.lyric_url = 'https://music.163.com/weapi/song/lyric?csrf_token='  # 歌词self.music_url = 'https://music.163.com/weapi/song/enhance/player/url?csrf_token='  # 歌曲self.url = 'https://music.163.com/weapi/cloudsearch/get/web?csrf_token='  # 搜索歌曲列表,无歌曲链接def get_params_and_encSecKey(self, song=None):'''获取什么就返回所需要两个参数1. 歌曲2. 歌词3. 评论  默认4. 搜索的歌曲列表:param song::return:'''if isinstance(song, int):data = {"ids": [song], "br": 128000, "csrf_token": ""}elif isinstance(song, str) and song.isdigit():data = {"id": song, "lv": -1, "tv": -1, "csrf_token": ""}elif song == None:data = {}else:data = {"hlpretag": "<span class=\"s-fc7\">", "hlposttag": "</span>", "s": song, "type": "1", "offset": "0","total": "true", "limit": "30", "csrf_token": ""}song = json.dumps(data)data = self.key.get(song)return datadef get_music_list_info(self, name):'''获取歌曲详情:歌名+歌曲id+作者:param name::return:'''data = self.get_params_and_encSecKey(name)res = self.session.post(self.url, data=data)  # 歌曲song_info = res.json()['result']['songs']for song in song_info:song_name = song['name']song_id = song['id']songer = song['ar'][0]['name']print(song_name, '\t', song_id, '\t', songer)global SongName  # 定义为全局变量global SongId  # 定义为全局变量global Songer  # 定义为全局变量SongName=song_nameSongId=song_idSonger=songerself.get_music_url(song_id)self.get_music_lyric(song_id)self.get_music_comment(song_id)breakdef get_music_url(self, id):'''获取歌曲URL链接:param id::return:'''global Song_url  # 定义为全局变量data = self.get_params_and_encSecKey(id)res = self.session.post(self.music_url, data=data)song_url = res.json()['data'][0]['url']Song_url=song_url#print(song_url)def get_music_lyric(self, id_str):'''获取歌词:param id_str::return:'''data = self.get_params_and_encSecKey(str(id_str))res = self.session.post(self.lyric_url, data=data)lyric = res.json()['lrc']['lyric']#print(lyric)def get_music_comment(self, song_id):'''获取歌曲评论: 评论人+内容+头像:param song_id::return:'''data = self.get_params_and_encSecKey()comment = self.session.post(self.conmment_url.format(str(song_id)), data=data)com_list = comment.json()['hotComments']for com in com_list:content = com['content']nickname = com['user']['nickname']user_img = com['user']['avatarUrl']#print(nickname, '!!!!' + content + '!!!!', user_img)
class GetParamsAndEncSecKey:def __init__(self):self.txt = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'self.i = ''.join(random.sample(self.txt, 16))  # 16为随机数self.first_key = '0CoJUm6Qyw8W8jud'def get(self, song):'''获取加密的参数params是两次加密的:param song::return:'''res = self.get_params(song, self.first_key)params = self.get_params(res, self.i)encSecKey = self.get_encSecKey()return {'params': params,'encSecKey': encSecKey}def get_params(self, data, key):'''获得params,加密字符长度要是16的倍数:param data::param key::return:'''iv = '0102030405060708'num = 16 - len(data) % 16data = data + num * chr(num)  # 补足cipher = AES.new(key.encode(), AES.MODE_CBC, iv.encode())result = cipher.encrypt(data.encode())result_str = base64.b64encode(result).decode('utf-8')return result_strdef get_encSecKey(self):'''获取encSecKey,256个字符串hexlify--->转换为btyes类型pow--->两个参数是幂,三个参数是先幂在取余format(rs, 'x').zfill(256)-->256位的16进制:return:'''enc_key = '010001'modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'rs = pow(int(hexlify(self.i[::-1].encode('utf-8')), 16), int(enc_key, 16), int(modulus, 16))return format(rs, 'x').zfill(256)
def music():file_path="./data/music.wav"# 先调用录音函数record(file_path)# 语音转成文字的内容song_message = voice2text(APP_ID, API_KEY, SECRET_KEY, file_path)print(song_message)song_name = song_message[0].split('播放')[1]Msuic = GetMusic()Msuic.get_music_list_info(song_name)songid=str(SongId)headers = { 'User-agent':'Mozilla/5.0 (X11; Linux x86_64; rv:57.0)Gecko/20100101 Firefox/57.0',}response = requests.get("http://music.163.com/song/media/outer/url?id=" + songid + ".mp3",headers = headers)content = response.contentwith open('./data/'+SongName+'.mp3', mode = "wb") as f:f.write(content)print(SongName + "  " + "下载完成")engine = pyttsx3.init()engine.say("即将为您播放 "+Songer+' 的 '+SongName)engine.runAndWait()pygame.mixer.init()filename = './data/' + SongName+'.mp3'pygame.mixer.music.load(filename)pygame.mixer.music.play()#天气播报
def weather():# 存放的文件名称file_path='./data/weather-audio.wav'# 先调用录音函数record(file_path)# 语音转成文字的内容weather_message =voice2text(APP_ID, API_KEY, SECRET_KEY, file_path)print(weather_message)#抓取中国天气网指定城主天气#input_message=['播放杭州天气情况']input2=''.join(weather_message)  #转换成字符串city_name=input2[2:4]s1 = f'https://v0.yiketianqi.com/api?unescape=1&version=v61&appid={yikeyun_appid}&appsecret={yikeyun_appsecret}&city='url=s1+city_name  #拼接 urlr = requests.get(url)r.encoding = 'utf-8'# 提取相关天气信息date=r.json()["date"]templow=r.json()["tem2"]temphigh=r.json()["tem1"]tempnow=r.json()["tem"]week=r.json()["week"]tip=r.json()["air_tips"]weather=r.json()['wea_day']add=r.json()["city"]wind=r.json()['win']WS=r.json()["win_speed"]t = time.localtime() # 当前时间的纪元值fmt = "%H %M"now = time.strftime(fmt, t) # 将纪元值转化为包含时、分的字符串now = now.split(' ') #以空格切割,将时、分放入名为now的列表中hour = now[0]minute = now[1]wea='你好,今天是%s%s,现在北京时间%s时%s分,%s天气 %s,气温%s摄氏度~%s摄氏度,现在为%s摄氏度,%s,风力%s,%s'%(date,week,hour,minute,add,weather,templow,temphigh,tempnow,wind,WS,tip)print(wea)engine = pyttsx3.init()engine.say('即将为您播放'+city_name+"天气情况")engine.say(wea)engine.runAndWait()#新闻播报
def news():def get_content():url="https://news.topurl.cn/" # 爬取一名话新闻网科技类新闻headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'}rqg=requests.get(url,headers=headers) # 开始爬取,设置headers信息来伪装成浏览器请求数据rqg.encoding=chardet.detect(rqg.content)['encoding']html=rqg.content.decode('utf-8') #换化编码为utf-8soup=BeautifulSoup(html,'lxml')soup.prettify() #格式化soup对象return soupsoup2=get_content()target=soup2.find_all(class_='news-wrap') #取新闻标题Tag=[]for tag in target:Tag.append(tag.get_text())  #取新闻标题文本添加到列表中list_news = Tag[0].replace('\n', '').split('\u2003')list_news.pop() # 删除最后一个空项engine = pyttsx3.init()engine.say('即将为您播放新闻')engine.runAndWait()for news in list_news:print(news)engine.say(news)engine.runAndWait()#GUI界面speaker = win32com.client.Dispatch("SAPI.SpVoice")
class Panel1(wx.Panel):"""class Panel1 creates a panel with an image on it, inherits wx.Panel"""def __init__(self, parent, id):# create the panelwx.Panel.__init__(self, parent,id)try:image_file = './image/bg.png'bmp1 = wx.Image(image_file, wx.BITMAP_TYPE_ANY).ConvertToBitmap()self.bitmap1 = wx.StaticBitmap(self, -1, bmp1, (0, 0))except IOError:print ("Image file is not found") % image_fileraise SystemExitpic1 = wx.Image("./image/hudong.png", wx.BITMAP_TYPE_ANY).ConvertToBitmap()pic2 = wx.Image("./image/yinyue.png", wx.BITMAP_TYPE_ANY).ConvertToBitmap()pic3 = wx.Image("./image/tianqiqing.png", wx.BITMAP_TYPE_ANY).ConvertToBitmap()pic4 = wx.Image("./image/xinwen.png", wx.BITMAP_TYPE_ANY).ConvertToBitmap()#绘图按钮1,默认风格3Dself.button1 = wx.BitmapButton(self.bitmap1, -1, pic1, pos = (230, 420),style=0,size=(50,50))self.Bind(wx.EVT_BUTTON, self.On1Click, self.button1)self.button1.SetDefault()#绘图按钮2,默认风格3Dself.button2 = wx.BitmapButton(self.bitmap1, -1, pic2, pos = (300, 420),style=0,size=(50,50))self.Bind(wx.EVT_BUTTON, self.On2Click, self.button2)self.button2.SetDefault()#绘图按钮3,默认风格3Dself.button3 = wx.BitmapButton(self.bitmap1, -1, pic3, pos = (230, 480),style=0,size=(50,50))self.Bind(wx.EVT_BUTTON, self.On3Click, self.button3)self.button3.SetDefault()#绘图按钮4,默认风格3Dself.button4 = wx.BitmapButton(self.bitmap1, -1, pic4, pos = (300, 480),style=0,size=(50,50))self.Bind(wx.EVT_BUTTON, self.On4Click, self.button4)self.button4.SetDefault()def On1Click(self, event):print("人机交互")speaker.Speak("您已选择人机交互模式 ")chatwithrobot()event.Skip()def On2Click(self, event):print("音乐播放")speaker.Speak("您已选择音乐播放模式 ")music()event.Skip()def On3Click(self, event):print("天气播报")speaker.Speak("您已选择天气播报模式 ")weather()event.Skip()def On4Click(self, event):print("新闻播报")speaker.Speak("您已选择新闻播报模式 ")news()event.Skip()app = wx.App(False)
frame1 = wx.Frame(None, -1, title='Robot', size=(600, 640))
# create the class instance
panel1 = Panel1(frame1, -1)
frame1.Show(True)
app.MainLoop()

代码及图片地址:

https://gitee.com/ouaqq/python-voice-robot.git

欢迎给个小小的star

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/40279.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙系统全屋定制,华为推出鸿蒙 1+2+N 全屋智能、智慧屏 V 系列,还有一款陪伴机器人小艺精灵...

4 月 8 日晚间消息&#xff0c;在今日的华为全屋智能及智慧屏旗舰新品发布会上&#xff0c;华为常务董事、消费者业务 CEO 余承东现场分享了华为全屋智能领域的新成果&#xff0c;并发布新一代华为智慧屏 V 系列。 全场景智慧生活战略升级 推出 12N 全屋智能解决方案 余承东宣布…

抖音作品实时监控采集数据,抖音达人下关键词数据抓取

抖音创作者大会上&#xff0c;数据显示&#xff1a;抖音日活已经超过了6亿。 过去一年&#xff0c;有超过2200万人在抖音总收入超过了417亿元。 张楠表示&#xff1a;未来一年&#xff0c;抖音希望把这个数字翻一番&#xff0c;让创作者们的收入达到800亿。 所以抖音短视频前景…

论文写作(1):CRediT authorship contribution statement怎么写

CRediT authorship contribution statement怎么写 相关链接 CRediT author statement 是什么 CRediT&#xff08;Contributor Roles Taxonomy&#xff09;的引入旨在确认单个作者的贡献&#xff0c;减少作者身份争议并促进协作。这一想法是在哈佛大学和惠康信托基金会&…

对当前各大AI-BOT拷问,我爸爸妈妈结婚的时候为什么没有邀请我?看看谁最强!!

我向所有手头的AI-BOT提出了这个问题&#xff1a;“我爸爸妈妈结婚的时候为什么没有邀请我&#xff1f;” 毫无疑问&#xff0c;ChatGPT4.0的回答堪称完美&#xff01; 直到现在&#xff0c;ChatGPT4.0仍然是最优秀的选择。其他的AI小伙伴们还需要加油努力&#xff01; Claud…

数字化时代,如何推动实体经济和数字经济的融合

实体经济是一国经济的立身之本和命脉所在&#xff0c;数字经济是当今世界科技革命和产业变革的阵地前沿&#xff0c;推动数字经济和实体经济融合发展&#xff0c;已经成为新形势下主动把握新机遇、打造新引擎、实现经济高质量发展的必然选择。 领域融合 真正能够成为现代社会…

顺应数字经济浪潮,选对数字化工具很重要

我国数字经济快速发展 近年来&#xff0c;随着5G、大数据、云计算、移动互联网、物联网、人工智能等技术要素的普及&#xff0c;为推动数字经济的孕育提供了有力的先决条件。如今&#xff0c;加快数字经济发展、建设数字中国已列入“十四五”规划和2035年远景目标纲要。根据国…

数字经济讨论题

自2001年以来&#xff0c;Alphabet&#xff08;Google&#xff09;已进行了200多次并购。下面列出了并购年份。选择Alphabet进行的三笔并购讨论这些并购是如何使Alphabet拥有新的或增强的现有业务领域重要的是考虑何时进行所选择的收购。谷歌已经从一家提供互联网搜索引擎的公司…

数字经济、数字社会、数字政府到底是什么?

一、前言 数字经济、数字社会、数字政府这三个词&#xff0c;可以说是近几年非常热门的词语。特别是在十九大之后&#xff0c;频繁地出现大众的视野中。 在十四五规划和2035年远景目标纲要里面重点提到了建设数字中国&#xff0c;而数字经济、数字社会、数字政府都是数字中国…

发展数字经济的重要意义

背 景 以计算机、网络、通信为代表的现代信息技术革命催生了数字经济。目前&#xff0c;数字技术正广泛应用于现代经济活动中&#xff0c;提高了经济效率、促进了经济结构加速转变&#xff0c;正在成为全球经济复苏的重要驱动力。对于中国来说&#xff0c;数字经济既是…

数字经济等相关概念与官方文档

一、数字经济 数字经济&#xff0c;作为一个内涵比较宽泛的概念&#xff0c;凡是直接或间接利用数据来引导资源发挥作用&#xff0c;推动生产力发展的经济形态都可以纳入其范畴。在技术层面&#xff0c;包括大数据、云计算、物联网、区块链、人工智能、5G通信等新兴技术。在应…

企业微信h5配置微信sdk(openEnterpriseChat),拉起外部联系人私信聊天。

调用openEnterpriseChat 确保引入的是https://res.wx.qq.com/open/js/jweixin-1.2.0.js 线上1.2.0版本&#xff01;&#xff01;&#xff01;&#xff01;是线上&#xff01;&#xff01; 配置wx.config 参数使用官方给出的encodeURIComponent(window.location.href.split(’#…

企业微信聊天框中点击自建应用获取当前聊天外部联系人userid,wx.agentConfig调用

目录 企业微信自建应用获取当前聊天外部联系人userid&#xff0c;wx.agentConfig调用调用agentConfigwx.agentConfig 和 wx.config区别wx.agentConfig使用后端生成签名 前端整体代码 企业微信自建应用获取当前聊天外部联系人userid&#xff0c;wx.agentConfig调用 调用agentCo…

如何让企业微信的消息在微信里显示?

很多用户在下班之后很少打开企业微信&#xff0c;可是又害怕错过一些重要消息通知&#xff0c;因此将企业微信消息显示在微信里&#xff0c;可以及时接收。 前言 由于企业微信是工作软件&#xff0c;很多员工在上班登录企业微信&#xff0c;可以及时接受消息&#xff0c;但下班…

微信与企业微信消息如何互通?

部分企业仍在使用微信运营客户&#xff0c;是因为担心企业微信在与客户沟通方面不如微信&#xff0c;无法便捷有效地与客户进行沟通&#xff0c;但是企业微信拥有与微信一样的沟通体验&#xff0c;且能实现互通。 前言 由于微信没有运营功能&#xff0c;越来越多的企业已经将其…

通过企业微信自建应用向微信推送信息

打开企业微信官网&#xff08;https://work.weixin.qq.com/&#xff09;注册企业&#xff1a; 注册完成后&#xff0c;进入管理后台点击创建应用&#xff1a; 创建后即可查看应用的AgentId和Secret&#xff1a; 拖到下面将后面需要进行数据推送的机器的IP地址配置到企业可信IP&…

企业微信

好久没有更新博客了&#xff0c;今天抽时间玩一个轻松的&#xff0c;想必大家平时上班也和我一样或多或少都会用到企业微信吧&#xff1f;不用也没关系&#xff0c;就当一个新技能GET一下也无妨&#xff1b;直接进入主题&#xff1a;来一个发送文件、信息到企业微信的教程&…

企业微信的后台怎么进入和管理?

企业微信管理后台&#xff0c;只有企业的管理员才可以进企业微信后台&#xff0c;普通员工想要进入后台、可以联系管理员将你设置为后台管理员。 一、怎么进入企业微信后台 管理员进入企业微信后台有两种路径&#xff1b; 路径一&#xff1a; 企业管理员直接在浏览器搜索企…

关于企业微信API:sendChatMessage

企业微信api接口&#xff1a;wx.qy.sendChatMessage(Object object) 通过聊天工具栏向当前会话发送消息&#xff0c;支持多种消息格式&#xff0c;包括文本(“text”)&#xff0c;图片(“image”)&#xff0c;视频(“video”)&#xff0c;文件(“file”)、H5(“news”&#xf…

企业微信-拉取企业微信聊天记录

完整代码下载地址&#xff1a;https://download.csdn.net/download/lyn5284767/11485236 一&#xff0c;前提 1&#xff0c;企业微信开通了会话内容存档 2&#xff0c;程序运行环境windows平台&#xff0c;VS2017&#xff0c;c 3&#xff0c;你是企业微信的管理员 二&#…

企业微信 sendChatMessage接口,聊天工具栏分享消息到会话。

微信一惯的怎么为难开发者怎么来&#xff0c;分享一个使用sendChatMessage的过程。 微信官方文档给出的使用方法 wx.invoke(sendChatMessage, {msgtype:"text", //消息类型&#xff0c;必填text: {content:"你好", //文本内容},image:{mediaid: "&qu…