python-jupyter实现OpenAi语音对话聊天

1.安装jupyter

这里使用的是jupyter工具,安装时需要再cmd执行如下命令,由于直接执行pip install  jupyter会很慢,咱们直接使用国内源

pip install --user jupyter -i http://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn

安装完毕我们可以直接执行此命令:jupyter notebook

jupyter notebook

jupyter notebook这个命令如果找不到需要配置环境变量,去对应的路径下找,例如C:\Users\xx\AppData\Roaming\Python\Python38\Scripts,然后复制到path下

我的默认是在这个路径C:\Users\xx\AppData\Roaming\Python\Python38\Scripts,找到后也可以双击红色框打开jupyter notebook

双击红色框就会弹出浏览器界面,也可以输入http://localhost:8888/

这时可以新建文件了

 弹出新的页面,我们就可以写代码并测试了,点击三角符号就出现运行结果了

 2.gradio的使用

2.1 gradio的安装

我们可以设置我们pip时下载的源

官方默认源:https://pypi.org/simple

# 查询使用的源
%pip config get global.index-url

看下是否设置成功

# 默认阿里云源
%pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

下载gradio过慢,直接指定源下载,你自己想用什么源就改成什么源

# 清华源
%pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gradio

2.2 gradio使用示例

2.2.1 Interface使用

Interface模块用于创建简易场景下的应用界面。它是使用Gradio构建交互式应用程序的核心模块之一。通过gr.Interface,您可以快速定义输入和输出函数,并将它们与界面组件进行关联,以创建一个具有交互性的应用程序。这个模块提供了简洁的API和直观的界面,使得构建应用程序变得简单易懂。

我们来简单创建下

# 登录测试
# 登录后输入一个文本就会根据文本反转文字
import gradio as grdef reverse(text):return text[::-1]demo=gr.Interface(reverse,'text','text')
demo.launch(share=True,auth=("username", "password"))

 运行结果:就出现了简单的登录页面了

输入username,password直接进入下个页面

在输入框里输入文字并提交,输出就会有反转的文字出现,这是因为调用了我们的reverse方法

 图像分类器示例

我们上传图像,然后输入是图片,输出是lable最后结果呢就是标签分类的模式

# 测试简单图像分类器
# 输入图片,输出分类情况
import gradio as gr
def image_classifier(inp):return {'woman': 0.9, 'man': 0.1}
demo=gr.Interface(fn=image_classifier,inputs="image",outputs='label')
demo.launch()

 运行结果:上传图片点击提交即可看到效果

 2.2.2 Blocks使用

Blocks模块用于定制化场景下的应用界面。它提供了更高级的界面定制和扩展功能,适用于需要更精细控制界面布局和组件交互的情况。通过gr.Blocks,您可以使用不同的布局块(Blocks)来组织界面组件,以实现更灵活、复杂的界面设计。这个模块适用于那些需要对界面进行高度定制的开发者,可以根据具体需求构建独特的应用界面。

下面的示例,我们添加了一个html文本文字用gr.Markdown,用于渲染和显示Markdown格式的文本。

gr.Row(行布局):用于将组件水平排列在一行中。

gr.Textbox(文本框):用于接收和显示文本输入和输出。

gr.Button(按钮):用于创建按钮,用户可以点击按钮执行特定的操作。

btn.click:按钮触发点击事件

# gr.Blocks
import gradio as grdef update(name):return f"test gradio,{name}!"with gr.Blocks() as demo:# 界面输入文本说明gr.Markdown("Start typing below and then click **Run** to see the output.")with gr.Row():# 输入框inp=gr.Textbox(placeholder="What is your name?")# 输入框out=gr.Textbox()# 按钮btn=gr.Button("Run")# 点击事件btn.click(fn=update,inputs=inp,outputs=out)demo.launch()

运行结果:还是很简单的

 我们要马上引出今天的主体了,用gradio实现个对话框。

import gradio as grdef predict(input, history=[]):history.append(input)history.append("哈哈")# [::2]取出输入,取出输出history[1::2]reporse=zip(history[::2], history[1::2])print(reporse)return reporse,history;with gr.Blocks(css="#chatbot{height:800px} .overflow-y-auto{height:800px}") as demo:chatbot = gr.Chatbot(elem_id="chatbot")state = gr.State([])with gr.Row():txt = gr.Textbox(show_label=False, placeholder="Enter text and press enter")txt.submit(predict, [txt,state], [chatbot,state])
demo.launch()   

 运行结果:在文本框里输入文字回车就会回复对应的文字

