机器是如何辨别声音的?一文带你入门声纹识别

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

前言

在实际生产环境中,使用机器进行物体的辨别已非常普遍,如利用机器识别水果、利用机器辨别车牌以及人脸识别等,高精度的识别准确率为实际生活带来了极大的便利。然而,上述的识别算法都是对图片进行识别,无非就是对足够大的数据集进行特征提取之后进行神经网络的训练,从而得到一个鲁棒性较强的模型。那么,机器是如何辨别声音的?

声纹识别简述

声纹识别,也叫做说话人识别。是一种通过声音辨别说话人的技术,其应用主要包括说话人识别、说话人验证以及说话人分割聚类。

  • 说话人识别:字面意思,识别输入的音频属于音频库中的哪个人(1:N),即你是谁?
  • 说话人验证:验证输入音频与待验证说话人是不是同一个人(1:1)。
  • 说话人分割聚类:一段语音中包含多个说话人,将属于同一个说话人的音频聚类,主要应用如医患对话。

声音在机器中是什么样的?机器是如何转换声音的?

实际上,声音在机器中以文件形式存在(废话),不同的文件有不同的编码格式,如wav文件:

wav.png

那么机器是如何转换声音的呢?在机器中,声音实际上就是信号,可以通过read函数来获取信号的具体内容,如在python中,使用:

audio, sample = soundfile.read(file_path)
复制代码

其中audio就是一个列表,里面都是数字,数字的含义代表振幅,sample代表采样率,将列表的长度/采样率就是语音的长度。像采样频率,位深等再详细的就不介绍了。

声音的特征?

声音中存在很多特征,如说话人的音色、说话的内容以及语速等,图像可以通过提取特征来获取我们关注的信息,对于声音也是一样,在声纹识别中,通常是将声音信号首先进行特征提取,声音的特征提取主要有FBank以及MFCC等,此处简单介绍Fbank,直接来看一段代码:

import torch
import torchaudio
import soundfile as sf
​
​
full_path = "/disc1/xxx/1麦克风.wav"
audio, sr = sf.read(full_path)
audio = torch.FloatTensor(numpy.stack([audio], axis=0))
Fbank= torchaudio.transforms.MelSpectrogram(sample_rate=16000, n_fft=512, win_length=400, hop_length=160, f_min=20,
                                               f_max=7600, window_fn=torch.hamming_window, n_mels=80)
​
​
# ------------------------------------------------ #
fbank_feature = mel(audio).log()  # 这里只需要这么简单即可
复制代码

将提取出的信息进行可视化:

FBank.png

有什么感受?这不就是图像?

这种感觉就对了,实际上机器处理声音和处理图像原理是一样的,与图像不同的是,对于音频文件首先要先转为一种特殊的图像,之后对这种特殊的图像进行卷积池化等神经网络常用的操作即可。

Embedding

和大多数任务一样,如果想辨别一个人的声音,最关键的还是提取出语音中特定说话人的表示,得到的表示的优劣决定了之后判别的准确性,常用的方法就是模型之后接一个分类层,通过不断的训练得到一个较好的模型,之后将分类层删除保存前面的就是一个合适的模型,此时模型的输出就是我们所需要的embedding。

说话人识别

已经得到了最关键的embedding,那么如何进行说话人识别呢?最常用的方法就是余弦相似度,如果两个embedding属于同一个人,则相似度就越大,反之。通过对比声纹库中的embedding相似度就可以识别这个人和谁最相似,最后设置一个最低阈值就可以。

说话人验证

说话人验证是1:1的,因此只需要比较给定说话人编码和验证音频之间的相似度即可,如果是严格的任务,那么设置一个较大的阈值,如果是普通的任务则设置较小的阈值即可。

说话人分割聚类

说话人分割聚类比较复杂,通常对于一段包含多个说话人的语音,首先会对语音进行VAD检测,之后对语音进行等长度切分,对每段语音进行编码,通过比较两两语音之间的相似度判定是否为说话人改变点,或者直接对所有段语音进行聚类即可。

说话人识别系统流程如下:

model.png

Guess you like

Origin juejin.im/post/7054395794547277837