Диаризация говорящего — это задача определения времени начала и окончания выступления говорящего в аудиофайле. Существует множество облачных сервисов и алгоритмов глубокого обучения, используемых для диаризизации, в этой статье мы построим некоторый график для представления диаризации с помощью 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: