ubuntu使用whisper和funASR-语者分离-二值化

这篇具有很好参考价值的文章主要介绍了ubuntu使用whisper和funASR-语者分离-二值化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、选择系统

ubuntu使用whisper和funASR-语者分离-二值化,ubuntu,whisper,linux

ubuntu使用whisper和funASR-语者分离-二值化,ubuntu,whisper,linux

这个镜像可以
ubuntu使用whisper和funASR-语者分离-二值化,ubuntu,whisper,linux

1.1 更新环境

python -m pip install --upgrade pip
ubuntu使用whisper和funASR-语者分离-二值化,ubuntu,whisper,linux

二、安装使用whisper

我在另一篇博客也写道,互相交流学习
whisper-深入-语者分离

2.1 创建环境

# ssh登录系统
# 切换到root用户
mkdir /opt/tools/
cd /opt/tools/
# 安装miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod +x Miniconda3-latest-Linux-x86_64.sh
./Miniconda3-latest-Linux-x86_64.sh
#按提示操作,安装目录建议选择/opt/miniconda3
#创建软链接
ln -s /opt/miniconda3/bin/conda /usr/local/bin/conda
#退出shell重新登陆,然后后续操作
#创建环境
conda create -n whisper python=3.9
conda activate whisper


2.1 安装

2.1.1安装基础包

pip install -U openai-whisper
或者
pip install git+https://github.com/openai/whisper.git
或者
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openai-whisper

2.1.2安装依赖

pip install tiktoken
pip install setuptools-rust
#在conda whisper环境外执行,安装ffmpeg
sudo apt update && sudo apt install ffmpeg

3测试1

whisper audio.mp3 --model medium --language Chinese

代码调用

import whisper
import arrow

# 定义模型、音频地址、录音开始时间
def excute(model_name,file_path,start_time):
    model = whisper.load_model(model_name)
    result = model.transcribe(file_path)
    for segment in result["segments"]:
        now = arrow.get(start_time)
        start = now.shift(seconds=segment["start"]).format("YYYY-MM-DD HH:mm:ss")
        end = now.shift(seconds=segment["end"]).format("YYYY-MM-DD HH:mm:ss")
        print("【"+start+"->" +end+"】:"+segment["text"])

if __name__ == '__main__':
    excute("base","1001.mp3","2022-10-24 16:23:00")

3测试2 语着分离

创建key

https://huggingface.co/settings/tokens

创建代码

  • cache_dir:模型啥的下载后存放位置
  • use_auth_token :创建的key

import os
import whisper
from pyannote.audio import Pipeline
from pyannote_whisper.utils import diarize_text
import concurrent.futures

pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization", use_auth_token="你申请的key",cache_dir="/root/autodl-tmp/whisper/env")
output_dir = '/root/autodl-tmp/pyannote-whisper'

def process_audio(file_path):
    model = whisper.load_model("large")
    asr_result = model.transcribe(file_path, initial_prompt="语音转换")
    diarization_result = pipeline(file_path)
    final_result = diarize_text(asr_result, diarization_result)

    output_file = os.path.join(output_dir, os.path.basename(file_path)[:-4] + '.txt')
    with open(output_file, 'w') as f:
        for seg, spk, sent in final_result:
            line = f'{seg.start:.2f} {seg.end:.2f} {spk} {sent}\n'
            f.write(line)

if not os.path.exists(output_dir):
    os.makedirs(output_dir)

wave_dir = '/root/autodl-tmp/pyannote-whisper'
# 获取当前目录下所有wav文件名
wav_files = [os.path.join(wave_dir, file) for file in os.listdir(wave_dir) if file.endswith('.wav')]


# 处理每个wav文件
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
    executor.map(process_audio, wav_files)

print('处理完成!')
报错ModuleNotFoundError: No module named 'pyannote'

ubuntu使用whisper和funASR-语者分离-二值化,ubuntu,whisper,linux
解决方案

pip install  pyannote.audio
报错No module named 'pyannote_whisper'

如果你使用使用AutoDL平台,你可以使用学术代理加速

source /etc/network_turbo
git clone https://github.com/yinruiqing/pyannote-whisper.git
cd pyannote-whisper
pip install -r requirements.txt

ubuntu使用whisper和funASR-语者分离-二值化,ubuntu,whisper,linux
这个错误可能是由于缺少或不正确安装了所需的 sndfile 库。sndfile 是一个用于处理音频文件的库,它提供了多种格式的读写支持。

你可以尝试安装 sndfile 库,方法如下:

