2024 离线ASR和TTS推荐与示例

2024 离线ASR和TTS推荐

文章目录

  • [2024 离线ASR和TTS推荐](#2024 离线ASR和TTS推荐)
  • 一、前言
  • 二、安装与使用
    • 1、EdgeTTS的安装和使用
      • [(1)Edge TTS介绍与效果试听](#(1)Edge TTS介绍与效果试听)
      • [(2)Edge TTS安装](#(2)Edge TTS安装)
      • [(3)Edge TTS查看支持的音色](#(3)Edge TTS查看支持的音色)
      • [(4)Edge TTS python代码调用](#(4)Edge TTS python代码调用)
    • [2、Vosk 的安装和使用](#2、Vosk 的安装和使用)
      • [(1)Vosk 介绍](#(1)Vosk 介绍)
      • (2)Vosk安装
      • [(3)Vosk python调用](#(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 包即可!:

html 复制代码
pip install edge-tts

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

查看支持的所有音色:

html 复制代码
linux  : edge-tts  --list-voices
windows: edge-tts  --list-voices

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

html 复制代码
linux  : edge-tts  --list-voices| grep CN #HK # TW
windows: edge-tts  --list-voices| findstr CN #HK # TW

(4)Edge TTS python代码调用

基础的代码调用

html 复制代码
import edge_tts

text = """曾经有一份真诚的爱情放在我面前,我没有珍惜,等我失去的时候我才后悔莫及,人世间最痛苦的事莫过于此。
如果上天能够给我一个再来一次的机会,我会对那个女孩子说三个字:我爱你。如果非要在这份爱上加上一个期限,我希望是......一万年"""

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/)

html 复制代码
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包安装

html 复制代码
pip install vosk

模型安装

下面如果是linux系统就运行下面的指令,如果是windows系统,就复制网址到浏览器中即可下载。

第一个是43m的模型,第二个1.3g的模型,平常使用50m的模型即可。(国内外都可以下载已测试过)

html 复制代码
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

html 复制代码
#!/usr/bin/env python3
import json
import wave
import sys

from vosk import Model, KaldiRecognizer, SetLogLevel
def asr(audioPath):
    # You can set log level to -1 to disable debug messages
    SetLogLevel(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 path
    model = 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:
            break
        if rec.AcceptWaveform(data):
            print(rec.Result())
            #print(json.loads(rec.Result())['text']) #如果只要打印文本则只需要运行这个

        else:
            #print(rec.PartialResult())
           # print(json.loads(rec.PartialResult())['partial'])

            pass

    print(rec.FinalResult())

if __name__ == '__main__':
    wavpath=input('音频地址:')# 绝对或相对都可

    asr(wavpath)```

注:更多功能和示例请参考源码中的example部分,那里很全。

注:部分时候识别音频会出现下面的报错:

这是因为使用您自己的音频文件时,请确保其格式正确 - PCM 16kHz 16bit 单声道。否则,需要用ffmpeg转一下

下面是优化有的步骤

安装ffmpeg

html 复制代码
pip install imageio-ffmpeg

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

html 复制代码
#!/usr/bin/env python3
import json
import wave
import sys

from 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 model
    model = 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 messages
    SetLogLevel(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:
            break
        if rec.AcceptWaveform(data):
            print(rec.Result())
            #print(json.loads(rec.Result())['text']) #如果只要打印文本则只需要运行这个

        else:
            #print(rec.PartialResult())
           # print(json.loads(rec.PartialResult())['partial'])

            pass

    print(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 录音,停止说话时自动结束

相关推荐
databook8 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar9 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780519 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_9 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机16 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机17 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机17 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机17 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i17 小时前
drf初步梳理
python·django
每日AI新事件17 小时前
python的异步函数
python