语镜VocaMirror——基于sensevoice、cosyvoice和qwen模型实现与“自身声音”对话

简介: 语镜 VocaMirror 是一个创新的对话系统,灵感来源于汤姆猫游戏和亲人语音克隆项目,旨在让用户与自己的声音进行对话。系统融合了语音识别、自然语言处理及个性化语音合成技术,提供趣味互动、心理治疗辅助及多功能扩展等应用。用户可通过 Gradio 界面轻松使用,实现语音转文本、对话生成及个性化语音回复等功能。

项目简介

语镜 VocaMirror 系统受汤姆猫游戏和亲人语音克隆项目的启发,旨在实现用户与
“自己声音”对话的功能。该系统集成语音识别、自然语言处理和个性化语音合成技术,
应用了sensevoice、cosyvoice和qwen模型。具备以下应用价值:

  • 趣味性互动:提供与自己声音对话的全新体验。
  • 心理治疗辅助:熟悉的声音有助于缓解自闭症等患者的心理防御。
  • 多功能拓展:可用作辩论训练、心灵自省等角色设定。

image.png

(界面展示)

VocaMirror 的主要功能包括:

  • 语音识别 (ASR):将用户语音转录为文本。
  • 自然语言生成 (LLM):基于上下文生成对话回复。
  • 语音合成 (TTS):将生成的文本转为个性化的语音回复。
  • 用户界面:通过 Gradio 实现易用的前端界面。

环境安装与运行准备

conda create -n cosyvoice python=3.8
conda activate cosyvoice
# pynini is required by WeTextProcessing, use conda to install it as it can be executed on all platform.
conda install -y -c conda-forge pynini==2.1.5
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com

# 您可以解压 ttsfrd 资源并安装 ttsfrd 包以获得更好的文本标准化性能
cd pretrained_models/CosyVoice-ttsfrd/
unzip resource.zip -d .
pip install ttsfrd-0.3.6-cp38-cp38-linux_x86_64.whl

pip install gradio
pip install -r requirements.txt
pip install -U funasr modelscope
pip install dashscope

前往github或魔搭社区下载cosyvoice模型与sensevoice模型,将webui_qwen.py放置在cosyvoice/Cosyvoice
cosyvoice魔搭链接:https://www.modelscope.cn/models/iic/CosyVoice-300M
sensevoice魔搭链接:https://www.modelscope.cn/models/iic/SenseVoiceSmall

代码解析

1.引入必要的依赖

import gradio as gr
import os
import sys
import numpy as np
import torch
import argparse
import random
from dashscope import Generation
from cosyvoice.cli.cosyvoice import CosyVoice
from cosyvoice.utils.file_utils import load_wav, logging
from funasr import AutoModel
import torchaudio
import librosa
import dashscope

2. 配置模型与参数

2.1 DashScope API 配置

dashscope.api_key = '申请的通义api_key'

2.2 初始化模型

cosyvoice = CosyVoice('pretrained_models/CosyVoice-300M-Instruct')
asr_model = AutoModel(
    model="iic/SenseVoiceSmall",
    vad_model="iic/speech_fsmn_vad_zh-cn-16k-common-pytorch",
    vad_kwargs={
   "max_single_segment_time": 30000},
    trust_remote_code=True,
    disable_update=True,
)
prompt_sr, target_sr = 16000, 22050

CosyVoice:用于语音复刻的模型,支持从少量语音数据中生成相似的声音。
ASR 模型:用于将用户语音转录为文本。vad_model 提供语音活动检测以提升识别质量。
采样率设置:输入语音采样率为 16kHz,生成语音目标采样率为 22.05kHz。

3. 语音处理

3.1 音频后处理

def postprocess(speech, top_db=60, hop_length=220, win_length=440):
    speech, _ = librosa.effects.trim(
        speech, top_db=top_db,
        frame_length=win_length,
        hop_length=hop_length
    )
    if speech.abs().max() > 0.8:
        speech = speech / speech.abs().max() * 0.8
    return torch.concat([speech, torch.zeros(1, int(target_sr * 0.2))], dim=1)

去除静音:通过 librosa.effects.trim 去除音频中的多余静音部分。
音量归一化:限制音频最大幅值为 0.8,防止过大或失真。

3.2 ASR 推理