官网文档地址:Gradio Textbox Docs

3.用openai和gradio实现聊天机器人

我们会使用到langchain的memory以及对话包,所以需要导入langchain包

导入如下包

%pip install -U openai==0.27
%pip install tiktoken
%pip install langchain

我们需要和ai对话,我们输入文本交给ai返回对应的回答这个功能在predict函数里,然后界面的对话框里我们输入文字回车就会调用我们的predict函数,我们会对返回数据进行封装处理,封装成,成对的对话信息元组列表(数据格式后面会详细的说明,所有看不懂的地方都放心的往后看),并返回到界面上。

import openai, os
import gradio as gr
from langchain import OpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationSummaryBufferMemory
from langchain.chat_models import ChatOpenAIos.environ["OPENAI_API_KEY"]=""
openai.api_key = os.environ["OPENAI_API_KEY"]memory = ConversationSummaryBufferMemory(llm=ChatOpenAI(), max_token_limit=2048)
conversation = ConversationChain(llm=OpenAI(max_tokens=2048, temperature=0.5), memory=memory,
)def predict(input, history=[]):history.append(input)response = conversation.predict(input=input)history.append(response)# history[::2] 切片语法,每隔两个元素提取一个元素,即提取出所有的输入,# history[1::2]表示从历史记录中每隔2个元素提取一个元素,即提取出所有的输出# zip函数把两个列表元素打包为元组的列表的方式responses = [(u,b) for u,b in zip(history[::2], history[1::2])]print("取出输入:",history[::2])print("取出输出:",history[1::2])print("组合元组:",responses)return responses, historywith gr.Blocks(css="#chatbot{height:800px} .overflow-y-auto{height:800px}") as demo:chatbot = gr.Chatbot(elem_id="chatbot")state = gr.State([])with gr.Row():txt = gr.Textbox(show_label=False, placeholder="Enter text and press enter")txt.submit(predict, [txt, state], [chatbot, state])demo.launch()

 运行结果

 又测试了一把运行结果

 

打印输出结果,这样就能更加清楚它的结构了。

取出输入: ['哈哈']
取出输出: [' 哈哈!你在开心?有什么好笑的事情发生了吗?']
组合元组: [('哈哈', ' 哈哈!你在开心?有什么好笑的事情发生了吗?')]
取出输入: ['哈哈', '你还认识我吗']
取出输出: [' 哈哈!你在开心?有什么好笑的事情发生了吗?', ' 当然!我认识你已经很久了,我们在一起聊天的时间也很长,我知道你的很多兴趣爱好,也知道你喜欢什么样的电影。']
组合元组: [('哈哈', ' 哈哈!你在开心?有什么好笑的事情发生了吗?'), ('你还认识我吗', ' 当然!我认识你已经很久了,我们在一起聊天的时间也很长,我知道你的很多兴趣爱好,也知道你喜欢什么样的电影。')]

 4.插个嘴:python切片

 我们刚才用了python的切片,那么都是什么意思呢,我们可以看下下面的示例,可以支持多种类型。

# 字符串
str="hsaoprpryo"
print(str[::2])
#[::2] 
# : start:起始位置,默认0
# : end:结束位置,默认end index
# 2 step:步长,默认是1# 列表
list=[1,2,3,4,5,6,7]
print(list[::2])#元组
tuple=(0,1,2,3,4,5)
print(tuple[::2])# 每隔两个取一个元素
list1=[1,2,3,4,5]
print("示例:",list1[1::2])str1="hsaoprpryo"
print("示例:",str1[1::2])list1=[1,2,3,4,5,6,7,8]
print("示例:",list1[0:4:2])

5.升级为语音聊天

5.1 与聊天机器人语音对话

首先我们需要说话转换文本给聊天机器人,聊天机器人接收到文本反馈回答的问题以后,把回答的文本转换语音发出来就可以了。

我们先实现前半部分,使用Audio录取我们的声音,然后监听到录完直接调用方法process_audio(),将录音转换为文本发给chatGDP就会对话了

 # 录音功能with gr.Row(): # 得到音频文件地址audio = gr.Audio(sources="microphone", type="filepath")audio.change(process_audio, [audio, state], [chatbot, state])# 录音文件转文本的过程
def process_audio(audio, history=[]):text = transcribe(audio)print(text)if text is None:text="你好"return predict(text, history)

完整的代码如下:

transcribe函数:找到音频文件,并通过openai的语音转文本把音频文件的说的话语转换为文本格式并把文本返回。