在 Ubuntu 上,使用以下命令安装:sudo apt-get install libsndfile1-dev
在 CentOS 上,使用以下命令安装:sudo yum install libsndfile-devel
在 macOS 上,使用 Homebrew 安装:brew install libsndfile
然后重新执行如上指令

在项目里面写代码就可以了,或者复制代码里面的pyannote_whisper.utils模块代码

ubuntu使用whisper和funASR-语者分离-二值化,ubuntu,whisper,linux

三、安装使用funASR

1 安装

官网

1.1 安装 Conda(可选)

wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
sh Miniconda3-latest-Linux-x86_64.sh
source ~/.bashrc
conda create -n funasr python=3.8
conda activate funasr

1.2 安装 Pytorch(版本 >= 1.11.0)

pip3 install torch torchaudio

如果您的环境中存在CUDA,您应该安装与CUDA匹配的版本的pytorch。匹配列表可以在docs中找到。

1.3 安装funASR

从 pip 安装

pip3 install -U funasr
# 对于中国的用户,您可以使用以下命令进行安装:
# pip3 install -U funasr -i https://mirror.sjtu.edu.cn/pypi/web/simple

或者从源码安装funASR

git clone https://github.com/alibaba/FunASR.git && cd FunASR
pip3 install -e ./

1.4 安装 modelscope(可选)

如果您想使用 ModelScope 中的预训练模型,您应该安装 modelscope:

pip3 install -U modelscope
# 对于中国的用户,您可以使用以下命令进行安装:
# pip3 install -U modelscope -i https://mirror.sjtu.edu.cn/pypi/web/simple

1.5 如何从本地模型路径推断(可选)

通过 modelscope-sdk 将模型下载到本地目录

from modelscope.hub.snapshot_download import snapshot_download

local_dir_root = "./models_from_modelscope"
model_dir = snapshot_download('damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch', cache_dir=local_dir_root)

或者通过 git lfs 将模型下载到本地目录

git lfs install
# git clone https://www.modelscope.cn/<namespace>/<model-name>.git
git clone https://www.modelscope.cn/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch.git

使用本地模型路径进行推断

local_dir_root = "./models_from_modelscope/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch"
inference_pipeline = pipeline(
    task=Tasks.auto_speech_recognition,
    model=local_dir_root,
)

2 使用funASR

2.1 使用funASR

from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

inference_pipeline = pipeline(
    task=Tasks.auto_speech_recognition,
    model='damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch',
    model_revision="v1.2.4")

rec_result = inference_pipeline(audio_in='1001.wav')

print(rec_result['sentences'])

with open('result.txt', 'w', encoding='utf-8') as f:
    print(rec_result, file=f)

print(rec_result)

ubuntu使用whisper和funASR-语者分离-二值化,ubuntu,whisper,linux

2.2 使用 pyannote.audio 进行语者分离

第一步:安装依赖
pip install pyannote.audio
第二步:创建key

https://huggingface.co/settings/tokens
ubuntu使用whisper和funASR-语者分离-二值化,ubuntu,whisper,linux

第三步:测试pyannote.audio

from pyannote.audio import Pipeline
pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization", use_auth_token="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")

# send pipeline to GPU (when available)
import torch
pipeline.to(torch.device("cuda"))

# apply pretrained pipeline
diarization = pipeline("1002.wav")
print(diarization)
# print the result
for turn, _, speaker in diarization.itertracks(yield_label=True):
    print(f"start={turn.start:.1f}s stop={turn.end:.1f}s speaker_{speaker}")
# start=0.2s stop=1.5s speaker_0
# start=1.8s stop=3.9s speaker_1
# start=4.2s stop=5.7s speaker_0
# ...

ubuntu使用whisper和funASR-语者分离-二值化,ubuntu,whisper,linux

2.3 funAS整合pyannote.audio

1.1编写算法
from pyannote.core import Segment, Annotation, Timeline


def get_text_with_timestamp(transcribe_res):
    timestamp_texts = []
    for item in transcribe_res['segments']:
        start = item['start']
        end = item['end']
        text = item['text']
        timestamp_texts.append((Segment(start, end), text))
        
    print(timestamp_texts)
    return timestamp_texts


def get_text_with_timestampFun(transcribe_res):

    print(transcribe_res['sentences'])
    timestamp_texts = []
    for item in transcribe_res['sentences']:
        start = item['start']/1000.0
        end = item['end']/1000.0
        text = item['text']
        timestamp_texts.append((Segment(start, end), text))
    return timestamp_texts



def add_speaker_info_to_text(timestamp_texts, ann):
    spk_text = []
    for seg, text in timestamp_texts:
        #这行代码的作用是在给定的时间段 seg 中根据说话人分离结果 ann 获取出现次数最多的说话人。
        spk = ann.crop(seg).argmax()
        spk_text.append((seg, spk, text))
    return spk_text


