基于Pyannote的中文声纹识别

声纹识别是一种生物识别技术,也称为speaker recognization,其中主要包含语音分割以及声纹相似度对比。该技术通过将声信号转换成电信号,再使用人工智能技术进行识别,不同的任务和应用会使用不同的声纹识别技术,例如会议纪要、图文转播、刑案侦察等。

环境准备

pyannote-audio是,github地址为https://github.com/pyannote/pyannote-audio

我使用的是pyannote-audio 3.1.0 + wespeaker-voxceleb-resnet34-LM + segmentation-3.0

项目是一直在持续更新的,要根据自己的实际情况选择正确的模型和环境

其中依赖包要求如下:

asteroid-filterbanks >=0.4
einops >=0.6.0
huggingface_hub >= 0.13.0
lightning >= 2.0.1
omegaconf >=2.1,<3.0
pyannote.core >= 5.0.0
pyannote.database >= 5.0.1
pyannote.metrics >= 3.2
pyannote.pipeline >= 3.0.1
pytorch_metric_learning >= 2.1.0
rich >= 12.0.0
semver >= 3.0.0
soundfile >= 0.12.1
speechbrain >= 0.5.14
tensorboardX >= 2.6
torch >= 2.0.0
torch_audiomentations >= 0.11.0
torchaudio >= 2.0.0
torchmetrics >= 0.11.0

我使用的是python 3.8,在环境准备时,其实我只执行下面一个命令

# 其他依赖会自动下载
pip install pyannote.audio==3.1.0

语音数据准备

日常需要分析的语音往往是将视频中的,且语音模型都对其输入有一定的数据要求,例如采样率为16000,单声道等。

视频是在Youtube上下载的小猪佩奇第一季第九集

使用ffmpeg工具将视频文件中语音提取、加工

# 将音频提取出来,指定采样率为16000,单声道
ffmpeg -y -i demo.mp4 -vn -ss 00:00:00 -t 300 -ar 16000 -ac 1 -f wav audio_all.wav

# 提取一段小猪佩奇的声音,时长为5秒
ffmpeg -y -i demo.mp4 -vn -ss 00:00:02 -t 5 -ar 16000 -ac 1 -f wav audio_peppa_1.wav
# 再次提取一段小猪佩奇的声音,时长为5秒
ffmpeg -y -i demo.mp4 -vn -ss 00:00:07 -t 3 -ar 16000 -ac 1 -f wav audio_peppa_2.wav

# 提取一段旁白的声音,时长为3秒
ffmpeg -y -i p_1_9.mp4 -vn -ss 00:00:23 -t 3 -ar 16000 -ac 1 -f wav audio_aside

在这里插入图片描述
若服务器上未安装ffmpeg,可通过以下命令获取

# ubuntu
sudo apt install ffmpeg
# centos
sudo yum install ffmpeg

Embedding

将语音文件进行向量化,转换为1x1xD的向量,然后使用计算distance的方式描述不同语音之间的相似度(声纹),以此来识别说话人。

from pyannote.audio import Model
# 初始化模型
model = Model.from_pretrained("pyannote/wespeaker-voxceleb-resnet34-LM")

from pyannote.audio import Inference
# 使用模型将语音文件转换为一个array
inference = Inference(model, window="whole")
embedding_1 = inference("audio_peppa_1.wav")
embedding_2 = inference("audio_peppa_2.wav")
embedding_3 = inference("audio_aside.wav")

from scipy.spatial.distance import cdist
# 获取相似度
distance_sim = cdist(embedding_1 , embedding_2 , metric="cosine")[0,0]
distance_not = cdist(embedding_1 , embedding_3 , metric="cosine")[0,0]

print("Distance audio_peppa_1 between audio_peppa_2: " + str(distance1))
print("Distance audio_peppa_1 between audio_aside: " + str(distance2))

将多种语音的对比结果如下,可以明显看出,不同声音的声纹差距较大
在这里插入图片描述
pyannote中内置了将distance转换为similarity的方式,通过阈值(默认为0.25)直接判断是否为同一个speaker

Segmentation

以上的声纹对比是我们在听过语音以后手动将语音分割成多个wav文件,再将每个语音文件进行对比。

实际应用中,一个语音存在多人对话、同时说话以及语音静默等情况,就要使用另外一个模型将一个长语音分割为多个segmentation。
多人对话时的场景
此处使用segmentation-3.0进行语音的处理,注意该模型仅适配pyannote.audio 3.0以上的版本。

检测语音文件中active和overlapped的speech region,需要设置有效和无效的最小时长。

from pyannote.audio import Model
# 初始化模型
model = Model.from_pretrained("/home/pyannote-audio/tools/segmentation/pytorch_model.bin")

# 语音活动检测
from pyannote.audio.pipelines import VoiceActivityDetection
pipeline = VoiceActivityDetection(segmentation=model)