process_audio函数:接收录音机录音的回馈,然后调用transcribe转换文本,然后将文本给到predict函数,这样就给我们对应的对话结果,放入对应的元组数组里返回给界面。

audio = gr.Audio(sources="microphone", type="filepath")使用gr.Audio处理录音组件

audio.change(process_audio, [audio, state], [chatbot, state])录音结束触发对应函数处理。

import openai, os
import gradio as gr
from langchain import OpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationSummaryBufferMemory
from langchain.chat_models import ChatOpenAIos.environ["OPENAI_API_KEY"]=""
openai.api_key = os.environ["OPENAI_API_KEY"]memory = ConversationSummaryBufferMemory(llm=ChatOpenAI(), max_token_limit=2048)
conversation = ConversationChain(llm=OpenAI(max_tokens=2048, temperature=0.5), memory=memory,
)# 语音转文本openai的whisper
def transcribe(audio):#os.rename(audio, audio + '.wav')audio_file = open(audio, "rb")transcript = openai.Audio.transcribe("whisper-1", audio_file)return transcript['text']# 录音文件转文本的过程
def process_audio(audio, history=[]):text = transcribe(audio)print(text)if text is None:text="你好"return predict(text, history)# 调用openai对话功能
def predict(input, history=[]):history.append(input)response = conversation.predict(input=input)history.append(response)# history[::2] 切片语法,每隔两个元素提取一个元素,即提取出所有的输入,# history[1::2]表示从历史记录中每隔2个元素提取一个元素,即提取出所有的输出# zip函数把两个列表元素打包为元组的列表的方式responses = [(u,b) for u,b in zip(history[::2], history[1::2])]print("取出输入:",history[::2])print("取出输出:",history[1::2])print("组合元组:",responses)return responses, historywith gr.Blocks(css="#chatbot{height:800px} .overflow-y-auto{height:800px}") as demo:chatbot = gr.Chatbot(elem_id="chatbot")state = gr.State([])with gr.Row():txt = gr.Textbox(show_label=False, placeholder="Enter text and press enter")# 录音功能with gr.Row(): # 得到音频文件地址audio = gr.Audio(sources="microphone", type="filepath")txt.submit(predict, [txt, state], [chatbot, state])audio.change(process_audio, [audio, state], [chatbot, state])
# 启动gradio
demo.launch()

运行结果:对着说话说完按结束,则会默认放入某磁盘下,点击就会自动打开文件夹看到那个音频文件,然后转换文本给了ai,ai就会回馈了

 

5.2 聊天机器人语音化

接下来完成后半部分,将chatGPT的回答用语音说出来,需要用到Azure的文本转语音功能,大家需要先到官网先注册再开订阅使用。地址如下:

Azure AI 服务–将 AI 用于智能应用 | Microsoft Azure

azure-cognitiveservices-speech怎么使用可以看我这一章视频

TTS语音合成_哔哩哔哩_bilibili

语音包安装

# 安装azure tts包
%pip install azure-cognitiveservices-speech

可以先试下文本转语音是否能够发出声音, 

os.environ["AZURE_SPEECH_KEY"]=""
os.environ["AZURE_SPEECH_REGION"]="eastus"speech_config = speechsdk.SpeechConfig(subscription=os.environ.get('AZURE_SPEECH_KEY'), region=os.environ.get('AZURE_SPEECH_REGION'))
audio_config = speechsdk.audio.AudioOutputConfig(use_default_speaker=True)# 声音设置
speech_config.speech_synthesis_language='zh-CN'
speech_config.speech_synthesis_voice_name='zh-CN-XiaohanNeural'
# 语音合成器
speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
# 
text="你好"
speech_synthesis_result=speech_synthesizer.speak_text_async(text).get()
print(speech_synthesis_result)
# 如果有问题,打印出问题,没有以下步骤看不到具体的错误信息
if speech_synthesis_result.reason == speechsdk.ResultReason.Canceled:cancellation_details = speech_synthesis_result.cancellation_detailsprint("Speech synthesis canceled: {}".format(cancellation_details.reason))if cancellation_details.reason == speechsdk.CancellationReason.Error:if cancellation_details.error_details:print("Error details: {}".format(cancellation_details.error_details))

语音没问题可以直接处理了,定义一个可以播放声音的方法

#播放声音
def play_voice(text):print("播放声音:",text)speech_synthesizer.speak_text_async(text)

再得到对应的chatGPT后就调用这个播放语音的方法

def predict(input, history=[]):history.append(input)response = conversation.predict(input=input)history.append(response)# 播放ai返回回答的声音play_voice(response)responses = [(u,b) for u,b in zip(history[::2], history[1::2])]

