-
Notifications
You must be signed in to change notification settings - Fork 2
/
sentiment-module.js
111 lines (97 loc) · 3.12 KB
/
sentiment-module.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import {
TextClassifier,
FilesetResolver,
} from "./node_modules/@mediapipe/tasks-text/text_bundle.mjs";
console.log("Module started");
let poseLandmarker = undefined;
// Get the required elements
const input = document.getElementById("input");
const output = document.getElementById("output");
const submit = document.getElementById("submit");
const defaultTextButton = document.getElementById("populate-text");
const demosSection = document.getElementById("demos");
const text = []
let textClassifier;
// Create the TextClassifier object upon page load
const createTextClassifier = async () => {
const text = await FilesetResolver.forTextTasks(
"./node_modules/@mediapipe/tasks-text/wasm/"
);
textClassifier = await TextClassifier.createFromOptions(text, {
baseOptions: {
modelAssetPath: `./mediapipe_models/bert_classifier.tflite`,
delegate: "GPU",
},
maxResults: 5,
});
// Show demo section now model is ready to use.
demosSection.classList.remove("invisible");
};
createTextClassifier();
//listen for Advanced Scene Switcher websocket events
obs.on('CustomEvent', function(event) {
console.log(event.event_name)
if(event.event_name ==="localVocal"){
text.push(event.event_data)
console.log(event.event_data)
console.log(text)
processText()
}
})
// Add a button click listener that classifies text on click
async function processText(){
input.innerText = text.shift()
output.innerText = "Classifying...";
await sleep(5);
const result = textClassifier.classify(input.value);
await displayClassificationResult(result);
sendBrowserWebSocket(result)
sendAdvSSWebSocket(result)
}
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function sendBrowserWebSocket(result){
//send results to OBS Browser Source
obs.call("CallVendorRequest", {
vendorName: "obs-browser",
requestType: "emit_event",
requestData: {
event_name: "sentimentResult",
event_data: { result },
},
});
}
function sendAdvSSWebSocket(result){
//send results to Advanced Scene Switcher
const AdvancedSceneSwitcherMessage = JSON.stringify(result);
obs.call("CallVendorRequest", {
vendorName: "AdvancedSceneSwitcher",
requestType: "AdvancedSceneSwitcherMessage",
requestData: {
message: "hi",
},
});
}
// Iterate through the sentiment categories in the TextClassifierResult object, then display them in #output
async function displayClassificationResult(result) {
if (result.classifications[0].categories.length > 0) {
output.innerText = "";
} else {
output.innerText = "Result is empty";
}
const categories = [];
// Single-head model.
for (const category of result.classifications[0].categories) {
const categoryDiv = document.createElement("div");
categoryDiv.innerText = `${category.categoryName}: ${category.score.toFixed(
2
)}`;
// highlight the likely category
if (category.score.toFixed(2) > 0.5) {
categoryDiv.style.color = "#12b5cb";
}
output.appendChild(categoryDiv);
}
}
//Send results to OBS browser