def merge_cache(text_cache):
    sentence = ''.join([item[-1] for item in text_cache])
    spk = text_cache[0][1]
    start = text_cache[0][0].start
    end = text_cache[-1][0].end
    return Segment(start, end), spk, sentence


PUNC_SENT_END = ['.', '?', '!', '。', '?', '!']


def merge_sentence(spk_text):
    merged_spk_text = []
    pre_spk = None
    text_cache = []
    for seg, spk, text in spk_text:
        if spk != pre_spk and pre_spk is not None and len(text_cache) > 0:
            merged_spk_text.append(merge_cache(text_cache))
            text_cache = [(seg, spk, text)]
            pre_spk = spk

        elif text[-1] in PUNC_SENT_END:
            text_cache.append((seg, spk, text))
            merged_spk_text.append(merge_cache(text_cache))
            text_cache = []
            pre_spk = spk
        else:
            text_cache.append((seg, spk, text))
            pre_spk = spk
    if len(text_cache) > 0:
        merged_spk_text.append(merge_cache(text_cache))
    return merged_spk_text


def diarize_text(transcribe_res, diarization_result):
    timestamp_texts = get_text_with_timestampFun(transcribe_res)
    spk_text = add_speaker_info_to_text(timestamp_texts, diarization_result)
    res_processed = merge_sentence(spk_text)
    return res_processed


def write_to_txt(spk_sent, file):
    with open(file, 'w') as fp:
        for seg, spk, sentence in spk_sent:
            line = f'{seg.start:.2f} {seg.end:.2f} {spk} {sentence}\n'
            fp.write(line)

1.2调用
import os
import whisper
from pyannote.audio import Pipeline
from pyannote_funasr.utils import diarize_text
import concurrent.futures
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks


# 输出位置
output_dir = '/root/autodl-tmp/pyannote-whisper'


from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

# 语音转文字的模型
inference_pipeline = pipeline(
    task=Tasks.auto_speech_recognition,
    model='damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch',
    model_revision="v1.2.4")

# rec_result = inference_pipeline(audio_in='1002.wav')

# with open('result.txt', 'w', encoding='utf-8') as f:
#     print(rec_result, file=f)

# # print(rec_result)



def process_audio(file_path):
    print("----------1")
    asr_result = inference_pipeline(audio_in=file_path)  
    print("-----------2.2")
    # 语者分离pipeline
    pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization", use_auth_token="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")
    # 使用显卡加速
    import torch
    pipeline.to(torch.device("cuda"))
    #num_speakers 几个说话者,可以不带
    diarization_result = pipeline(file_path, num_speakers=2)
    # 转文字结果
    print(diarization_result)
    # 进行语着分离
    final_result = diarize_text(asr_result, diarization_result)
    print("-----------5")
    # 输出结果
    output_file = os.path.join(output_dir, os.path.basename(file_path)[:-4] + '.txt')
    with open(output_file, 'w') as f:
        for seg, spk, sent in final_result:
            line = f'{seg.start:.2f} {seg.end:.2f} {spk} {sent}\n'
            f.write(line)
            print(line)

# 判断输出文件夹是否存在
if not os.path.exists(output_dir):
    os.makedirs(output_dir)
wave_dir = '/root/autodl-tmp/pyannote-whisper'
# 获取当前目录下所有wav文件名
wav_files = [os.path.join(wave_dir, file) for file in os.listdir(wave_dir) if file.endswith('.wav')]


# 处理每个wav文件
with concurrent.futures.ThreadPoolExecutor() as executor:
    executor.map(process_audio, wav_files)

print('处理完成!')


ubuntu使用whisper和funASR-语者分离-二值化,ubuntu,whisper,linux

3.微调

微调.py文章来源地址https://www.toymoban.com/news/detail-755451.html

import os
from modelscope.metainfo import Trainers
from modelscope.trainers import build_trainer
from modelscope.msdatasets.audio.asr_dataset import ASRDataset

def modelscope_finetune(params):
    if not os.path.exists(params.output_dir):
        os.makedirs(params.output_dir, exist_ok=True)
    # dataset split ["train", "validation"]
    ds_dict = ASRDataset.load(params.data_path, namespace='speech_asr')
    kwargs = dict(
        model=params.model,
        data_dir=ds_dict,
        dataset_type=params.dataset_type,
        work_dir=params.output_dir,
        batch_bins=params.batch_bins,
        max_epoch=params.max_epoch,
        lr=params.lr)
    trainer = build_trainer(Trainers.speech_asr_trainer, default_args=kwargs)
    trainer.train()


