Gradio——语音对话demo

import gradio as gr
import os
import random
import json
import requests
import timefrom openai import  AzureOpenAI# audio to text here
def audio_to_text(audio_path):"""audio to text here,目前是openai whisperParameters:audio_path: str, 音频文件路径Returns:transcription.text: str, 音频转换的文本"""if audio_path == None or "":return Noneprint(f"正在处理audio_path:{audio_path}")client = AzureOpenAI(api_key='',api_version = "",azure_endpoint="https://speech-01.openai.azure.com/")audio_file= open(audio_path, "rb")transcription = client.audio.transcriptions.create(model="whisper", file=audio_file)print(transcription.text)return transcription.textdef chat_completions(messages, gr_states, history):"""chat completion here,目前是kimi free apiParameters:messages: openai 格式 messagesReturns:response: dict, openai chat api返回的结果"""if not messages:return gr_states, historyheaders = { "Content-Type": "application/json","Authorization": "Bearer " + "{your refresh token here}"}max_retry = 5retry = 0while retry < max_retry:try:retry += 1response = requests.post(url="{your free kimi api deploy url here}",headers=headers,data=json.dumps({"model": "kimi",  "messages": messages,"stream": False,# "temperature": 0.8,}),)print(response.json())content = response.json()['choices'][0]['message']['content']if content:gr_states["history"][-1].append(content)history.pop()history.append(gr_states["history"][-1])breakexcept Exception as e:print(e)passif retry == max_retry:gr_states["history"][-1].append("Connection Error: 请求失败,请重试")print(history)history.pop()history.append(gr_states["history"][-1])return gr_states, historydef process_tts(text):"""text to speech hereParameters:text: str, 待转换的文本Returns:path: str, 保存音频的路径"""url = '{your tts model url here}'headers = {'Content-Type': 'application/json'}data = {"text": text,"text_language": "zh"}time_stamp = time.strftime("%Y%m%d-%H%M%S")directory = './audio_cache/'if not os.path.exists(directory):os.makedirs(directory)path = directory + 'audio_' + time_stamp + '.wav'response = requests.post(url, headers=headers, data=json.dumps(data))print("Status Code:", response.status_code)if response.status_code == 200:with open(path, 'wb') as f:f.write(response.content)else:print('Request failed.')return pathdef get_audio(gr_states, audio):"""在gradio上渲染audio组件, 更新chatbot组件"""response = gr_states["history"][-1][1]print(gr_states)if response == "Connection Error: 请求失败,请重试" or response == None:gr_states["history"].pop()return audioelse:audio = process_tts(response)return audiodef init_default_role():"""初始化默认角色 根据角色确定 system prompt"""system_prompt = "你是一只会说话的青蛙,但无论说什么都爱在最后加上'呱唧呱唧'。"role = "一只用于演示的青蛙"role_description = "它是一只会说话的青蛙,但无论说什么都爱在最后加上'呱唧呱唧'。"return role, role_description, system_promptdef get_random_role():"""随机获取一个角色,这里只是一个示例函数根据角色确定 system prompt"""i = random.randint(0, 10)system_prompt = "你是一只会说话的青蛙,但无论说什么都爱在最后加上'呱唧呱唧'。"role = f"另一只用于演示的{i}号青蛙"role_description = "它也是一只会说话的青蛙,但无论说什么都爱在最后加上'呱唧呱唧'。"return role, role_description, system_promptdef format_messages(user_message, gr_states, history):"""prepare the request data [messages] for the chatbotParameters:user_message: str, 用户输入的消息gr_states: dict, {"system_prompt": str, "hisotry": List, "user_prompt": str}history: list, 聊天记录,一个嵌套列表: [["用户消息", "bot回复"],["用户消息", "bot回复"]]"""messages = [{"role": "system","content": gr_states["system_prompt"],},]history.append([user_message, None])if len(user_message) > 0:gr_states["history"].append([user_message])for [usr, bot] in history:messages.append({"role": "user","content": usr})if bot:messages.append({"role": "assistant","content": bot})return messages, gr_states, historyelse:return None, gr_states, historydef set_up(gr_states):"""maybe 随机切换一个角色"""role_name, role_description, system_prompt = get_random_role()gr_states = {"system_prompt": system_prompt, "history":[]}role_info_display = f''' # {role_name}{role_description}'''history = []return history, gr_states, role_info_display, Nonewith gr.Blocks(gr.themes.Soft()) as demo:demo.title = 'Takway.AI'gr.Markdown('''<center><font size=6>Takway.AI </font></center>''')role_name, role_description, system_prompt = init_default_role()gr_states = gr.State({"system_prompt": system_prompt, "history":[]})messages = gr.State(None)with gr.Tab(label='demo'):with gr.Row():role_info_display = gr.Markdown(f''' # {role_name}{role_description}''')with gr.Row():with gr.Column(scale = 7):with gr.Row():chatbot = gr.Chatbot(label='聊天界面', value=[], render_markdown=False, height=500, visible=True)with gr.Row():user_prompt = gr.Textbox(label='对话输入框(按Enter发送消息)', interactive=True, visible=True)# input_audio = gr.Audio(sources=['microphone'])input_audio = gr.Audio(label = "语音输入框", sources=['microphone', 'upload'], type="filepath")with gr.Column(scale=3):with gr.Row():change_btn = gr.Button("随机换一个角色")with gr.Row():  audio = gr.Audio(label = "output", interactive=False, autoplay=True)user_prompt.submit(format_messages, [user_prompt, gr_states, chatbot], [messages, gr_states, chatbot]).then(chat_completions, [messages, gr_states, chatbot], [gr_states, chatbot]).then(get_audio, [gr_states, audio], audio)input_audio.change(audio_to_text, input_audio, user_prompt)change_btn.click(set_up, gr_states, [chatbot, gr_states, role_info_display, audio])demo.launch(server_name='0.0.0.0', server_port=9877, share=True)

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

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

相关文章

数据结构刷题篇 之 【力扣二叉树基础OJ】详细讲解(含每道题链接及递归图解)

有没有一起拼用银行卡的&#xff0c;取钱的时候我用&#xff0c;存钱的时候你用 1、相同的树 难度等级&#xff1a;⭐ 直达链接&#xff1a;相同的树 2、单值二叉树 难度等级&#xff1a;⭐ 直达链接&#xff1a;单值二叉树 3、对称二叉树 难度等级&#xff1a;⭐⭐ 直达…

【Godot4自学手册】第三十一节使用WorldEnvironment为地宫入口粒子系统添加辉光

本节&#xff0c;首先我将使用WorldEnvironment节点为地宫入口的例子系统添加辉光&#xff0c;让游戏看上去效果更加灿烂。其次加入相应提示信息&#xff0c;白天到达地宫附近、未杀死怪物进入地宫&#xff0c;都有提示信息&#xff0c;达到条件后地宫方可进入。先看一下效果&a…

CSS之动画

一&#xff0c;动画的制作 实现盒子绕圈走 二&#xff0c; 动画的常用属性 三&#xff0c;动画简写属性 前面两个属性一定要写&#xff0c;第三个linear是指匀速的意思&#xff08;默认是ease&#xff09;

Machine Learning机器学习之数据可视化

目录 前言 一、 数据预处理与清洗 二、常见可视化技术 三、可视化工具和平台 博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神&#xff0c;答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者…

IT服务监督管理案例分析题

习题一 根据国家电网提出建设智能电网&#xff0c;信息化作为推进电力企业实现发展战略目标的和目标的核心保障体系&#xff0c;作用日益突出。这其中更需要进步推动信息运维综合监管系统的深化应用工作。 某软件股份有限公司是国内IT运维管理服务提供商&#xff0c;为多家电…

tls和ssl的区别,ssh和ssl区别

在网络通信和安全领域&#xff0c;TLS&#xff08;Transport Layer Security&#xff09;、SSL&#xff08;Secure Sockets Layer&#xff09;和SSH&#xff08;Secure Shell&#xff09;是常见的加密协议&#xff0c;它们都起着保护数据安全的重要作用。在本文中&#xff0c;我…

PPP、RRE、MGRE综合实验

一、实验拓扑图 二、实验要求 1.R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址&#xff1b; 2.R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方: R2与R5之间使用ppp的CHAP认证&#xff0c; R5为主认证方;R3与R5之间使用HDLC封装; 3.R1、R2、…

MSTP环路避免实验(思科)

华为设备参考&#xff1a;MSTP环路避免实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 MSTP&#xff08;多生成树协议&#xff09;&#xff0c;MSTP解决了STP和RSTP没有考虑vlan的问题&#xff0c;STP和RSTP将所有的vlan共享为一个生成树实例&#xff0c;无法实现…

MySQL 锁合集与事务隔离级别

概览 在数据库管理中&#xff0c;锁是用来控制多个事务对同一数据的并发访问的机制。InnoDB作为MySQL的默认事务型存储引擎&#xff0c;提供了多种类型的锁来保障事务的隔离性并减少冲突&#xff0c;从而维护数据库的完整性和一致性。以下是InnoDB提供的主要锁类型&#xff1a…

速成软件书:真的是神器吗?

那些声称几天就能让你精通软件的书籍&#xff0c;到底是真是假&#xff1f;它们真的是神器吗&#xff1f; 个人看法 快速了解&#xff1a;速成软件书可能适合那些想要快速了解一种软件或技能的初学者。它们可能提供了基础知识和快速入门指导&#xff0c;对于初学者来说可能有所…

linux提权笔记

1 linux提权简介 Linux提权&#xff0c;简单来说&#xff0c;就是用户尝试获取高于其当前权限级别的系统访问权限的过程。在Linux系统中&#xff0c;root用户拥有最高的权限&#xff0c;能够执行任何操作&#xff0c;包括修改系统文件、安装软件、管理用户账户等。而普通用户通…

Java 中文官方教程 2022 版翻译完成

Java 中文官方教程 2022 版教程&#xff1a;入门指南课程&#xff1a;Java 技术现象关于 Java 技术Java 技术能做什么&#xff1f;Java 技术将如何改变我的生活&#xff1f;课程&#xff1a; “Hello World!” 应用程序“Hello World!” 适用于 NetBeans IDE“Hello World!” f…

岭师大数据技术原理与应用-序章-软工版

HeZaoCha-CSDN博客 序章—软工版 一、环境介绍1. VMware Workstation Pro2. CentOS3. Java4. Hadoop5. HBase6. MySQL7. Hive 二、系统安装1. 虚拟网络编辑器2. 操作系统安装 三、结尾 先说说哥们写这系列博客的原因&#xff0c;本来学完咱也没想着再管部署这部分问题的说&…

腾讯云优惠券领取步骤详解

腾讯云是腾讯公司旗下云计算品牌&#xff0c;作为国内领先的云计算服务提供商&#xff0c;为企业和个人提供了丰富的云产品和服务。为了吸引用户上云&#xff0c;腾讯云推出了各种优惠券&#xff0c;让用户在购买云产品时享受更多优惠。本文将为大家详细解析腾讯云优惠券的领取…

文献学习(自备)

收官大作&#xff0c;多组学融合的新套路发NC&#xff01;&#xff01; - 知乎 (zhihu.com) Hofbauer cell function in the term placenta associates with adult cardiovascular and depressive outcomes | Nature Communications 病理性胎盘炎症会增加几种成人疾病的风险&a…

系统分析师-参考模型

前言 网络术语中的参考模型指的是OSI参考模型&#xff0c;由ISO&#xff08;国际标准化组织&#xff09;制定的一套普遍适用的规范集合&#xff0c;以使得全球范围的计算机平台可进行开放式通信。 ISO创建了一个有助于开发和理解计算机的通信模型&#xff0c;即开放系统互联OS…

探索数据结构:链式队与循环队列的模拟、实现与应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 队列的定义 队列&#xff08;queue&#xff09;是一种只允许在一端进…

docker--部署 (超详版) (五)

环境准备&#xff1a;docker&#xff0c;mysql&#xff0c;redis&#xff0c;镜像&#xff0c;nginx 把虚拟机打开&#xff0c;连接xshell&#xff0c;参考博客&#xff1a; https://blog.csdn.net/m0_74229802/article/details/136965820?spm1001.2014.3001.5501 一&#x…

【微信加人自动化】RPA机器人:人人都会实现的机器人

用上这个机器人&#xff0c;一定要心平气和&#xff0c;不要放肆&#xff0c;单号忍住控制在15个人以内&#xff08;但悄悄的告诉你&#xff0c;可以切换账号呀&#xff09; 这个加人机器人&#xff0c;人人都可以通过学习自己动手实现&#xff0c;不再局限于遥不可及的“黑科…

通俗易懂:volatile关键字在内存模型中起到什么作用?

在计算机编程语言中&#xff0c;尤其是在Java语言中&#xff0c;volatile关键字对于内存模型的影响至关重要&#xff0c;它主要用于解决多线程环境下的内存可见性和禁止指令重排序问题&#xff0c;以确保并发编程的正确性。以下是volatile关键字在Java内存模型&#xff08;JMM&…