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

深度学习系列76:流式tts的一个简单实现

1. 概述

使用queue,producer不断向queue中添加audio,然后consumer不断从queue中消费audio。
下面的样例使用melo来生成语音,需要先下载melo.tts。模型在https://myshell-public-repo-hosting.s3.amazonaws.com/openvoice/basespeakers/ZH/checkpoint.pth,config在https://myshell-public-repo-hosting.s3.amazonaws.com/openvoice/basespeakers/ZH/config.json。

2. 代码部分

from melo import utils
from melo.models import SynthesizerTrn
from melo.split_utils import split_sentences_zh
from melo.download_utils import load_or_download_config, load_or_download_model
from queue import Queue
from threading import Thread
import numpy as np
from pydub import playback
import torch, audiosegment
device = 'mps'
hps = load_or_download_config('ZH', use_hf=True, config_path=None)
num_languages = hps.num_languages
num_tones = hps.num_tones
symbols = hps.symbols
model = SynthesizerTrn(len(symbols),hps.data.filter_length // 2 + 1,hps.train.segment_size // hps.data.hop_length,n_speakers=hps.data.n_speakers,num_tones=num_tones,num_languages=num_languages,**hps.model,).to(device)
model.eval()
symbol_to_id = {s: i for i, s in enumerate(symbols)}
checkpoint_dict = load_or_download_model('ZH', device, use_hf=True, ckpt_path=None)
model.load_state_dict(checkpoint_dict['model'], strict=True)
def play(text):
    texts = text.split('。')
    speaker_id = 1
    def producer(queue):
        for i,t in enumerate(texts):
            bert, ja_bert, phones, tones, lang_ids = utils.get_text_for_tts_infer(t, 'ZH_MIX_EN', hps, device, symbol_to_id)
            with torch.no_grad():
                x_tst = phones.to(device).unsqueeze(0)
                tones = tones.to(device).unsqueeze(0)
                lang_ids = lang_ids.to(device).unsqueeze(0)
                bert = bert.to(device).unsqueeze(0)
                ja_bert = ja_bert.to(device).unsqueeze(0)
                x_tst_lengths = torch.LongTensor([phones.size(0)]).to(device)
                del phones
                speakers = torch.LongTensor([speaker_id]).to(device)
                audio = model.infer(x_tst,x_tst_lengths,speakers,tones,lang_ids,bert,ja_bert,
                        sdp_ratio=0,noise_scale=0,noise_scale_w=0,length_scale=1,)[0][0, 0].data.cpu().float().numpy()
                del x_tst, tones, lang_ids, bert, ja_bert, x_tst_lengths, speakers
            queue.put(audio)
    
    def consumer(queue):
        while True:
            audio = queue.get()    
            playback.play(audiosegment.from_numpy_array(audio.astype(np.float32),hps.data.sampling_rate))
            queue.task_done()
            
    q = Queue()
    q.put(np.zeros(int(hps.data.sampling_rate * 0.1)))
    t1 = Thread(target = producer, args=(q,))
    t2 = Thread(target=consumer, args=(q,))
    t2.daemon = True  # 线程2是无限循环需要设置守护线程以便主线程退出
    
    t1.start()
    t2.start()
    
    t1.join()  # 等待所有项被生产
    q.join()  # 等待所有项被消费

text = "..."
play(text)

http://www.kler.cn/a/517273.html

相关文章:

  • 计算机网络三张表(ARP表、MAC表、路由表)总结
  • 浅谈APP之历史股票通过echarts绘图
  • el-dialog内容大于高度时可滑动
  • 洛谷刷题1-3
  • 19_PlayerPres持久化_创建角色窗口
  • snippets router pinia axios mock
  • Vue3 + TS 实现批量拖拽 文件夹和文件 组件封装
  • SQL面试题3:累计汇总类、直播间同时在线问题
  • 翻译:How do I reset my FPGA?
  • 在Linux中,如何查询已安装软件包的版本信息?
  • 【电脑无法通过鼠标和键盘唤醒应该怎么办】
  • 9.1 GPTs 应用商店介绍:解锁定制化 AI 的无限潜能
  • 使用Swift Package Manager怎样区分debug和release打包环境
  • 从C语言看数据结构和算法:复杂度决定性能
  • Vue-Day1
  • <论文>用于大语言模型去偏的因果奖励机制
  • mybatis在mysql库中创建表实现案例
  • 【PHP】数组转换成json
  • ComfyUI实现老照片修复——AI修复老照片(ComfyUI-ReActor / ReSwapper)解决天坑问题及加速pip下载
  • LangChain + llamaFactory + Qwen2-7b-VL 构建本地RAG问答系统
  • 利用Python爬虫与1688 API接口:高效获取商品搜索数据
  • Docker 实现MySQL 主从复制
  • 搭建CANN开发+运行环境实验报告
  • SpringBoot篇 单元测试 理论篇
  • DRG/DIP 2.0时代下基于PostgreSQL的成本管理实践与探索(下)
  • Vue3 30天精进之旅:Day01 - 初识Vue.js的奇妙世界