当前位置: 首页 > news >正文

WeNet语音识别+Qwen-72B-Chat Bot+Sambert-Hifigan语音合成

WeNet语音识别+Qwen-72B-Chat Bot👾+Sambert-Hifigan语音合成

简介

利用 WeNet 进行语音识别,使用户能够通过语音输入与系统进行交互。接着,Qwen-72B-Chat Bot作为聊天机器人接收用户的语音输入或文本输入,提供响应并与用户进行对话。最后,系统利用 Sambert-Hifigan 进行语音合成,将机器人的响应转换为自然流畅的语音输出,使用户能够以语音方式接收机器人的回复。

特点

  1. 对话记忆功能: 该系统能够记忆和追踪用户和聊天机器人之间的对话历史。这使得用户能够在对话中随时回顾之前的交流内容,从而实现更连贯的对话和更好的交互体验。

  2. 多语音模型切换: 该系统支持多种语音模型的切换。用户可以根据需要选择不同的语音模型进行交互。这种多语音模型切换功能使得系统在不同语境下有更强的适用性和灵活性。

界面

体验一下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

环境配置

在这里插入图片描述

完整代码

import os
os.system('pip install dashscope')
os.system('pip install modelscope')
import gradio as gr
from http import HTTPStatus
import dashscope
from dashscope import Generation
from dashscope.api_entities.dashscope_response import Role
from typing import List, Optional, Tuple, Dict
from urllib.error import HTTPError
import wenet
from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasksdefault_system = 'You are a helpful assistant.'
chs_model = wenet.load_model('chinese')
YOUR_API_TOKEN = os.getenv('YOUR_API_TOKEN')
dashscope.api_key = YOUR_API_TOKEN
History = List[Tuple[str, str]]
Messages = List[Dict[str, str]]# 加载四个不同的语音合成模型
sambert_hifigan_zh_model_id = 'damo/speech_sambert-hifigan_tts_zh-cn_16k'
sambert_hifigan_zh = pipeline(task=Tasks.text_to_speech, model=sambert_hifigan_zh_model_id)sambert_hifigan_ch_model_id = 'speech_tts/speech_sambert-hifigan_tts_chuangirl_Sichuan_16k'
sambert_hifigan_ch = pipeline(task=Tasks.text_to_speech, model=sambert_hifigan_ch_model_id)sambert_hifigan_ca_model_id = 'speech_tts/speech_sambert-hifigan_tts_jiajia_Cantonese_16k'
sambert_hifigan_ca = pipeline(task=Tasks.text_to_speech, model=sambert_hifigan_ca_model_id)sambert_hifigan_ws_model_id = 'speech_tts/speech_sambert-hifigan_tts_xiaoda_WuuShanghai_16k'
sambert_hifigan_ws = pipeline(task=Tasks.text_to_speech, model=sambert_hifigan_ws_model_id)def clear_session() -> History:return []def modify_system_session(system: str) -> str:if system is None or len(system) == 0:system = default_systemreturn system, system, []def history_to_messages(history: History, system: str) -> Messages:messages = [{'role': Role.SYSTEM, 'content': system}]for h in history:messages.append({'role': Role.USER, 'content': h[0]})messages.append({'role': Role.ASSISTANT, 'content': h[1]})return messagesdef messages_to_history(messages: Messages) -> Tuple[str, History]:assert messages[0]['role'] == Role.SYSTEMsystem = messages[0]['content']history = []for q, r in zip(messages[1::2], messages[2::2]):history.append([q['content'], r['content']])return system, historydef model_chat(path:str, history: Optional[History], system: str,model:str,voice:str
) -> Tuple[str, str, History]:if path is not None:query = chs_model.transcribe(path)['text']if query is None:query = ''if history is None:history = []messages = history_to_messages(history, system)messages.append({'role': Role.USER, 'content': query})gen = Generation.call(model = "qwen-72b-chat",messages=messages,result_format='message',stream=True)for response in gen:if response.status_code == HTTPStatus.OK:role = response.output.choices[0].message.roleresponse = response.output.choices[0].message.contentsystem, history = messages_to_history(messages + [{'role': role, 'content': response}])else:raise HTTPError('Request id: %s, Status code: %s, error code: %s, error message: %s' % (response.request_id, response.status_code,response.code, response.message))output=None# 进行语音合成sambert_hifigan_tts_model = {'默认': sambert_hifigan_zh,'四川话': sambert_hifigan_ch,'粤语': sambert_hifigan_ca,'上海话': sambert_hifigan_ws}# 使用对应的语音合成模型进行合成sambert_hifigan_tts = sambert_hifigan_tts_model.get(model)if model == '默认':output = sambert_hifigan_tts(input=response, voice=voice)else:output = sambert_hifigan_tts(input=response)wav = output[OutputKeys.OUTPUT_WAV]path = 'output.wav'with open(path, 'wb') as f:f.write(wav)return history, system, pathdef update_dropdowns(model,voice):   if model == "默认":  voice=gr.Dropdown(choices=['zhitian_emo', 'zhiyan_emo', 'zhizhe_emo', 'zhibei_emo'], value='zhitian_emo',label="声音",visible=True) else: voice=gr.Dropdown(choices=['zhitian_emo', 'zhiyan_emo', 'zhizhe_emo', 'zhibei_emo'], value='zhitian_emo',label="声音",visible=False)return voice
with gr.Blocks() as demo:gr.Markdown("""<p align="center"><img src="https://modelscope.cn/api/v1/models/qwen/Qwen-VL-Chat/repo?Revision=master&FilePath=assets/logo.jpg&View=true" style="height: 80px"/><p>""")gr.Markdown("""<center><font size=4>WeNet语音识别+Qwen-72B-Chat Bot👾+Sambert-Hifigan语音合成</center>""")textbox = gr.Microphone(type="filepath",label='录音')with gr.Row():with gr.Column(scale=3):system_input = gr.Textbox(value=default_system, lines=1, label='System', visible=False)with gr.Column(scale=1):modify_system = gr.Button("🛠️ 设置system并清除历史对话", scale=2, visible=False)system_state = gr.Textbox(value=default_system, visible=False)chatbot = gr.Chatbot(label='Qwen-72B-Chat', visible=False)model=gr.Dropdown(choices=['默认', '四川话', '粤语', '上海话'], value='默认',label="声音模型")voice = gr.Dropdown(choices=['zhitian_emo', 'zhiyan_emo', 'zhizhe_emo', 'zhibei_emo'], value='zhitian_emo',label="声音")audio_output = gr.Audio(type="filepath",label='输出音频',autoPlay=True)with gr.Row():clear_history = gr.Button("🎲 清除记忆")sumbit = gr.Button("🚀 发送")model.change(update_dropdowns,inputs=[model,voice],outputs=[voice])sumbit.click(model_chat,inputs=[textbox, chatbot, system_state,model,voice],outputs=[chatbot, system_input,audio_output],concurrency_limit=10)clear_history.click(fn=clear_session,inputs=[],outputs=[chatbot],concurrency_limit=10)modify_system.click(fn=modify_system_session,inputs=[system_input],outputs=[system_state, system_input, chatbot],concurrency_limit=10)
demo.queue(api_open=False).launch(height=800, share=False)