def transcribe_audio(audio_file):
    waveform, sample_rate = torchaudio.load(audio_file)
    if sample_rate != 16000:
        waveform = torchaudio.transforms.Resample(sample_rate, 16000)(waveform)
    transcription = asr_model.generate(input=waveform[0].numpy())[0]["text"]
    transcription = re.sub(r"<\|.*?\|>", "", transcription).strip()
    return transcription

加载音频:使用 torchaudio 加载音频文件。
采样率调整:若音频采样率非 16kHz,则进行重采样。
ASR 推理:调用 funasr 模型进行语音转文本。
文本清洗:移除可能的冗余标记。

4. 调用 DashScope 生成回复

def generate_reply(chat_query, chat_history):
    messages = [{
   'role': 'system', 'content': '你是一个友好的AI助手,请根据上下文作出回复。'}]
    for user_msg, ai_msg in chat_history:
        messages.append({
   'role': 'user', 'content': user_msg})
        messages.append({
   'role': 'assistant', 'content': ai_msg})
    messages.append({
   'role': 'user', 'content': chat_query})

    try:
        response = Generation.call(
            api_key=dashscope.api_key,
            model="qwen-plus",
            messages=messages,
            result_format="message"
        )
        if response.status_code == 200:
            reply_text = response.output.choices[0].message.content.strip()
        else:
            reply_text = f"出错了:HTTP返回码 {response.status_code}, 错误码 {response.code}, 错误信息 {response.message}"
    except Exception as e:
        reply_text = f"调用 API 发生异常:{str(e)}"

    chat_history.append((chat_query, reply_text))
    return reply_text, chat_history

构建消息上下文:整合用户输入和聊天历史。
调用 DashScope:通过 Generation.call 生成回复。
异常处理:处理接口调用失败或异常情况。

5. 语音合成

def generate_voice(input_audio, tts_text, prompt_text):
    prompt_speech_16k = postprocess(load_wav(input_audio, prompt_sr))
    for result in cosyvoice.inference_zero_shot(tts_text, prompt_text, prompt_speech_16k, stream=False):
        yield (target_sr, result['tts_speech'].numpy().flatten())

语音输入:通过加载输入音频的特征作为合成提示。
零样本生成:基于 CosyVoice 实现零样本语音合成。

6. Gradio 界面设计

语音复刻模式

def main():
    with gr.Blocks() as demo:
        gr.Markdown("## VocaMirror - 不妨听听,自己的声音")
        with gr.Tabs() as tabs:
            with gr.Tab("语音复刻模式"):
                gr.Markdown("### 聊天框 - 语音输入 & 回复生成")
                with gr.Row():
                    with gr.Column(scale=3):
                        chatbox = gr.Chatbot(label="对话历史")
                        input_audio = gr.Audio(label="输入音频", type="filepath")
                        submit_button = gr.Button("发送")

                    with gr.Column(scale=2):
                        output_audio = gr.Audio(label="AI 回复语音")

                state = gr.State([])

                def process_audio(audio_file, history):
                    text_input = transcribe_audio(audio_file)
                    reply_text, updated_history = generate_reply(text_input, history)
                    speech_generator = generate_voice(audio_file, reply_text, text_input)
                    output_audio_file = next(speech_generator, None)
                    return updated_history, updated_history, output_audio_file

                submit_button.click(
                    process_audio,
                    inputs=[input_audio, state],
                    outputs=[chatbox, state, output_audio]
                )

    demo.launch(share=False)

具体webui代码可以前往github下载

