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

2024 离线ASR和TTS推荐与示例

2024 离线ASR和TTS推荐

文章目录

  • 2024 离线ASR和TTS推荐
  • 一、前言
  • 二、安装与使用
    • 1、EdgeTTS的安装和使用
      • (1)Edge TTS介绍与效果试听
      • (2)Edge TTS安装
      • (3)Edge TTS查看支持的音色
      • (4)Edge TTS python代码调用
    • 2、Vosk 的安装和使用
      • (1)Vosk 介绍
      • (2)Vosk安装
      • (3)Vosk python调用
  • 三、结束语

一、前言

随着具身智能的发展和智能设备的发展,对于本地化运行ASR和TTS的需求越来越大。
在试用了目前许多的ASR和TTS的框架的时候下面是个人体验,感觉目前离线又比较小最好的两个框架:
(1)TTS框架:Edge-tts (100M<)
(2)ASR框架:Vosk(50M<)
这么小的完全可以部署在一些低性能的硬件上!

二、安装与使用

1、EdgeTTS的安装和使用

(1)Edge TTS介绍与效果试听

GitHub 仓库地址:https://github.com/rany2/edge-tts
相比目前主流的大模型语音合成服务如:GPTsovits、ChatTTS、Bert-VITS2、Cosyvoice等还需要配置torch-gpu环境,EdgeTTS整体运行环境比较大同时耗费的资源比较多,EdgeTTS操作起来对小白和低性能硬件更友好。

因为其底层是使用微软 Edge 的在线语音合成服务,所以不需要下载任何模型,甚至也不要 api_key安装库就能用,简直不要太良心~

关键是,除了支持普通话外,还支持很多地方口音(比如: 粤语、台湾口音、陕西话、辽宁东北话等)。
具体可以进我写的这个edge-tts合成的音频试听网站听一下
合成音频试听网址:https://demo.sztuai.com/
在这里插入图片描述

(2)Edge TTS安装

最基本的环境安装,只需要一个 pip 包即可!:

pip install edge-tts

(3)Edge TTS查看支持的音色

查看支持的所有音色:

linux  : edge-tts  --list-voices
windows: edge-tts  --list-voices

如果想查看支持的中文、粤语 or 台湾语

linux  : edge-tts  --list-voices| grep CN #HK # TW
windows: edge-tts  --list-voices| findstr CN #HK # TW

(4)Edge TTS python代码调用

基础的代码调用