在这里插入图片描述

相关文章:

WeNet语音识别+Qwen-72B-Chat Bot+Sambert-Hifigan语音合成

WeNet语音识别Qwen-72B-Chat Bot&#x1f47e;Sambert-Hifigan语音合成 简介 利用 WeNet 进行语音识别&#xff0c;使用户能够通过语音输入与系统进行交互。接着&#xff0c;Qwen-72B-Chat Bot作为聊天机器人接收用户的语音输入或文本输入&#xff0c;提供响应并与用户进行对话…...

是否需要跟上鸿蒙(OpenHarmony)开发岗位热潮?

前言 自打华为2019年发布鸿蒙操作系统以来&#xff0c;网上各种声音百家争鸣。尤其是2023年发布会公布的鸿蒙4.0宣称不再支持Android&#xff0c;更激烈的讨论随之而来。 本文没有宏大的叙事&#xff0c;只有基于现实的考量。 通过本文&#xff0c;你将了解到&#xff1a; Har…...

【Golang】Json 无法表示 float64 类型的 NaN 以及 Inf 导致的 panic

【Golang】Json 无法表示 float64 类型的 NaN 以及 Inf 导致的 panic 原因 golang 服务出现了 panic&#xff0c;根据 panic 打印出的堆栈找到了问题代码&#xff0c;看上去原因是&#xff1a;json 序列化时&#xff0c;遇到了无法序列化的内容 [panic]: json: unsupported …...

bootstrap5实现宠物商店网站 Cat-Master

一、需求分析 宠物商店网站是指专门为宠物商店或宠物用品商家而建立的在线平台。这种网站的功能通常旨在提供以下服务&#xff1a; 产品展示&#xff1a;宠物商店网站通常会展示宠物食品、玩具、床上用品、健康护理产品等各种宠物用品的图片和详细信息。这样&#xff0c;潜在的…...

基于多反应堆的高并发服务器【C/C++/Reactor】(中)创建并初始化TcpServer实例 以及 启动

对于一个TcpServer来说&#xff0c;它的灵魂是什么&#xff1f;就是需要提供一个事件循环EventLop(EventLoop)&#xff0c;不停地去检测有没有客户端的连接到达&#xff0c;有没有客户端给服务器发送数据&#xff0c;描述的这些动作&#xff0c;反应堆模型能够胜任。当服务器和…...

边缘计算设备是什么意思。