# 语音重叠检测
# from pyannote.audio.pipelines import OverlappedSpeechDetection
# pipeline = OverlappedSpeechDetection(segmentation=model)

# 设置参数
HYPER_PARAMETERS = {
  # remove speech regions shorter than that many seconds.
  "min_duration_on": 0.0,
  # fill non-speech regions shorter than that many seconds.
  "min_duration_off": 0.0
}
pipeline.instantiate(HYPER_PARAMETERS)
# 语音活动检测
vad = pipeline("audio_all.wav")
# 语音重叠检测
# osd = pipeline("audio_all.wav")

语音活动检测
语音重叠检测

此处可以看到我再调用模型时不再使用从huggingface上拉取,而是手动下载本地目录后再调用,方便管理,对于不能直接使用huggingface的同学也可以采用这种方法。
在这里插入图片描述

Diarization

结合以上两种方式,最终实现声纹识别即speaker recognization,该部分需要同时使用以上两种模型,代码示例如下

from pyannote.audio import Pipeline
# 读取配置文件
pipeline = Pipeline.from_pretrained("config.yaml")

# 使用GPU,没有的可以注释掉以下2行
import torch
pipeline.to(torch.device("cuda"))

# 声纹识别
diarization = pipeline("audio_all.wav")

# 输出结果
for turn, _, speaker in diarization.itertracks(yield_label=True):
    print(f"start={turn.start:.1f}s stop={turn.end:.1f}s speaker_{speaker}")

其中配置文件其实就是以上2个模型的相关信息,详细如下:

version: 3.1.0

pipeline:
  name: pyannote.audio.pipelines.SpeakerDiarization
  params:
    clustering: AgglomerativeClustering
    embedding: /home/pyannote-audio/tools/embedding/pytorch_model.bin
    embedding_batch_size: 32
    embedding_exclude_overlap: true
    segmentation: /home/pyannote-audio/tools/segmentation/pytorch_model.bin
    segmentation_batch_size: 32

params:
  clustering:
    method: centroid
    min_cluster_size: 12
    threshold: 0.7045654963945799
  segmentation:
    min_duration_off: 0.0

运行效果如下所示,可以看出来整体效果还是非常好的。
在这里插入图片描述

总结

以上做的一些目前都只是一些基于声纹识别的小实验,首先模型配置没有限制导致分割的segmentation还是偏多,离真正的实现日常工具化、商业化还需要一些调整,另外官方本身也提供模型微调训练的demo,感兴趣的可以去看一下。

下一篇文章,博主计划将语音识别和声纹识别结合,能够实现一个能够独立完成图文转播的完整工具。

参考链接

https://github.com/pyannote/pyannote-audio/tree/3.1.0

https://huggingface.co/pyannote/segmentation-3.0

https://huggingface.co/pyannote/wespeaker-voxceleb-resnet34-LM

pyannote/wespeaker-voxceleb-resnet34-LM · Hugging Face

### 安装和配置 Pyannote on 树莓派 为了在树莓派上成功安装并使用Pyannote,需要完成几个关键步骤。这些步骤涉及设置必要的依赖项以及具体安装过程。 #### 准备工作环境 由于运行特定软件包通常需要Java环境支持,在开始之前确认已经安装了JRE[^1]: ```bash sudo apt update && sudo apt install default-jre -y ``` 接着,考虑到Pyannote是一个基于Python的库,确保已更新到最新版pip工具,并安装虚拟环境来管理项目依赖关系: ```bash sudo pip3 install --upgrade pip virtualenv virtualenv venv source venv/bin/activate ``` #### 安装 Pyannote 及其依赖项 一旦准备工作完成后,就可以着手于安装Pyannote本身及其所需的额外组件。对于某些模型来说,可能还需要安装CUDA驱动程序以便利用GPU加速;然而,鉴于树莓派并不具备NVIDIA GPU硬件,因此这里只需关注CPU版本的支持即可。 通过pip可以直接安装Pyannote Audio: ```bash pip install pyannote-audio ``` 值得注意的是,部分功能模块可能会依赖OpenCV等视觉处理库。如果打算应用此类特性,则应提前按照指导说明安装好对应的库文件[^2]: ```bash pip install opencv-python-headless ``` #### 使用 Pyannote 进行音频分析 有了上述准备之后,现在可以在本地环境中加载预训练好的模型来进行简单的语音活动检测(SAD),说话人日记化(Diarization)或其他任务。下面给出一段用于执行说话人分割的小例子: ```python from pyannote.audio import Pipeline pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization") diarization = pipeline("/path/to/audio.wav") for turn, _, speaker in diarization.itertracks(yield_label=True): print(f"Speaker {speaker}: from {turn.start:.1f}s to {turn.end:.1f}s") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值