if __name__ == '__main__':
    from funasr.utils.modelscope_param import modelscope_args
    params = modelscope_args(model="damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch")
    params.output_dir = "./checkpoint"                      # 模型保存路径
    params.data_path = "speech_asr_aishell1_trainsets"      # 数据路径,可以为modelscope中已上传数据,也可以是本地数据
    params.dataset_type = "small"                           # 小数据量设置small,若数据量大于1000小时,请使用large
    params.batch_bins = 2000                                # batch size,如果dataset_type="small",batch_bins单位为fbank特征帧数,如果dataset_type="large",batch_bins单位为毫秒,
    params.max_epoch = 50                                   # 最大训练轮数
    params.lr = 0.00005                                     # 设置学习率
    
    modelscope_finetune(params)

到了这里,关于ubuntu使用whisper和funASR-语者分离-二值化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#使用OpenCv(OpenCVSharp)图像局部二值化处理实例

      本文实例演示C#语言中如何使用OpenCv(OpenCVSharp)对图像进行局部二值化处理。 目录 图像二值化原理 局部二值化 自适应阈值 实例 效果

    2024年02月13日
    浏览(50)
  • 图像二值化(一)

      继《图像灰度处理》后,我们继续讨论图像处理的其他基本操作——图像二值化处理。   图像二值化是将像素点的灰度值设为0或255,使图像呈现明显的黑白效果。二值化之前需要把图像进行灰度处理。图像选用的是最近很火的ChatGPT标志。   Threshold为全局阈值,但是

    2024年02月07日
    浏览(36)
  • 图像二值化算法

    图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。二值图像每个像素只有两种取值:要么纯黑,要么纯白。进行二值化有多种方式,其中最常用的就是采用阈值法(Thresholding)进行二值化。 根据阈值

    2024年02月06日
    浏览(48)
  • 图像二值化

    图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。 要得到二值化图像,首先要把图像灰度化,然后将256个亮度等级的灰度图像通过适当的阈值选取而

    2024年02月05日
    浏览(63)
  • opencv二值化详解

      大家好,今天来跟大家讲讲 opencv二值化。 先从一个比较经典的方法开始讲解,看 opencv官方文档: 二值化(binary)的定义:在一个输入图像中,将其一个像素点设置为0,将其两个像素点设置为1。 二值化可以使图像中的每个像素值都被指定为0或1。在二值化之前,每个像素都

    2024年02月07日
    浏览(35)
  • 009 OpenCV 二值化 threshold

    本文使用环境为: Windows10 Python 3.9.17 opencv-python 4.8.0.74 在机器视觉应用中,OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理,以此大幅降低图像的数据量,从而突显出目标的轮廓。 具体来说,函数threshold可以将图像上的像素根据阈值

    2024年02月05日
    浏览(45)
  • Python实现图片二值化

    图像二值化就是将图像上的像素点的“灰度值”设置为[0, 0, 0]或[255, 255, 255],即要么纯黑,要么纯白。 通过二值化,能更好地分析物体的形状和轮廓。 二值化的实现一般有: 全局阈值法、自适应阈值法、OTSU二值化等 (1)全局阈值法 就是选定一个全局阈值,大于这个值的色

    2024年02月11日
    浏览(53)
  • OpenCV(八):图像二值化

    目录 1.固定值二值化 2.自适应阈值二值化 3.Android JNI完整代码 1.固定值二值化 固定阈值二值化是OpenCV中一种简单而常用的图像处理技术,用于将图像转换为二值图像。在固定阈值二值化中,像素值根据一个预定义的阈值进行分类,大于阈值的像素被设置为白色,而小于或等于

    2024年02月10日
    浏览(49)
  • 图像像素操作与二值化

    目录 1、图像像素比较 1.1 比较函数  1.2 图像最大值最小值寻找 2、图像像素逻辑操作 3、图像二值化 3.1 固定阈值二值化 3.2 自适应阈值二值化 1.1 比较函数  1.2 图像最大值最小值寻找         3.1 固定阈值二值化     3.2 自适应阈值二值化  

    2024年02月12日
    浏览(35)
  • opencv(20) 图像阈值(二值化)

    二值化核心思想,设阈值,大于阈值的为0(黑色)或 255(白色),使图像称为黑白图。 阈值可固定,也可以自适应阈值。 自适应阈值一般为一点像素与这点为中序的区域像素平均值或者高斯分布加权和的比较,其中可以设置一个差值也可以不设置。 图像的阈值化旨在提取

    2024年02月02日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包