Диаризация говорящего — это задача определения времени начала и окончания выступления говорящего в аудиофайле. Существует множество облачных сервисов и алгоритмов глубокого обучения, используемых для диаризизации, в этой статье мы построим некоторый график для представления диаризации с помощью pyplot.

Входные данные: аудиофайл с несколькими динамиками и файл npz с метками.

Вывод:график pyplot, как показано выше.

Давайте построим это вместе, давайте сначала загрузим данные и код. "кликните сюда."

Шаг 1:

Прочитайте файлы аудиоданных в папке Data и преобразуйте их в фрейм данных pandas.

import wave
import numpy as np
import os
import pandas as pd

Функция для чтения волновых файлов, эта функция принимает путь к файлу и возвращает его различные свойства.

def getWaveInfo(filePath):
    w = wave.open(filePath,'rb')
    properties = {'channels':w.getnchannels(), 'widthBytes':w.getsampwidth(),
            'Framerate':w.getframerate(), 'frames': w.getnframes(),
            'Duration': w.getnframes() / float(w.getframerate())} 
    w.close()
    return properties

Теперь прочитайте все файлы в папке

folderpath = './data/audio'
fileName,duration,signal,time = [],[],[],[]
for file in os.listdir(folderpath):
    filePath = folderpath + '/' + file
    fileInfo = getWaveInfo(filePath)
    duration.append(fileInfo['Duration'])
    fileFrame = wave.open(filePath,"r")
    fileFrame = fileFrame.readframes(-1)
    file_signal = np.frombuffer(fileFrame,'int32')
    file_time = np.linspace (start=0, stop=len(file_signal)/  fileInfo['Framerate'] ,num=len(file_signal))
    signal.append(file_signal)
    time.append(file_time)
    fileName.append(file)

Шаг 2:

Прочитайте файл npz, этот файл содержит время, в течение которого говорящий говорит. Этот файл может быть сгенерирован любой облачной службой диаризации динамиков или с помощью некоторых алгоритмов машинного обучения.

import numpy as np
import os
folderpath = './data/labels'
train_sequence,train_cluster_id,filePath = [],[],[]
for file in os.listdir(folderpath):
    npzFile = np.load(folderpath + '/' + file)
    train_sequence.append(npzFile['train_sequence'])
    train_cluster_id.append(npzFile['train_cluster_id'])
    filePath.append(folderpath + '/' + file)

Шаг 3.

Добавьте как аудиоданные, так и данные файла npz в фрейм данных.

AudioFileData = pd.DataFrame({'FileName':fileName,'Duration':duration,
                             'Signal':signal,'Time':time , 'Label':train_cluster_id})

Шаг 4:

мы используем pyplot lib для визуализации данных.

import matplotlib.pyplot as plt
from matplotlib.pyplot import figure

Добавьте цвета на график.

colorDics = {0:'#f9fd50',1:'#85ef47',2:'#00bd56',3:'#207dff',4:'#ffe75e',5:'#feb72b',6:'#899857',7:'#527318'}
def setColor(label):
    #print(int(label))
    return colorDics[int(label)]
def getEnd(pointer,label):
    count = 1
    if pointer > len(label)-1:
        return count,pointer
    while pointer < len(label)-1:
        #print(pointer,label[pointer])
        if label[pointer][0] == label[pointer+1][0]:
            count = count+1
            pointer +=1
        else:
            break
        
    return count,pointer

def showGraph2(df):
    for n in range(df.shape[0]):
        pointer = 0
        start = 0
        colors = []
        figure( figsize=(20, 6))
        while pointer < len(df['Label'][n])-1:
            end,pointer = getEnd(pointer,df['Label'][n])
            plotEnd = int(start + end*(len(df['Time'][n])/len(df['Label'][n])))
            #colors.append(setColor(df['label'][n][pointer]))
            #print(start,plotEnd,pointer)
            plt.plot(df['Time'][n][start:plotEnd], df['Signal'][n][start:plotEnd],
                     color = setColor(df['Label'][n][pointer][0]))
            start = plotEnd
            pointer +=1        
        plt.show()

вызвать функцию отображения графика

showGraph2(AudioFileData)

Вывод:

это вывод для приведенного выше кода, вы также можете добавить аудиоплеер к каждому графику, см. мой код git для этого.

Я надеюсь, вам понравится это, если вы столкнетесь с какой-либо проблемой, пожалуйста, дайте мне знать. Я постараюсь помочь вам.

Приятного чтения :simple_smile: