whisper深入-语者分离

news2024/11/26 5:43:26

文章目录

  • 学习目标:如何使用whisper
  • 学习内容一:whisper 转文字
    • 1.1 使用whisper.load_model()方法下载,加载
    • 1.2 使用实例对文件进行转录
    • 1.3 实战
  • 学习内容二:语者分离(pyannote.audio)pyannote.audio是huggingface开源音色包
    • 第一步:安装依赖
    • 第二步:创建key
    • 第三步:测试pyannote.audio
  • 学习内容三:整合

学习目标:如何使用whisper


学习内容一:whisper 转文字

在这里插入图片描述

1.1 使用whisper.load_model()方法下载,加载

model=whisper.load_model(参数)
  • name 需要加载的模型,如上图
  • device:默认有个方法,有显存使用显存,没有使用cpu
  • download_root:下载的根目录,默认使用~/.cache/whisper
  • in_memory: 是否将模型权重预加载到主机内存中

返回值
model : Whisper
Whisper语音识别模型实例

def load_model(
    name: str,
    device: Optional[Union[str, torch.device]] = None,
    download_root: str = None,
    in_memory: bool = False,
) -> Whisper:
    """
    Load a Whisper ASR model

    Parameters
    ----------
    name : str
        one of the official model names listed by `whisper.available_models()`, or
        path to a model checkpoint containing the model dimensions and the model state_dict.
    device : Union[str, torch.device]
        the PyTorch device to put the model into
    download_root: str
        path to download the model files; by default, it uses "~/.cache/whisper"
    in_memory: bool
        whether to preload the model weights into host memory

    Returns
    -------
    model : Whisper
        The Whisper ASR model instance
    """

    if device is None:
        device = "cuda" if torch.cuda.is_available() else "cpu"
    if download_root is None:
        default = os.path.join(os.path.expanduser("~"), ".cache")
        download_root = os.path.join(os.getenv("XDG_CACHE_HOME", default), "whisper")

    if name in _MODELS:
        checkpoint_file = _download(_MODELS[name], download_root, in_memory)
        alignment_heads = _ALIGNMENT_HEADS[name]
    elif os.path.isfile(name):
        checkpoint_file = open(name, "rb").read() if in_memory else name
        alignment_heads = None
    else:
        raise RuntimeError(
            f"Model {name} not found; available models = {available_models()}"
        )

    with (
        io.BytesIO(checkpoint_file) if in_memory else open(checkpoint_file, "rb")
    ) as fp:
        checkpoint = torch.load(fp, map_location=device)
    del checkpoint_file

    dims = ModelDimensions(**checkpoint["dims"])
    model = Whisper(dims)
    model.load_state_dict(checkpoint["model_state_dict"])

    if alignment_heads is not None:
        model.set_alignment_heads(alignment_heads)

    return model.to(device)

1.2 使用实例对文件进行转录

result = model.transcribe(file_path)

def transcribe(
    model: "Whisper",
    audio: Union[str, np.ndarray, torch.Tensor],
    *,
    verbose: Optional[bool] = None,
    temperature: Union[float, Tuple[float, ...]] = (0.0, 0.2, 0.4, 0.6, 0.8, 1.0),
    compression_ratio_threshold: Optional[float] = 2.4,
    logprob_threshold: Optional[float] = -1.0,
    no_speech_threshold: Optional[float] = 0.6,
    condition_on_previous_text: bool = True,
    initial_prompt: Optional[str] = None,
    word_timestamps: bool = False,
    prepend_punctuations: str = "\"'“¿([{-",
    append_punctuations: str = "\"'.。,,!!??::”)]}、",
    **decode_options,
):
    """
    将音频转换为文本。

    参数:
    - model: Whisper模型
    - audio: 音频文件路径、NumPy数组或PyTorch张量
    - verbose: 是否打印详细信息,默认为None
    - temperature: 温度参数,默认为(0.0, 0.2, 0.4, 0.6, 0.8, 1.0)
    - compression_ratio_threshold: 压缩比阈值,默认为2.4
    - logprob_threshold: 对数概率阈值,默认为-1.0
    - no_speech_threshold: 无语音信号阈值,默认为0.6
    - condition_on_previous_text: 是否根据先前的文本进行解码,默认为True
    - initial_prompt: 初始提示,默认为None
    - word_timestamps: 是否返回单词时间戳,默认为False
    - prepend_punctuations: 前缀标点符号,默认为"\"'“¿([{-"
    - append_punctuations: 后缀标点符号,默认为"\"'.。,,!!??::”)]}、"
    - **decode_options: 其他解码选项

    返回:
    - 转录得到的文本
    """

1.3 实战

建议load_model添加参数

  • download_root:下载的根目录,默认使用~/.cache/whisper
    transcribe方法添加参数
  • word_timestamps=True