问题描述&#xff1a;边缘计算设备是什么意思。 问题解答&#xff1a; 边缘计算&#xff08;Edge Computing&#xff09;是一种计算模型&#xff0c;其主要思想是在距离数据产生源头更近的地方进行数据处理和计算&#xff0c;而不是将所有数据传输到远程云服务器进行处理。边…...

使用ChatGPT midjourney 等AI智能工具,能为视觉营销做些什么?

使用ChatGPT、Midjourney等AI智能工具&#xff0c;可以极大地提升视觉营销的效率和创意水平。以下是这些工具在视觉营销中的一些具体应用&#xff1a; 内容创作与文案撰写&#xff08;ChatGPT&#xff09; 广告文案生成&#xff1a;根据产品特点和目标受众&#xff0c;生成吸…...

图像分割实战-系列教程4:unet医学细胞分割实战2(医学数据集、图像分割、语义分割、unet网络、代码逐行解读)

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 unet医学细胞分割实战1 unet医学细胞分割实战2 unet医学细胞分割实战3 unet医学细胞分割实战4 unet…...

防火墙未开端口导致zookeeper集群异常,kafka起不来

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 主机信息&#xff1a; IPhostname10.0.0.10host1010.0.0.12host1210.0.0.13host13 在这三台主机上部署…...

React-hook-form-mui(二):表单数据处理

前言 在上一篇文章中&#xff0c;我们介绍了react-hook-form-mui的基础用法。本文将着表单数据处理。 react-hook-form-mui提供了丰富的表单数据处理功能&#xff0c;可以通过watch属性来获取表单数据。 Demo 下面是一个使用watch属性的例子&#xff1a; import React from…...

java网络文件地址url的转换为MultipartFile文件流

废话不多说&#xff0c;直接上代码 一、异常捕捉类 public class BusinessException extends RuntimeException {public BusinessException(String msg){super(msg);} }二、转换类 package com.example.answer_system.utils;import org.springframework.mock.web.MockMultipa…...

JS实现/封装节流函数

封装节流函数 节流原理&#xff1a;在一定时间内&#xff0c;只能触发一次 let timer, flag; /*** 节流原理&#xff1a;在一定时间内&#xff0c;只能触发一次* * param {Function} func 要执行的回调函数 * param {Number} wait 延时的时间* param {Boolean} immediate 是否立…...

ENVI 各版本安装指南

ENVI下载链接 https://pan.baidu.com/s/1APpjHHSsrXMaCcJUQGmFBA?pwd0531 1.鼠标右击【ENVI 5.6(64bit&#xff09;】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 ENVI 5.6(64bit&#xff09;】。 2.打开解压后的文件夹&#xff0c…...

60天零基础干翻C++————初识C++

初识c 命名空间命名空间的定义命名空间的使用 输入输出流缺省参数引用引用定义常量的引用引用的使用场景做函数参数引用做返回值 命名空间 命名空间的定义 在c语言中会有下面问题 上述代码中&#xff0c;全局变量rand 可能会命名冲突&#xff0c;如下图 此时编译失败&…...

考研复试英语口语问答举例第二弹

考研复试英语口语问答举例第二弹 文章目录 考研复试英语口语问答举例第二弹Question &#xff1a;介绍你的读研兴趣与动机Answer11&#xff1a;&#xff08;自动化控制方向&#xff09;Answer12&#xff1a;&#xff08;集成电路方向&#xff09;Answer13&#xff1a;&#xff…...

MyBatis-Plus实现自定义SQL语句的分页查询

正常开发的时候&#xff0c;有时候要写一个多表查询&#xff0c;然后多表查询之后还需要分页&#xff0c;MyBatis-Plus的分页插件功能挺不错的&#xff0c;可以很简单实现自定义SQL的分页查询。 分页插件配置 import com.baomidou.mybatisplus.annotation.DbType; import com…...

vue3 里的 ts 类型工具函数

目录 前言一、PropType\<T>二、MaybeRef\<T>三、MaybeRefOrGetter\<T>四、ExtractPropTypes\<T>五、ExtractPublicPropTypes\<T>六、ComponentCustomProperties七、ComponentCustomOptions八、ComponentCustomProps九、CSSProperties 前言 相关 …...

【SpringCloud】之远程消费(进阶使用)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringCloud开发之远程消费》。&#x1f3af;&a…...

自然语言处理24-T5模型的介绍与训练过程,利用简单构造数据训练微调该模型,体验整个过程

大家好,我是微学AI,今天给大家介绍一下自然语言处理24-T5模型的介绍与训练过程,利用简单构造数据训练微调该模型,体验整个过程。在大模型ChatGPT发布之前,NLP领域是BERT,T5模型为主导,T5(Text-to-Text Transfer Transformer)是一种由Google Brain团队在2019年提出的自然…...