import edge_ttstext = """曾经有一份真诚的爱情放在我面前,我没有珍惜,等我失去的时候我才后悔莫及,人世间最痛苦的事莫过于此。
如果上天能够给我一个再来一次的机会,我会对那个女孩子说三个字:我爱你。如果非要在这份爱上加上一个期限,我希望是……一万年"""communicate = edge_tts.Communicate(text=text,voice="zh-HK-HiuGaaiNeural",rate='+0%',    # -30%表示语速变慢30%,+30%表示语速增加30%。volume= '+0%', # 通过–volume参数来设置播放的音量,-60%表示音量减少60%,+60%表示音量增加60%。pitch= '+0Hz') # 通过pitch参数来调整合成语音的频率,-50Hz表示降低频率50Hz,+50Hz则相反communicate.save_sync("test.wav")

异步调用tts并合成查询到语音音色,用于试听(如果只是用中文那么可以在这个网站试听:https://demo.sztuai.com/)

import asyncio
import edge_tts
"创建一个异步任务"
async def amain(text,voice,output_file):""" Main function"""communicate = edge_tts.Communicate(text,voice)await communicate.save(output_file)"添加多个异步任务"
async def main():" edge-tts  --list-voices| findstr CN 查询支持的音色并,打印音色试听"models="""
Name: zh-CN-XiaoxiaoNeural
Name: zh-CN-XiaoyiNeural
Name: zh-CN-YunjianNeural
Name: zh-CN-YunxiNeural
Name: zh-CN-YunxiaNeural
Name: zh-CN-YunyangNeural
Name: zh-CN-liaoning-XiaobeiNeural
Name: zh-CN-shaanxi-XiaoniNeural
"""models=models.split('Name:')models=[item.strip() for item in models if len(item.strip())>0]print(models)tasks=[]defaultText="随着具身智能的发展和智能设备的发展,对于本地化运行ASR和TTS的需求越来越大。520"for model in models:tasks.append(amain(defaultText,model,model+'.mp3'))await asyncio.gather(*tasks)if __name__ == '__main__':asyncio.run(main())

2、Vosk 的安装和使用

(1)Vosk 介绍

github地址:https://github.com/alphacep/vosk-api

  • 支持二十+种语言 - 中文,英语,印度英语,德语,法语,西班牙语,葡萄牙语,俄语,土耳其语,越南语,意大利语,荷兰人,加泰罗尼亚语,阿拉伯, 希腊语, 波斯语, 菲律宾语,乌克兰语, 哈萨克语, 瑞典语, 日语, 世界语, 印地语, 捷克语, 波兰语, 乌兹别克语, 韩国语
  • 移动设备上脱机工作-Raspberry Pi,Android,iOS
  • 使用简单的 pip3 install vosk 安装
  • 每种语言的轻量模型只有是50Mb, 但还有更大的large模型可用
  • 提供流媒体API,以提供最佳用户体验(与流行的语音识别python包不同)
  • 还有用于不同编程语言的包装器-java / csharp / javascript等
  • 可以快速重新配置词汇以实现最佳准确性
  • 支持说话人识别

(2)Vosk安装

vosk包安装

pip install vosk

模型安装
下面如果是linux系统就运行下面的指令,如果是windows系统,就复制网址到浏览器中即可下载。
第一个是43m的模型,第二个1.3g的模型,平常使用50m的模型即可。(国内外都可以下载已测试过)

wget -c https://alphacephei.com/vosk/models/vosk-model-small-cn-0.22.zip
wget -c https://alphacephei.com/vosk/models/vosk-model-cn-0.15.zip

(3)Vosk python调用

将模型解压后,新建一个文件夹models将模型放到models里面,同时models与asrdemo.py放在同一级,如果要修改位置请修改第19行
asrdemo.py

#!/usr/bin/env python3
import json
import wave
import sysfrom vosk import Model, KaldiRecognizer, SetLogLevel
def asr(audioPath):# You can set log level to -1 to disable debug messagesSetLogLevel(0)wf = wave.open(audioPath, "rb")if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE":print("Audio file must be WAV format mono PCM.")sys.exit(1)#model = Model(model_name=r"C:\Users\waitK\Downloads\vosk-model-small-cn-0.22\vosk-model-small-cn-0.22")# You can also init model by name or with a folder pathmodel = Model("models/vosk-model-small-cn-0.22")rec = KaldiRecognizer(model, wf.getframerate())rec.SetWords(True)#rec.SetPartialWords(True) # 这个是流式识别的参数,如果要流式逐字识别就取消这里的注释、while循环里面else块里面的注释while True:data = wf.readframes(4000)if len(data) == 0:breakif rec.AcceptWaveform(data):print(rec.Result())#print(json.loads(rec.Result())['text']) #如果只要打印文本则只需要运行这个else:#print(rec.PartialResult())# print(json.loads(rec.PartialResult())['partial'])passprint(rec.FinalResult())if __name__ == '__main__':wavpath=input('音频地址:')# 绝对或相对都可asr(wavpath)```

注:更多功能和示例请参考源码中的example部分,那里很全。
注:部分时候识别音频会出现下面的报错:
在这里插入图片描述
这是因为使用您自己的音频文件时,请确保其格式正确 - PCM 16kHz 16bit 单声道。否则,需要用ffmpeg转一下
下面是优化有的步骤

安装ffmpeg

pip install imageio-ffmpeg

优化后,对于每一个音频我们都进行格式化为PCM 16kHz 16bit 单声道再识别,这样子就可以保证没有问题了。具体的代码如下:

#!/usr/bin/env python3
import json
import wave
import sysfrom vosk import Model, KaldiRecognizer, SetLogLevel
import subprocess
import imageio_ffmpeg as ffmpeg
def formatAudio(input_file,output_file='output.wav'):# 构建 ffmpeg 命令command = [ffmpeg.get_ffmpeg_exe(),"-y","-loglevel","0","-i", input_file,"-acodec", "pcm_s16le","-ac", "1","-ar", "16000",output_file]# 运行命令subprocess.run(command, check=True)def init():# 初始化模型global modelmodel = Model("models/vosk-model-small-cn-0.22")
def asr(audioPath):global model# 格式化音频为 PCM 16kHz 16bit 单声道。output_file = 'output.wav'audioPath=audioPath.replace('\"','')formatAudio(audioPath,output_file)# You can set log level to -1 to disable debug messagesSetLogLevel(0)wf = wave.open(output_file, "rb")if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE":print("Audio file must be WAV format mono PCM.")sys.exit(1)#model = Model(model_name=r"C:\Users\waitK\Downloads\vosk-model-small-cn-0.22\vosk-model-small-cn-0.22")rec = KaldiRecognizer(model, wf.getframerate())rec.SetWords(True)#rec.SetPartialWords(True) # 这个是流式识别的参数,如果要流式逐字识别就取消这里的注释、while循环里面else块里面的注释while True:data = wf.readframes(4000)if len(data) == 0:breakif rec.AcceptWaveform(data):print(rec.Result())#print(json.loads(rec.Result())['text']) #如果只要打印文本则只需要运行这个else:#print(rec.PartialResult())# print(json.loads(rec.PartialResult())['partial'])passprint(rec.FinalResult())if __name__ == '__main__':init() # 初始化模型while True:wavpath=input('待转录音频地址:')# 绝对或相对都可asr(wavpath)

三、结束语

到这里硬件就具备基本的asr和tts功能了,下面可以选择调用openai或者豆包来做为llm。
ASR --> LLM --> TTS
llm选择就相当多了,这里就不多赘述了,如果要本地可以试着ollama 的qwen1.5b。(现存3g左右就可以)
流式自然响应可以看看我以前写的这一篇博客:
使用pyaudio 录音,停止说话时自动结束


http://www.mrgr.cn/news/33931.html

相关文章:

  • 关于我重生到21世纪学C语言这件事——指针详解(1)
  • 两个链表求并集、交集、差集
  • 万字长文解读深度学习——ViT、ViLT、DiT
  • 生成式模型api国际选择
  • 升级浏览器
  • 基于Java和Vue实现的顺风车拼车系统打车约车平台拼车软件
  • 【二等奖论文】2024年华为杯研究生数学建模E题成品论文获取入口
  • Java 每日一刊(第15期):内部类
  • java8新特新(二)
  • AI学习指南深度学习篇-Adadelta的数学原理
  • Project Online 高级版部署方案
  • 7款国内AI搜索引擎大全网站
  • Kotlin Android 环境搭建
  • uniapp map设置高度为100%后,会拉伸父容器的高度
  • MateBook 16s 2023在Deepin下开启性能模式,调节风扇转速到最大,全网首发!
  • 返利机器人在电商返利系统中的负载均衡实现
  • 【C语言零基础入门篇 - 17】:排序算法
  • PHP isset() 和 empty() 区别
  • 【C++】继承(上)
  • 定了,东湖高新区下半年中高级职称申报时间
  • java日志框架之Log4j
  • Golang | Leetcode Golang题解之第430题扁平化多级双向链表
  • C++标准库双向链表 list 中的insert函数实现。
  • C++离线查询
  • Golang | Leetcode Golang题解之第429题N叉树的层序遍历
  • Codeforces Round 969 (Div. 1) C. Eri and Expanded Sets(线段树维护差分数组gcd+双指针+尺取)