import whisper
import arrow

# 定义模型、音频地址、录音开始时间
def excute(model_name,file_path,start_time):
    model = whisper.load_model(model_name)
    result = model.transcribe(file_path,word_timestamps=True)
    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("large","/root/autodl-tmp/no/test.mp3","2022-10-24 16:23:00")


在这里插入图片描述

学习内容二:语者分离(pyannote.audio)pyannote.audio是huggingface开源音色包

第一步:安装依赖

pip install pyannote.audio

第二步:创建key

https://huggingface.co/settings/tokens
在这里插入图片描述

第三步:测试pyannote.audio

  • 创建实例:Pipeline.from_pretrained(参数)
  • 使用GPU加速:import torch # 导入torch库
    pipeline.to(torch.device(“cuda”))
  • 实例转化音频pipeline(“test.wav”)

from_pretrained(参数)

  • cache_dir:路径或str,可选模型缓存目录的路径。默认/pyannote"当未设置时。

pipeline(参数)

  • file_path:录音文件
  • num_speakers:几个说话者,可以不带

from pyannote.audio import Pipeline
pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization@2.1", use_auth_token="申请的key")

# send pipeline to GPU (when available)
import torch
device='cuda' if torch.cuda.is_available() else 'cpu'
pipeline.to(torch.device(device))

