157 lines
6.2 KiB
Python
157 lines
6.2 KiB
Python
import numpy as np
|
|
import pyqtgraph as pg
|
|
from PyQt5 import QtWidgets, QtCore
|
|
from utils.util import get_circle
|
|
|
|
|
|
class WidgetSpeaking(QtWidgets.QWidget):
|
|
def __init__(self, parent=None):
|
|
super(WidgetSpeaking, self).__init__(parent)
|
|
|
|
layout = QtWidgets.QGridLayout()
|
|
|
|
self.measures = QtWidgets.QWidget()
|
|
self.measuresLayout = QtWidgets.QHBoxLayout()
|
|
|
|
# Setup Speaking Graph Plot Widget
|
|
self.speakingGraph = pg.PlotWidget()
|
|
self.speakingGraph.setBackground('w')
|
|
self.speakingGraph.hideAxis('left')
|
|
self.speakingGraph.hideAxis('bottom')
|
|
self.speakingGraph.setAspectLocked()
|
|
self.speakingGraph.setYRange(-2.25, 2.25, padding=0)
|
|
self.speakingGraph.setXRange(-2.25, 2.25, padding=0)
|
|
self.speakingGraph.getPlotItem().setTitle(title='Speaking Distribution')
|
|
|
|
self.speakingGraphPlots = []
|
|
|
|
layout.addWidget(self.speakingGraph, 1, 0, 1, 1)
|
|
layout.addWidget(self.measures, 1, 1, 1, 2)
|
|
layout.setColumnStretch(0, 1)
|
|
layout.setColumnStretch(1, 2)
|
|
|
|
self.setLayout(layout)
|
|
self.colors = None
|
|
self.labels = dict()
|
|
self.speakBlob = None
|
|
self.positions = dict()
|
|
self.idBlobs = dict()
|
|
|
|
@QtCore.pyqtSlot(dict, int)
|
|
def updateLables(self, speak, numberIDs):
|
|
""" Update labels when segment was changed"""
|
|
for id_no in range(numberIDs):
|
|
self.labels['RST'][id_no].setText('%.2f' % speak[id_no][1])
|
|
# self.labels['Turns'][id_no].setText('%i' % speak[id_no][2])
|
|
# self.labels['TurnLength'][id_no].setText('%.2f sec' % speak[id_no][3])
|
|
# self.labels['TurnPerMin'][id_no].setText('%.2f /min' % speak[id_no][4])
|
|
|
|
@QtCore.pyqtSlot(dict, list, int)
|
|
def setInit(self, speak, colors, numberIDs):
|
|
self.colors = colors
|
|
idLayout = QtWidgets.QVBoxLayout()
|
|
|
|
labelID = QtWidgets.QLabel(' ')
|
|
labelID.setFixedWidth(60)
|
|
labelID.setFixedHeight(20)
|
|
labelRST = QtWidgets.QLabel('Relative speaking time:')
|
|
labelTurn = QtWidgets.QLabel('Number of speaking turns:')
|
|
labelTurnLen = QtWidgets.QLabel('Average length of turn:')
|
|
labelTurnMin = QtWidgets.QLabel('Average number of turns:')
|
|
idLayout.addWidget(labelID)
|
|
idLayout.addWidget(labelRST)
|
|
idLayout.addWidget(labelTurn)
|
|
idLayout.addWidget(labelTurnLen)
|
|
idLayout.addWidget(labelTurnMin)
|
|
|
|
self.measuresLayout.insertLayout(-1, idLayout)
|
|
|
|
rstLabels = []
|
|
turnLabels = []
|
|
turnLenLabels = []
|
|
turnMinLabels = []
|
|
for id_no in range(numberIDs):
|
|
idLayout = QtWidgets.QVBoxLayout()
|
|
color = tuple([int(a * 255) for a in colors[id_no]])
|
|
|
|
labelID = QtWidgets.QLabel('ID%i' % id_no)
|
|
labelID.setFixedWidth(60)
|
|
labelID.setFixedHeight(20)
|
|
labelID.setStyleSheet('font: bold 12px; color: black; background-color: rgb(%i,%i,%i)' % color)
|
|
|
|
labelRST = QtWidgets.QLabel('%.2f' % speak[id_no][1])
|
|
rstLabels.append(labelRST)
|
|
labelTurn = QtWidgets.QLabel('%i' % speak[id_no][2])
|
|
turnLabels.append(labelTurn)
|
|
labelTurnLen = QtWidgets.QLabel('%.2f sec' % speak[id_no][3])
|
|
turnLenLabels.append(labelTurnLen)
|
|
labelTurnMin = QtWidgets.QLabel('%.2f /min' % speak[id_no][4])
|
|
turnMinLabels.append(labelTurnMin)
|
|
|
|
idLayout.addWidget(labelID)
|
|
idLayout.addWidget(labelRST)
|
|
idLayout.addWidget(labelTurn)
|
|
idLayout.addWidget(labelTurnLen)
|
|
idLayout.addWidget(labelTurnMin)
|
|
|
|
self.measuresLayout.insertLayout(-1, idLayout)
|
|
|
|
self.labels['RST'] = rstLabels
|
|
self.labels['Turns'] = turnLabels
|
|
self.labels['TurnLength'] = turnLenLabels
|
|
self.labels['TurnPerMin'] = turnMinLabels
|
|
|
|
self.measures.setLayout(self.measuresLayout)
|
|
|
|
@QtCore.pyqtSlot(list, int)
|
|
def initSpeakingGraph(self, colors, numberIDs):
|
|
""" initialize speaking graph """
|
|
|
|
self.speakBlob = pg.ScatterPlotItem([0], [0], size=0.3, pxMode=False,
|
|
pen=pg.mkPen(color=0.5, width=2), brush=pg.mkBrush(255, 255, 255))
|
|
self.speakBlob.setZValue(100)
|
|
self.speakingGraph.addItem(self.speakBlob)
|
|
|
|
pos = 360 // numberIDs
|
|
for id_no in range(numberIDs):
|
|
color = tuple([int(a * 255) for a in colors[id_no]])
|
|
idPos = pos * id_no
|
|
x = 2 * np.cos(np.deg2rad(idPos))
|
|
y = 2 * np.sin(np.deg2rad(idPos))
|
|
scatterPlot = pg.ScatterPlotItem([x], [y], size=0.2, pxMode=False,
|
|
pen=pg.mkPen(color=color, width=2), brush=pg.mkBrush(*color))
|
|
self.speakingGraph.addItem(scatterPlot)
|
|
self.positions[id_no] = [x, y]
|
|
self.idBlobs[id_no] = scatterPlot
|
|
|
|
plt = self.speakingGraph.plot(x=[], y=[], pen=pg.mkPen(color=color, width=1))
|
|
self.speakingGraphPlots.append(plt)
|
|
|
|
@QtCore.pyqtSlot(dict, int, int)
|
|
def updateSpeakingGraph(self, rst, active_speaker, numberIDs):
|
|
""" frame updates for gaze graph """
|
|
blobPos = np.array([0, 0])
|
|
for id_no in range(numberIDs):
|
|
diff = rst[id_no] - (1.0 / numberIDs)
|
|
if diff > 0:
|
|
blobPos = blobPos + 2 * diff * np.array(self.positions[id_no])
|
|
self.speakBlob.setData([blobPos[0]], [blobPos[1]])
|
|
|
|
for id_no in range(numberIDs):
|
|
color = tuple([int(a * 255) for a in self.colors[id_no]])
|
|
pen = pg.mkPen(color=color, width=(rst[id_no]*4))
|
|
|
|
x = [self.positions[id_no][0], blobPos[0]]
|
|
y = [self.positions[id_no][1], blobPos[1]]
|
|
self.speakingGraphPlots[id_no].setData(x, y)
|
|
self.speakingGraphPlots[id_no].setPen(pen)
|
|
|
|
if id_no == active_speaker:
|
|
self.idBlobs[id_no].setData([self.positions[id_no][0]], [self.positions[id_no][1]],
|
|
pen=pg.mkPen(color=(0, 0, 0), width=2))
|
|
else:
|
|
self.idBlobs[id_no].setData([self.positions[id_no][0]], [self.positions[id_no][1]],
|
|
pen=pg.mkPen(color=color, width=2))
|
|
|
|
|
|
|