目录
相关文章
|
7月前
|
Web App开发 机器学习/深度学习 语音技术
在ModelScope-FunASR中,语音识别系统中的声音活动检测
在ModelScope-FunASR中,语音识别系统中的声音活动检测【4月更文挑战第3天】
311 1
|
9天前
|
数据采集 前端开发 物联网
【项目实战】通过LLaMaFactory+Qwen2-VL-2B微调一个多模态医疗大模型
本文介绍了一个基于多模态大模型的医疗图像诊断项目。项目旨在通过训练一个医疗领域的多模态大模型,提高医生处理医学图像的效率,辅助诊断和治疗。作者以家中老人的脑部CT为例,展示了如何利用MedTrinity-25M数据集训练模型,经过数据准备、环境搭建、模型训练及微调、最终验证等步骤,成功使模型能够识别CT图像并给出具体的诊断意见,与专业医生的诊断结果高度吻合。
【项目实战】通过LLaMaFactory+Qwen2-VL-2B微调一个多模态医疗大模型
|
1月前
|
人工智能 测试技术 人机交互
mini-GPT4o来了? 能看、能听、会说,还情感丰富的多模态全能助手EMOVA
【10月更文挑战第24天】EMOVA(EMotionally Omni-present Voice Assistant)是一项多模态全能助手的研究,旨在实现更自然、更智能的人机交互。该模型不仅能够处理图像、文本和语音,还具备丰富的情感表达能力。通过语义-声学解耦的语音标记器、全模态对齐和轻量级风格模块,EMOVA在视觉-语言和语音基准测试中表现出色,适用于智能助手、虚拟现实、教育和娱乐等领域。
24 3
|
2月前
|
机器学习/深度学习 PyTorch 语音技术
语音识别模型
Whisper 是 OpenAI 推出的语音处理项目,基于深度学习,具备高度智能化和准确性的语音识别、翻译和生成能力。通过丰富的数据集和先进的注意力机制,Whisper 在多种语言环境下表现出色,支持语音识别、翻译、口语识别和语音活动检测等多种任务。用户可以通过 Python 代码或命令行轻松使用 Whisper,完成高质量的语音处理任务。官网:https://openai.com/research/whisper,GitHub:https://github.com/openai/whisper。
|
3月前
|
人工智能 自然语言处理 搜索推荐
如何让智能客服像真人一样对话?容联七陌揭秘:多Agent大模型
科技云报到原创。 经历了多年的“答非所问”、“一问三不知”,很多人已经厌倦了所谓的“智能客服”。哪怕是技术已经非常成熟、可以模拟真人发音的外呼机器人,也会因为“机感”重而被用户迅速挂机或转向人工客服。 智能客服似乎遇到了一道坎,在理解用户、和用户对话方面,始终无法实现真正的“智能”。然而大模型技术的出现,让智能客服看到了前所未有的曙光——基于大模型特有的生成式技术和智能的涌现,让智能客服越来越逼近人们想象中的样子。 但问题是,仅有大模型就够了吗?大模型技术要如何引入智能客服才能落地?落地后的大模型究竟如何在智能客服具体场景中发挥作用?又能为客服行业带来了哪些改变?更进一步,对于企业和
246 1
如何让智能客服像真人一样对话?容联七陌揭秘:多Agent大模型
|
2月前
|
搜索推荐 机器人 数据处理
基于大语言模型的 FireRedTTS 语音合成系统
【10月更文挑战第3天】近年来,随着人工智能技术的发展,基于大语言模型的语音合成系统备受关注。FireRedTTS 系统由郭浩瀚等人提出,旨在满足多样化的语音合成需求。该系统分为数据处理、基础系统和下游应用三部分,通过高质量数据集和语义感知架构生成高保真语音信号。其应用场景包括配音和聊天机器人,能够实现零样本语音克隆和可控类人语音合成,提供自然且个性化的交互体验。然而,系统仍面临计算资源和完全自然语音合成等方面的挑战。[了解更多](https://arxiv.org/abs/2409.03283)
251 3
|
4月前
|
人工智能 算法
通义语音AI技术问题之预训练语言模型句子嵌入存在的各向异性问题如何解决
通义语音AI技术问题之预训练语言模型句子嵌入存在的各向异性问题如何解决
32 5
|
4月前
|
人工智能 语音技术
通义语音AI技术问题之Qwen-Audio对多任务预训练中的干扰问题如何解决
通义语音AI技术问题之Qwen-Audio对多任务预训练中的干扰问题如何解决
39 2
|
4月前
|
自然语言处理 语音技术 开发者
ChatTTS超真实自然的语音合成模型
ChatTTS超真实自然的语音合成模型
146 3
|
5月前
|
自然语言处理 并行计算 Python
千问大模型对话
该段Python代码演示了如何使用`modelscope`库加载预训练的因果语言模型`Qwen2-1___5B-Instruct`到CUDA设备,并进行文本生成。首先,它定义了设备为`cuda`,然后加载模型和分词器。接着,设置了一个聊天情境并准备输入文本。通过调用`tokenizer.apply_chat_template`处理输入,然后将处理后的文本转化为模型输入张量并传入设备。使用`model.generate`方法生成新的文本,截取生成的输出并解码为人类可读的字符串。最后,打印出生成的响应。
145 6