2 个音频文件的相似性检查

问题描述 投票:0回答:1

我想问一个关于语音相似性检查的问题。假设我有 2 个包含相同单词的音频文件,由 2 个不同的扬声器录制,我想验证这 2 个音频文件是否相似,但我不想继续进行语音转文本(因为有些音频文件没有有意义的单词)。

我在预处理音频后提取了 mfccs 向量并应用了 DTW(动态时间扭曲),我得到了相同音频的 0 相似度分数(参考参考),但是当我将其应用于由 录制的 2 个音频文件时2 个不同的说话者我得到了很高的相似度分数(表明他们不相似)。谁能建议我一种解决这个问题的方法?我的方法有什么错误? 这是重新采样信号后的代码:

`from pydub import AudioSegment, silence

# Load the audio file 
audio_file = AudioSegment.from_wav('C://Users//10Rs6//Desktop//testapb.wav')

# Set the minimum length of a non-silent segment
min_silence_len = 100 # in milliseconds

# Set the threshold for detecting silence
silence_thresh = -25 # in dBFS

# Split the audio into non-silent segments
non_silent_segments = silence.split_on_silence(audio_file, 
                                                min_silence_len=min_silence_len, 
                                                silence_thresh=silence_thresh)

# Concatenate the non-silent segments into a new audio file
trimmed_audio = AudioSegment.empty()
for segment in non_silent_segments:
    trimmed_audio += segment

# Export the trimmed audio file
trimmed_audio.export('C://Users//10Rs6//Desktop//trimmed_audio5.wav', format='wav')

def preemphasis(signal, alpha=0.97):
    """
    Applies a pre-emphasis filter on the input signal.

    Parameters:
        signal (array-like): The input signal to filter.
        alpha (float): The pre-emphasis coefficient. Default is 0.97.

    Returns:
        The filtered signal.
    """
    return lfilter([1, -alpha], [1], signal)
pre_emphasised_test=preemphasis(resampled_audio_test)
pre_emphasised_ref=preemphasis(resampled_audio_ref)
normalized_test = librosa.util.normalize(pre_emphasised_test)
normalized_ref=librosa.util.normalize(pre_emphasised_ref)
# extract MFCCs
mfccsT = librosa.feature.mfcc(y=pre_emphasised_test, sr=41100, n_mfcc=13)

# normalize MFCCs
mfccsT = np.mean(mfccsT.T, axis=0)

# print MFCCs vector
print(mfccsT)
mfccsT.shape
# extract MFCCs
mfccsR = librosa.feature.mfcc(y=pre_emphasised_ref, sr=41100, n_mfcc=13)

# normalize MFCCs
mfccsR = np.mean(mfccsR.T, axis=0)

# print MFCCs vector
print(mfccsR)
mfccsR.shape
# assuming your MFCCs are in a variable called mfccs
# reshape to a 2D array
mfccsT_2d = np.reshape(mfccsT, (mfccsT.shape[0], -1))

# normalize the MFCCs
scaler = StandardScaler()
scaler.fit(mfccsT_2d)
normalized_mfccsT_2d = scaler.transform(mfccsT_2d)

# reshape back to the original shape
normalized_mfccsT = np.reshape(normalized_mfccsT_2d, mfccsT.shape)
print(normalized_mfccsT)
# assuming your MFCCs are in a variable called mfccs
# reshape to a 2D array
mfccsR_2d = np.reshape(mfccsR, (mfccsR.shape[0], -1))

# normalize the MFCCs
scaler = StandardScaler()
scaler.fit(mfccsR_2d)
normalized_mfccsR_2d = scaler.transform(mfccsR_2d)

# reshape back to the original shape
normalized_mfccsR = np.reshape(normalized_mfccsR_2d, mfccsR.shape)
print(normalized_mfccsR)
from dtw import dtw

normalized_mfccsT = normalized_mfccsT.reshape(-1, 1)
normalized_mfccsR = normalized_mfccsR.reshape(-1, 1)
from dtw import dtw

# Here, we use L2 norm as the element comparison distance
l2_norm = lambda normalized_mfccsT, normalized_mfccsR: (normalized_mfccsT - normalized_mfccsR) ** 2

dist, cost_matrix, acc_cost_matrix, path = dtw(normalized_mfccsT, normalized_mfccsR, dist=l2_norm)

dist`

谢谢。

python audio similarity speech dtw
1个回答
0
投票

MFCC 值不能很好地表示语音内容相似度,因为仍然存在大量“声学”信息。两个不同的说话者说同一个词将会有很大的不同。或者甚至用两个不同的麦克风或在两个不同的位置录制同一扬声器(尤其是混响)。 这里需要的是一种独立于说话者的表示,该表示对设备/环境/噪声变化具有鲁棒性。一个好的自动语音识别(ASR)系统总是具有这种特性。对于某些系统,可以获得学习的向量表示,而不仅仅是预测的文本序列。

在这样的特征向量序列之上,我们可以创建一个相似性度量。可能首先使用 PCA 之类的投影来降低特征维度。然后可以尝试动态时间扭曲。

Wav2Vec

Wav2Vec是一种自监督语音模型。它通常用作各种语音和非语音音频任务的特征提取器。 Huggingface 转换器库在 Wav2Vec2FeatureExtractor 中有一个很好且易于使用的实现。

异特龙

Allosaurus 是一个经过预训练的通用 phone 识别器。它输出电话的矢量表示,这应该适用于世界上的任何语言,并且可能也适用于非文本语音。

© www.soinside.com 2019 - 2024. All rights reserved.