CISSP 第5章 保护资产的安全

1、资产识别和分类 1.1 敏感数据 1.1.1 定义 敏感数据是任何非公开或非机密的信息&#xff0c;包括机密的、专有的、受保护的或因其对组织的价值或按照现有的法律和法规而需要组织保护的任何其他类型的数据。 1.1.2 个人身份信息PII 个人身份信息&#xff08;PII&#xff09…...

告别加密日志:MTK平台离线调试利器SpOffineDebugSuite v3.4安装与使用全攻略

MTK平台离线调试实战&#xff1a;SpOffineDebugSuite v3.4与GAT工具链深度解析 在移动设备开发领域&#xff0c;联发科技(MTK)平台因其高性价比和丰富功能而广受欢迎。然而&#xff0c;当系统出现崩溃或异常时&#xff0c;传统的在线调试方式往往受限于设备连接状态和实时性要求…...

AI应用开发利器:NeuroAPI网关统一管理多模型调用与智能路由

1. 项目概述&#xff1a;一个面向AI应用开发者的API网关最近在折腾AI应用开发的朋友&#xff0c;估计都绕不开一个核心痛点&#xff1a;如何高效、稳定地管理多个不同厂商、不同模型的AI服务调用。无论是OpenAI的GPT系列、Anthropic的Claude&#xff0c;还是国内外的各种大模型…...

从零解析ST电机库FOC:核心算法与工程实现

1. FOC技术基础&#xff1a;从三相电流到旋转磁场 我第一次接触FOC&#xff08;Field Oriented Control&#xff09;时&#xff0c;被那些复杂的数学公式搞得头晕目眩。直到有一天&#xff0c;我把无刷电机想象成小时候玩的磁铁小车&#xff0c;突然就明白了其中的奥妙。FOC本质…...

命令行控制中心:提升开发效率的聚合与自动化工具

1. 项目概述&#xff1a;一个面向开发者的命令行控制中心最近在GitHub上看到一个挺有意思的项目&#xff0c;叫jendrypto/command-center。光看名字&#xff0c;你可能会联想到科幻电影里那种布满屏幕、控制一切的舰桥。但在开发者的世界里&#xff0c;它其实是一个更接地气、更…...

倍福官网改版后,如何用F12开发者工具找回消失的Twincat3老版本安装包(附4024.11下载链接)

倍福官网改版后如何找回消失的Twincat3老版本安装包 作为一名自动化工程师&#xff0c;你是否遇到过这样的困境&#xff1a;项目需要特定版本的Twincat3进行维护或兼容性测试&#xff0c;但倍福官网改版后&#xff0c;历史版本下载入口却神秘消失了&#xff1f;这种情况在工业软…...

深度解析Cyber Engine Tweaks:5大核心技术实现《赛博朋克2077》脚本框架逆向工程

深度解析Cyber Engine Tweaks&#xff1a;5大核心技术实现《赛博朋克2077》脚本框架逆向工程 【免费下载链接】CyberEngineTweaks Cyberpunk 2077 tweaks, hacks and scripting framework 项目地址: https://gitcode.com/gh_mirrors/cy/CyberEngineTweaks Cyber Engine …...

青岛X射线探伤机服务好的供应商

在工业检测领域&#xff0c;X射线探伤机并非一次性采购的设备——它需要持续的技术支持、稳定的运行保障&#xff0c;以及服务商在关键时刻的响应能力。选择一家服务好的供应商&#xff0c;往往比选择一台设备本身更需要慎重。在青岛&#xff0c;有一家名为华誉机电设备有限公司…...

轻量级网络监控工具nmer:配置即代码的探测与响应实践

1. 项目概述&#xff1a;一个轻量级网络监控与响应工具最近在梳理内部网络监控体系时&#xff0c;我重新审视了一个老伙计——psterman/nmer。这可不是什么新潮的框架&#xff0c;但在特定场景下&#xff0c;它的简洁和高效总能让人眼前一亮。简单来说&#xff0c;nmer是一个用…...

3分钟快速上手:用MoneyPrinterTurbo一键生成AI短视频的完整指南

3分钟快速上手&#xff1a;用MoneyPrinterTurbo一键生成AI短视频的完整指南 【免费下载链接】MoneyPrinterTurbo 利用AI大模型&#xff0c;一键生成高清短视频 Generate short videos with one click using AI LLM. 项目地址: https://gitcode.com/GitHub_Trending/mo/MoneyP…...

5分钟快速上手COLA架构:构建清晰分层的企业级应用完整指南

5分钟快速上手COLA架构&#xff1a;构建清晰分层的企业级应用完整指南 【免费下载链接】COLA &#x1f964; COLA: Clean Object-oriented & Layered Architecture 项目地址: https://gitcode.com/gh_mirrors/col/COLA COLA&#xff08;Clean Object-oriented &…...