跳转至

CosyVoce 文字转语音ヾ(•ω•`)o

什么是CosyVoiceヾ(•ω•`)o

CosyVoice 是阿里巴巴通义实验室开发的开源多语言语音合成模型,支持多种语言和方言,具备零样本语音克隆、实时流式合成、高自然度语音生成等功能,能够根据文本的情感和风格需求生成相应语音,适用于语音助手、智能客服等场景,具有广泛的应用前景。

多语言支持:涵盖中文、英文、日文、韩文、粤语等多种语言和方言。

文字转语音的简单部署ヾ(•ω•`)o

由于官方的网站只提供了简单的demo场景,而且经常报错,所以想要直接使用,还是需要自己本地部署并写一个简单的服务器的,以Python为例

  1. 安装部署严格按照官方文档进行:GitHub - FunAudioLLM/CosyVoice: Multi-lingual large voice generation model, providing inference, training and deployment full-stack ability.
  2. 参考官方文档的脚本,已经非常简单直接的,我们只需要稍作修改就可以将其变为简单的服务器,首先根据prompt音频用几秒钟进行克隆训练,之后就可以快速响应客户端请求,且可以支持不同方言的选择:
    from flask import Flask, request, send_file, abort
    import io
    import torchaudio
    from cosyvoice.cli.cosyvoice import CosyVoice2
    from cosyvoice.utils.file_utils import load_wav
    import sys
    sys.path.append('third_party/Matcha-TTS')
    app = Flask(__name__)
    
    cosyvoice = CosyVoice2('pretrained_models/CosyVoice2-0.5B', load_jit=False, load_trt=False, fp16=False, use_flow_cache=False)
    prompt = load_wav('./asset/zero_shot_prompt.wav', 16000)
    
    # 粤语ID示例,根据Unity语音ID进行处理
    voice_style_map = {
        0: '用普通话说这句话',
        1: '用粤语话说这句话',
        2: '用四川话说这句话',
        3: '用上海话说这句话',
    
        # 你可以在此添加更多 voiceID 和语音风格
    }
    
    @app.route('/tts')
    def tts():
        text = request.args.get("content", "").strip()
        voice_id = int(request.args.get("id", 0))
    
        if not text:
            return abort(400, description="Missing 'content' parameter")
    
        voice_instruction = voice_style_map.get(voice_id, voice_style_map[0])
    
        try:
            # 生成语音
            for chunk in cosyvoice.inference_instruct2(text, voice_instruction, prompt, stream=False):
                wav_tensor = chunk['tts_speech']
                sample_rate = cosyvoice.sample_rate
                break  # 只取第一个输出段
        except Exception as e:
            return abort(500, description=f"TTS generation failed: {e}")
    
        # 保存为 MP3 格式返回
        mp3_buffer = io.BytesIO()
        torchaudio.save(mp3_buffer, wav_tensor, sample_rate, format="mp3")
        mp3_buffer.seek(0)
        return send_file(mp3_buffer, mimetype="audio/mpeg", download_name="tts.mp3")
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", port=19463)
    
  3. 客户端也很简单,其他平台和编程语言都可以参考WebRequest形式获取到生成的语音,生成的语音将会保存为 output.mp3
    import requests
    
    def test_tts_server(text, voice_id, server_url="http://10.12.17.136:19463/tts    "):
        """
        测试 TTS 服务器的函数
    
        :param text: 要合成语音的文本内容
        :param voice_id: 语音风格的 ID
        :param server_url: TTS 服务器的 URL,默认为本地运行的服务器
        :return: None
        """
        # 构造请求参数
        params = {
            "content": text,
            "id": voice_id
        }
    
        try:
            # 发送 GET 请求到 TTS 服务器
            response = requests.get(server_url, params=params, stream=True)
    
            # 检查响应状态码
            if response.status_code == 200:
                # 保存返回的 MP3 文件
                with open("output.mp3", "wb") as f:
                    for chunk in response.iter_content(chunk_size=1024):
                        if chunk:
                            f.write(chunk)
                print("MP3 文件已成功保存为 output.mp3")
            else:
                print(f"请求失败,状态码:{response.status_code}")
                print(f"服务器返回的错误信息:{response.text}")
        except Exception as e:
            print(f"请求过程中发生错误:{e}")
    
    # 示例调用
    if __name__ == "__main__":
        text_to_speak = "你好,世界,我爱你!"
        voice_id_to_use = 0  # 示例语音 ID,根据需要修改
        test_tts_server(text_to_speak, voice_id_to_use)
    

评论