使用 Resemblyzer 进行电话交谈的说话人分类

如何解决使用 Resemblyzer 进行电话交谈的说话人分类

我有电话交谈的录音, 我使用 Resemblyzer 它基于扬声器对音频进行聚类。输出labelling,它基本上是一个字典,说明哪个人在(speaker_label,start_time,end_time)时说话

我需要明智地将音频分段输出。问题是标记时间与原始音频时间不同。我已经为此工作了一个星期,请不要关闭问题。

from resemblyzer import preprocess_wav,VoiceEncoder
from pathlib import Path
import pickle
import scipy.io.wavfile
from spectralcluster import SpectralClusterer

audio_file_path = 'C:/Users/...'
wav_fpath = Path(audio_file_path)

wav = preprocess_wav(wav_fpath)
encoder = VoiceEncoder("cpu")
_,cont_embeds,wav_splits = encoder.embed_utterance(wav,return_partials=True,rate=16)
print(cont_embeds.shape)            

clusterer = SpectralClusterer(
    min_clusters=2,max_clusters=100,p_percentile=0.90,gaussian_blur_sigma=1)

labels = clusterer.predict(cont_embeds)

def create_labelling(labels,wav_splits):
    from resemblyzer.audio import sampling_rate
    times = [((s.start + s.stop) / 2) / sampling_rate for s in wav_splits]
    labelling = []
    start_time = 0

    for i,time in enumerate(times):
        if i > 0 and labels[i] != labels[i - 1]:
            temp = [str(labels[i - 1]),time]
            labelling.append(tuple(temp))
            start_time = time
        if i == len(times) - 1:
            temp = [str(labels[i]),time]
            labelling.append(tuple(temp))

    return labelling

labelling = create_labelling(labels,wav_splits)

解决方法

这段代码很有帮助: 首先添加一个包含时间戳的 time_stamps.txt 文件以修剪音频(time_stamps.txt 文件应以逗号分隔)。 然后添加音频文件名及其格式,它就可以完成工作。我在 github 上找到了这个,https://github.com/raotnameh/Trim_audio

import numpy as np
    from pydub import AudioSegment
    
    
    def trim(start,end,file_name,format_,i):
        t1 = start
        t2 = end
        t1 = t1 * 1000 #Works in milliseconds
        t2 = t2 * 1000
        newAudio = AudioSegment.from_wav(file_name + "." +format_)
        newAudio = newAudio[t1:t2]
        newAudio.export(file_name+ "_" + str(i) + '.wav',format=format_) #Exports to a wav file in the current path.
    
    if __name__ == '__main__':
    
        with open("time_stamps.txt","rb") as file:
            contents = list(map(float,file.read().decode("utf-8").split(',').strip()))
    
        file_name = "male"
        format_ = "wav"
        for i in range(len(contents)):
            try :trim(contents[i],contents[i+1],i)
            except : pass

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?