整体代码:

别的没有变把语音的加进来就可以了。

import openai, os
import gradio as gr
from langchain import OpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationSummaryBufferMemory
from langchain.chat_models import ChatOpenAI
import azure.cognitiveservices.speech as speechsdkos.environ["OPENAI_API_KEY"]=""
os.environ["AZURE_SPEECH_KEY"]=""
os.environ["AZURE_SPEECH_REGION"]="eastus"openai.api_key = os.environ["OPENAI_API_KEY"]memory = ConversationSummaryBufferMemory(llm=ChatOpenAI(), max_token_limit=2048)
conversation = ConversationChain(llm=OpenAI(max_tokens=2048, temperature=0.5), memory=memory,
)#############-----------------设置声音
speech_config = speechsdk.SpeechConfig(subscription=os.environ.get('AZURE_SPEECH_KEY'), region=os.environ.get('AZURE_SPEECH_REGION'))
audio_config = speechsdk.audio.AudioOutputConfig(use_default_speaker=True)# 声音设置
# zh-HK 香港话   zh-HK-WanLungNeural:香港男生
# zh-CN-XiaozhenNeural
speech_config.speech_synthesis_language='zh-HK'
speech_config.speech_synthesis_voice_name='zh-HK-WanLungNeural'
# 语音合成器
speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)# 语音转文本openai的whisper
def transcribe(audio):#os.rename(audio, audio + '.wav')audio_file = open(audio, "rb")transcript = openai.Audio.transcribe("whisper-1", audio_file)return transcript['text']# 录音文件转文本的过程
def process_audio(audio, history=[]):text = transcribe(audio)print(text)if text is None:text="你好"return predict(text, history)# 调用openai对话功能
def predict(input, history=[]):history.append(input)response = conversation.predict(input=input)history.append(response)# 播放ai返回回答的声音play_voice(response)# history[::2] 切片语法,每隔两个元素提取一个元素,即提取出所有的输入,# history[1::2]表示从历史记录中每隔2个元素提取一个元素,即提取出所有的输出# zip函数把两个列表元素打包为元组的列表的方式responses = [(u,b) for u,b in zip(history[::2], history[1::2])]print("取出输入:",history[::2])print("取出输出:",history[1::2])print("组合元组:",responses)return responses, history#播放声音
def play_voice(text):print("播放声音:",text)speech_synthesizer.speak_text_async(text)with gr.Blocks(css="#chatbot{height:800px} .overflow-y-auto{height:800px}") as demo:chatbot = gr.Chatbot(elem_id="chatbot")state = gr.State([])with gr.Row():txt = gr.Textbox(show_label=False, placeholder="Enter text and press enter")# 录音功能with gr.Row(): # 得到音频文件地址audio = gr.Audio(sources="microphone", type="filepath")txt.submit(predict, [txt, state], [chatbot, state])audio.change(process_audio, [audio, state], [chatbot, state])
# 启动gradio
demo.launch()

运行结果:

运行结果可以看如下视频

https://live.csdn.net/v/342309

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

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

相关文章

Python按类别和比例从Labelme数据集中划分出训练数据集和测试数据集

Python按类别和比例从Labelme数据集中划分出训练数据集和测试数据集 前言前提条件相关介绍实验环境按类别和比例从Labelme数据集中划分出训练数据集和测试数据集代码实现输出结果 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩内容&#x…

真正解决jellyfin硬解码转码

前段时间入手一个DS423集成显卡UHD600,搭了一个jellyfin,发现网上关于硬解码的教程基本都存在问题,没有真正解决我的硬解码问题。经过一系列分析修改,最终实现硬解码。先贴效果图: 下载安装jellyfin这里就不叙述&#…

Maven-构建生命周期与插件

一、概念和基础 Maven针对项目的构建和发布定义了一系列明确的步骤,根据作用不同这些步骤分属于不同的生命周期。Maven针对每个步骤都有对应的默认插件,Maven在构建过程中是通过调用这些插件完成整个过程的。开发者只需要通过简单的命令就可以驱动maven…

若依分离版——使用Knife4j 自动生成接口文档

背景: 前后端分离程序,如果需要前端开发人员和后端开发人员配合开发,则需要将接口文档并显性给前端人员 解决办法: 使用knife4j替代若依自带的swagger,因为knife4j是在swagger基础上包装的,Knife4j不仅具…

nodejs+vue+python+PHP+微信小程序南七街道志愿者服务平台的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