# apply pretrained pipeline
diarization = pipeline("test.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
# ...

学习内容三:整合

这里要借助一个开源代码,用于整合以上两种产生的结果

报错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

在这里插入图片描述
这个错误可能是由于缺少或不正确安装了所需的 sndfile 库。sndfile 是一个用于处理音频文件的库,它提供了多种格式的读写支持。

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

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

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

在这里插入图片描述

import os
import whisper
from pyannote.audio import Pipeline
from pyannote_whisper.utils import diarize_text
import concurrent.futures
import subprocess
import torch
print("正在加载声纹模型")
pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization@2.1",use_auth_token="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")
output_dir = '/root/autodl-tmp/no/out'
print("正在whisper模型")
model = whisper.load_model("large", device="cuda")

# MP3转化为wav
def convert_to_wav(path):
    new_path = ''
    if path[-3:] != 'wav':
        new_path = '.'.join(path.split('.')[:-1]) + '.wav'
        try:
            subprocess.call(['ffmpeg', '-i', path, new_path, '-y', '-an'])
        except:
            return path, 'Error: Could not convert file to .wav'
    else:
        new_path = ''
    return new_path, None


def process_audio(file_path):
    file_path, retmsg = convert_to_wav(file_path)
    print(f"===={file_path}=======")
    asr_result = model.transcribe(file_path, initial_prompt="语音转换")
    pipeline.to(torch.device('cuda'))
    diarization_result = pipeline(file_path, num_speakers=2)
    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/no'

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

# 处理每个wav文件
# with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
#     executor.map(process_audio, wav_files)
for wav_file in wav_files:
    process_audio(wav_file)
print('处理完成!')

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1325340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常用的 JSON XML INI CSV 数据格式详解

目录 0 引言1 JSON1.1 数据格式1.2 应用场景 2 XML2.1 数据格式2.2 应用场景 3 INI3.1 数据格式3.2 应用场景 4 CSV4.1 数据格式4.2 应用场景 5 总结 🙋‍♂️ 作者:海码007📜 专栏:C专栏💥 标题:常用的 XM…

【数据结构和算法】 K 和数对的最大数目

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:双指针排序 三、代码 3.1 方法一:双指针排序 3.2 方法二&#xff1…

制造行业定制软件解决方案——工业信息采集平台

摘要:针对目前企业在线检测数据信号种类繁多,缺乏统一监控人员和及时处置措施等问题。蓝鹏测控开发针对企业工业生产的在线数据的集中采集分析平台,通过该工业信息采集平台可将企业日常各种仪表设备能够得到数据进行集中分析处理存储&#xf…

mysql部署 --(docker)

先查找MySQL 镜像 Docker search mysql ; 拉取mysql镜像,默认拉取最新的; 创建mysql容器,-p 代表端口映射,格式为 宿主机端口:容器运行端口 -e 代表添加环境变量,MYSQL_ROOT_PASSWORD是root用户…

【K8s】#1使用kuboard-spray安装K8s集群

文章目录 搭建k8s集群1.推荐配置1.1.服务器配置1.2.软件版本 2.使用Kuboard-Spray安装k8s集群2.1.配置要求2.2.操作系统兼容性2.3.安装 Kuboard-Spray2.4.加载离线资源包2.5.规划并安装集群2.6.安装成功2.7.访问集群 3.涉及的命令3.1.linux 4.问题汇总Q1:启动离线集…

一个正则快速找到在ES中使用profile的时产生慢查询的分片

在es中使用profile分析慢查询的时候,往往因为分片过多,或者因为查询条件太复杂,分析的结果几十万行。在kibana上点半天,也找不到一个耗时长的分片。 kibana上可以通过正则来匹配。其实我们只需要匹配到耗时大于10秒的请求。 检索语…

HackTheBox - Medium - Windows - Aero

Aero 这个机器利用了今年比较新的cve,关于windows11的漏洞,类似于lnk、scf,但这个危害更高,通过易受攻击的windows11 利用theme、msstyles来实现RCE. Aero 是一台中等难度的 Windows 机器,最近有两个 CVE:…

argmin与argmax

argmin 是一个数学术语,用于表示一个函数在其定义域中取得最小值的参数值(自变量的值),而不是最小值本身。 具体来说,argmin 表示函数的自变量(通常是一个实数或向量),当输入到该函数…

文件传输软件SecureFX mac支持多种协议

SecureFX mac是一款文件传输客户端,可在 Mac 操作系统上使用。它由 VanDyke Software 公司开发,旨在为用户提供安全、可靠、高效的文件传输服务。 SecureFX 支持多种协议,包括 SFTP、SCP、FTP、FTP over SSL/TLS 和 HTTP/S。它使用强大的加密…

java并发-ConcurrentHashMap 在Java7 和 8 的区别

文章目录 1.Java 7 版本的 ConcurrentHashMap2.Java 8 版本的 ConcurrentHashMap3.分析 Java 8 版本的 ConcurrentHashMap 的重要源码3.1.Node 节点3.2.put 方法源码分析3.3.get 方法源码分析 4.对比 Java7 和 Java8 的异同和优缺点4.1.并发度4.2.保证并发安全的原理4.3.遇到 H…

Spring Boot构建项目常用注解

忙着去耍帅,后期补充完整.....................................

文件上传 [SWPUCTF 2021 新生赛]easyupload1.0

打开题目 上传文件格式为jpg类型的一句话木马上去 木马内容为 bp抓包把文件后缀改为php 可以看到上传成功且给了我们上传路径,访问一下 访问成功 我们用蚁剑连接一下,但是找到的是假的flag 那我们用hackbar(也可以用bp) 执行命…

法线贴图实现衣服上皱褶特效

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 法线贴图在3D建模中扮演着重要的角色,它通过模拟表面的微…

S7-200PLC与MCGS昆仑通泰触摸屏进行串口通信的具体方法示例

S7-200PLC与MCGS昆仑通泰触摸屏进行串口通信的具体方法示例 PLC:CPU 224XP CN 触摸屏:TPC1570GI 通信电缆的连接: 触摸屏7+对应PLC 3+,触摸屏8-对应PLC 8- 触摸屏和PLC的硬件连接如下图所示: PLC一侧的组态设置: 第一步:(在编程软件系统块中打开通讯端口设置) 第二步:…

《数据分析-JiMuReport》积木报表详细入门教程

积木报表详细入门教程 一、JimuReport部署入门介绍 积木报表可以通过源码部署、SpringBoot集成、Docker部署以及各种成熟框架部署,具体可查看积木官方文档 当前采用源码部署,首先下载Jimureport-example-1.5.6 1 jimureport-example目录查看 使用ID…

H5聊天系统聊天网站源码 群聊源码 无限建群创群

H5聊天系统聊天网站源码 群聊源码 无限建群创群 1.支持自助建群 管理群 修改群资料 2.支持自动登录 登陆成功可自助修改资料 3.后台可查看群组聊天消息记录 4.支持表情 动态表情 图片发布 5.支持消息语音提醒 测试环境:NginxMySQL5.6PHP5.6 1.将压缩包解压到…

阿赵UE学习笔记——3、常用界面窗口

阿赵UE学习笔记目录 大家好,我是阿赵。继续学习虚幻引擎,这次介绍的是编辑器的常用界面窗口。 一、视口 这个视口的概念,可以体现出UE对于多屏幕同时显示是多么的友好。我们开发游戏的时候,一般都会同一台电脑用2个或者以上显示器…

【【迭代七次的CORDIC算法-Verilog实现】】

迭代七次的CORDIC算法-Verilog实现求解正弦余弦函数 COEDIC.v module CORDIC #(parameter DATA_WIDTH 4d8 , // we set data widthparameter PIPELINE 4d8)(input clk ,input …

命令执行 [SWPUCTF 2021 新生赛]babyrce

打开题目 我们看到题目说cookie值admin等于1时,才能包含文件 bp修改一下得到 访问rasalghul.php,得到 题目说如果我们get传入一个url且不为空值,就将我们get姿势传入的url的值赋值给ip 然后用正则过滤了 / /,如果ip的值没有 / …