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

这篇具有很好参考价值的文章主要介绍了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

废话不多说,先上效果图

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

功能一:人机互动

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

功能二:播放音乐

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

功能三:天气

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

功能四:一句话新闻

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

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

# 百度需要的参数
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)
Python 智能语音机器人(改进版)

图灵机器人
http://www.tuling123.com/member/robot/index.jhtml
Python 智能语音机器人(改进版)

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

控制台:
https://console.bce.baidu.com/ai/?fromai=1#/ai/speech/overview/index
Python 智能语音机器人(改进版)
按照这些步骤一步一步创建自己的应用,完成个人实名认证可以有一定的免费使用量,创建应用完成后,从”我的应用“ 即可看到相应的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 = 1024
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 16000
    RECORD_SECONDS = 5
    WAVE_OUTPUT_FILENAME = file_path
    pau = 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:
        return

def 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=0
    while i<5:
        say()
        get_response(chat_message)
        i=i+1
    print("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.headers
        self.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 data
    def 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_name
            SongId=song_id
            Songer=songer
            self.get_music_url(song_id)
            self.get_music_lyric(song_id)
            self.get_music_comment(song_id)
            break
    def 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) % 16
        data = 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_str
    def 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.content
    with 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  #拼接 url
    r = 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-8
        soup=BeautifulSoup(html,'lxml')
        soup.prettify() #格式化soup对象
        return soup
    soup2=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 panel
        wx.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_file
            raise SystemExit
        pic1 = 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,默认风格3D
        self.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,默认风格3D
        self.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,默认风格3D
        self.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,默认风格3D
        self.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文章来源地址https://www.toymoban.com/news/detail-496116.html

到了这里,关于Python 智能语音机器人(改进版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自己制作智能语音机器人(基于jetson nano)

    如上图,主要采用jetson上编写python代码实现,支持离线语音唤醒、在线语音识别、大模型智能文档、在线语音合成。 所需硬件如下: jetson nano:linux 科大讯飞麦克风硬件:AIUI R818麦克阵列开发套件+6麦阵列,支持离线语音唤醒 USB免驱声卡+喇叭 所需软件如下: 科大讯飞在线语

    2024年02月15日
    浏览(116)
  • AI智能语音机器人的基本业务流程

    先画个图,了解下AI语音机器人的基本业务流程。 上图是一个AI语音机器人的业务流程,简单来说就是首先要配置话术,就是告诉机器人在遇到问题该怎么回答,这个不同公司不同行业的差别比较大,所以一般每个客户都会配置其个性化的话术。 话术配置完成后,需要给账号

    2024年02月12日
    浏览(58)
  • ai智能语音电销机器人怎么选?

    智能语音电销机器人哪家好?如何选择一款智能语音电销机器人?这几年生活中人工智能的普及越来越广泛,就如智能语音机器人在生活当中的应用还是比较方便的,有许多行业都会选择这类的智能语音系统来把工作效率提高上去,随着各种各样品牌的智能语音机器人的出现

    2024年02月07日
    浏览(46)
  • 《语音优先》智能语音技术驱动的交互界面设计与语音机器人设计(译者序)...

    “言为心声,语为心境”,语言与对话是我们沟通与协作的重要方式。而智能语音技术是一种基于人工智能和自然语言处理技术的语音交互技术。它可以通过语音识别技术将用户的语音指令转换为文本,然后通过自然语言处理技术对文本进行分析和理解,最终生成相应的响应或

    2024年03月15日
    浏览(65)
  • AI智能机器人的语音识别是如何实现的 ?

    什么是智能语音识别系统?语音识别实际就是将人类说话的内容和意思转化为计算机可读的输入,例如按键、二进制编码或者字符序列等。与说话人的识别不同,后者主要是识别和确认发出语音的人并非其中所包含的内容。语音识别的目的就是让机器人听懂人类所说的语言,

    2024年02月10日
    浏览(49)
  • AI智能语音客服机器人系统/方案/案列/技术/项目

    在工作中总是无法避免做一些重复的事,不同的人对待重复的工作做法也是不一样,总有一部分人想办法来提高效优化流程。当然,也有一部分人会选择按部就班。如果拘泥于原本的工作方式,没有创新的重复,只是在做无用功而已。不过,现在有了一种可以解决重复性工作

    2024年02月08日
    浏览(52)
  • AI智能电话语音通话销售机器人源码,附带系统搭建教程

    智能电话语音销售机器人——高效筛选与跟进客户的利器 在快节奏的商业战场上,迅速准确地把握每一个潜在客户是企业制胜的关键。我们的智能电话语音销售机器人正是这样一款能够助力企业轻松应对海量客户数据,实现高效筛选与跟进的利器。 通过简单的资料接入,您

    2024年02月21日
    浏览(54)
  • AI智能语音机器人的功能和作用都有哪些?

    智能语音机器人是一种能够使用自然语言处理技术和人工智能算法,通过声音与用户进行交互的机器人。它可以回答用户提出的问题、处理用户的投诉、提供产品或服务的相关信息等等。 实现一个智能语音机器人需要涉及多个技术领域,包括自然语言处理、语音识别、语音合

    2024年02月12日
    浏览(56)
  • ESP32-S3语音唤醒技术,智能机器人应用,物联网技术发展

    随着技术的发展,智能服务正在融入群众的生活。智能机器人的应用,大大提高人们的工作效率,并减少投入的成本。 传感器检测是否有来宾,指纹识别模块可以用来签到,语音识别处理模块可以进行简单的日常提问进行识别并用相应的回答,触摸屏界面实现人机互动,可以

    2024年02月13日
    浏览(46)
  • ai智能语音机器人系统的话术怎样设置效果比较好

    设置一个AI智能语音机器人的话术,以实现最佳效果,涉及以下几个关键方面: 1. 自然语言处理(NLP):AI机器人的话术需要能够理解和处理用户的自然语言输入。使用NLP技术来识别语义、意图和实体,并针对不同的用户意图作出相应的回答。确保机器人对于用户输入的问题

    2024年01月16日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包