键盘win键无法使用,win+r不生效、win键没反应、Windows键失灵解决方案(亲测可以解决)

最近几天发现自己笔记本的win键无法使用,win失灵了,但是外接键盘后则正常:。 这个问题困扰了我一周,我都以为自己的枪神坏了。 寻找了几个解决方法,网上看了好多好多稀里糊涂的办法,都是不管用的,这里给大…

RAW图像处理软件Capture One 23 Enterprise mac中文版功能特点

Capture One 23 Enterprise mac是一款专业的图像处理软件,旨在为企业用户提供高效、快速和灵活的工作流程。 Capture One 23 Enterprise mac软件的特点和功能 强大的图像编辑工具:Capture One 23 Enterprise提供了一系列强大的图像编辑工具,…

卡尔曼滤波EKF

目录 一、概述 二、卡尔曼滤波的5个公式 三、应用案例:汽车运动 四、应用案例:温度估计 五、总结 一、概述 初学者对于卡尔曼滤波5个公式有点懵,本文先接地气地介绍5个公式,然后举两个常用例子加强理解,同时附有M…

阿里云服务器密码在哪查看?如何设置修改初始密码?

阿里云服务器创建后没有默认初始密码,需要用户通过重置实例密码的方式来设置新的密码,阿里云服务器网aliyunfuwuqi.com分享阿里云服务器ECS重置实例密码的详细操作流程: 阿里云服务器重置密码方法 1、登录到阿里云服务器管理控制台 2、左侧…

STM32-EXTI中断

EXTI简介 EXTI(Extern Interrupt)外部中断 EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程…

【Leetcode】202. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

判断sparse matrix是否是对称矩阵

参考: https://stackoverflow.com/questions/48798893/error-in-checking-symmetric-sparse-matrix import scipy.sparse as sp import numpy as np np.random.seed(1)a sp.random(5, 5, density0.5)a结果如下 sym_err a - a.T sym_check_res np.all(np.abs(s…

制作一个用户登录界面

Flask-WTF扩展使用Python类来表示web表单。表单类只是将表单的字段定义为类变量。 再次考虑到分离的问题,我将使用一个新的app/forms.py模块来存储我的web表单类。首先,让我们定义一个用户登录表单,它要求用户输入用户名和密码。表单还将包括…

Vue3 + Vite + Ts + Router搭建项目

1、新建文件夹 从新建的文件夹cmd进入终端 2、安装vite—依据vite创建vue3项目 2.1、运行 npm init vitelatest2.2.1、输入项目名称 2.2.2、选择vue 2.2.3、选择TypeScript语言 3、安装依赖项 3.1、进入刚才创建的文件夹 cd vite-project 3.2、查看镜像 #查看当前源 npm con…

mac M2 pytorch_geometric安装

我目前的环境是mac M2,我在base环境中安装了pytorch_geometric,仅仅做测试用的,不做真正跑代码的测试 首先我的base环境的设置如下: pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.…

创建多层级行索引,创建多层级行索引的DataFrameMultiIndex.from_product()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 创建多层级行索引, 创建多层级行索引的DataFrame MultiIndex.from_product() [太阳]选择题 使用pd.MultiIndex.from_product(),下列输出正确的是: import pandas as pd…

【React入门实战】实现Todo代办

文章目录 效果功能-状态管理相关接口定义相关方法定义 UIinput输入框:回车添加todo标题列表列表项Main 总体代码 非常简单入门的react-todo练习,代码写的很小白。 效果 技术栈:react-typeScript 数据分为代办Todo和已办完Done,可…

Lazarus安装和入门资料

azarus-2.2.6-fpc-3.2.2-win64 下载地址 Lazarus 基础教程 - Lazarus Tutorials for Beginners Lazarus Tutorial #1 - Learning programming_哔哩哔哩_bilibili https://www.devstructor.com/index.php?pagetutorials Lazarus是一款开源免费的object pascal语言RAD IDE&…

全志T507-H技术帖 | 去掉IO扩展芯片后保留扩展引脚功能的实现方法

飞凌嵌入式推出的OKT507-C作为一款广受欢迎的开发板拥有丰富的功能接口,而实际上OKT507-C开发板的CPU引脚资源是比较紧缺的,那么它究竟是如何提供如此丰富的接口资源的呢?答案就是IO扩展芯片——TCA6424A。 这是一个24 位 I2C 和系统管理总线…

BSP-STM32移植FreeRTOS

在stm32裸机工程中的Middlewares目录添加freeRtos源码 在裸机工程中的main中调用freertos接口