krishna195 commited on
Commit
9b2050e
Β·
verified Β·
1 Parent(s): 6d25e44

Update script.js

Browse files
Files changed (1) hide show
  1. script.js +100 -83
script.js CHANGED
@@ -1,105 +1,122 @@
1
- let transcriber;
2
- let recording = false;
3
  let mediaRecorder;
4
  let audioChunks = [];
5
 
6
- // Function to Load Model
7
- async function loadModel() {
8
- document.getElementById("modelStatus").innerText = "⏳ Loading Whisper model...";
9
  try {
10
- const timeout = new Promise((_, reject) =>
11
- setTimeout(() => reject(new Error("Model took too long to load!")), 60000) // 60s timeout
12
- );
13
-
14
- transcriber = await Promise.race([
15
- window.Transformers.pipeline('automatic-speech-recognition', 'Xenova/whisper-tiny.en'),
16
- timeout
17
- ]);
18
-
19
- document.getElementById("modelStatus").innerText = "βœ… Model Loaded!";
20
- document.getElementById("recordButton").disabled = false;
21
- document.getElementById("recordButton").innerText = "🎀 Start Recording";
22
- document.getElementById("testModel").disabled = false;
23
  } catch (error) {
24
- document.getElementById("modelStatus").innerText = "❌ Model failed to load!";
25
- document.getElementById("error").innerText = error.message;
26
- console.error("Error loading model:", error);
27
  }
28
  }
29
 
30
- // Function to Test Model
31
- async function testModel() {
32
- try {
33
- document.getElementById("status").innerText = "⏳ Running test...";
34
- let output = await transcriber("https://huggingface.co/datasets/Xenova/transformers.js-docs/resolve/main/jfk.wav");
35
- document.getElementById("output").innerText = "Test Passed: " + output.text;
36
- document.getElementById("status").innerText = "βœ… Model Test Passed!";
37
- } catch (error) {
38
- document.getElementById("status").innerText = "❌ Model Test Failed!";
39
- document.getElementById("error").innerText = error.message;
40
- console.error("Test Error:", error);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  }
42
  }
43
 
44
- // Function to Start Recording
45
  async function startRecording() {
46
- let stream = await navigator.mediaDevices.getUserMedia({ audio: true });
47
- mediaRecorder = new MediaRecorder(stream);
 
 
48
 
49
- mediaRecorder.ondataavailable = (event) => {
50
- audioChunks.push(event.data);
51
- };
 
 
 
 
 
52
 
 
 
 
53
  mediaRecorder.onstop = async () => {
54
- let audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
55
- let reader = new FileReader();
56
-
57
- reader.onloadend = async () => {
58
- let audioURL = reader.result;
59
- document.getElementById("status").innerText = "⏳ Transcribing...";
60
-
61
- try {
62
- let output = await transcriber(audioURL);
63
- document.getElementById("output").innerText = output.text;
64
- document.getElementById("status").innerText = "βœ… Done!";
65
- } catch (error) {
66
- document.getElementById("status").innerText = "❌ Error during transcription.";
67
- document.getElementById("error").innerText = error.message;
68
- console.error(error);
69
- }
70
- };
71
-
72
- reader.readAsDataURL(audioBlob);
73
  };
74
-
75
- mediaRecorder.start();
76
- audioChunks = [];
77
- recording = true;
78
- document.getElementById("recordButton").innerText = "⏹ Stop Recording";
79
- document.getElementById("status").innerText = "πŸŽ™οΈ Recording...";
80
  }
81
 
82
- // Function to Stop Recording
83
- function stopRecording() {
84
- if (mediaRecorder && recording) {
85
- mediaRecorder.stop();
86
- recording = false;
87
- document.getElementById("recordButton").innerText = "🎀 Start Recording";
88
- document.getElementById("status").innerText = "⏳ Processing audio...";
89
- }
90
- }
91
 
92
- // Attach event listeners
93
- document.getElementById("recordButton").addEventListener("click", () => {
94
- if (!recording) {
95
- startRecording();
96
- } else {
97
- stopRecording();
 
 
 
 
 
 
98
  }
99
- });
100
-
101
- document.getElementById("testModel").addEventListener("click", testModel);
102
 
103
- // Load model on page start
104
- loadModel();
 
 
 
105
 
 
 
 
1
+ let transcriber, generator;
2
+ let isRecording = false;
3
  let mediaRecorder;
4
  let audioChunks = [];
5
 
6
+ // Initialize models
7
+ async function initializeModels() {
 
8
  try {
9
+ console.log("Loading transcriber model...");
10
+ transcriber = await pipeline('automatic-speech-recognition', 'Xenova/whisper-tiny.en');
11
+ console.log("Transcriber model loaded successfully:", transcriber);
12
+
13
+ console.log("Loading generator model...");
14
+ generator = await pipeline('text2text-generation', 'Xenova/LaMini-Flan-T5-783M');
15
+ console.log("Generator model loaded successfully:", generator);
 
 
 
 
 
 
16
  } catch (error) {
17
+ console.error("Error loading models:", error);
18
+ displayMessage("Error loading models.", 'bot-message');
 
19
  }
20
  }
21
 
22
+ // Display message in the chat container
23
+ function displayMessage(message, className) {
24
+ const messageElement = document.createElement('div');
25
+ messageElement.className = className;
26
+ messageElement.innerText = message;
27
+ document.getElementById('chat-container').appendChild(messageElement);
28
+ document.getElementById('chat-container').scrollTop = document.getElementById('chat-container').scrollHeight;
29
+ }
30
+
31
+ // Handle user text input
32
+ async function handleUserInput() {
33
+ const userInput = document.getElementById('user-input').value.trim();
34
+ if (!userInput) return;
35
+
36
+ displayMessage("You: " + userInput, 'user-message');
37
+ document.getElementById('user-input').value = "";
38
+
39
+ await generateResponse(userInput);
40
+ }
41
+
42
+ // Toggle recording
43
+ async function toggleRecording() {
44
+ isRecording = !isRecording;
45
+
46
+ if (isRecording) {
47
+ document.getElementById('record-button').innerText = "⏹️"; // Change to Stop icon
48
+ startRecording();
49
+ } else {
50
+ document.getElementById('record-button').innerText = "πŸŽ™οΈ"; // Change to Mic icon
51
+ stopRecording();
52
  }
53
  }
54
 
55
+ // Start audio recording
56
  async function startRecording() {
57
+ try {
58
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
59
+ mediaRecorder = new MediaRecorder(stream);
60
+ audioChunks = [];
61
 
62
+ mediaRecorder.ondataavailable = event => audioChunks.push(event.data);
63
+ mediaRecorder.start();
64
+ console.log("Recording started.");
65
+ } catch (error) {
66
+ console.error("Error starting recording:", error);
67
+ displayMessage("Error starting recording.", 'bot-message');
68
+ }
69
+ }
70
 
71
+ // Stop recording and transcribe
72
+ async function stopRecording() {
73
+ mediaRecorder.stop();
74
  mediaRecorder.onstop = async () => {
75
+ const audioBlob = new Blob(audioChunks);
76
+ const url = URL.createObjectURL(audioBlob);
77
+
78
+ try {
79
+ console.log("Transcribing audio...");
80
+ const result = await transcriber(url);
81
+ const transcribedText = result?.text || "Error in transcription.";
82
+ console.log("Transcription result:", transcribedText);
83
+
84
+ // Display transcribed text
85
+ displayMessage("You (voice): " + transcribedText, 'user-message');
86
+
87
+ // Generate response based on transcribed text
88
+ await generateResponse(transcribedText);
89
+ } catch (error) {
90
+ console.error("Error in transcription:", error);
91
+ displayMessage("Error in transcription.", 'bot-message');
92
+ }
 
93
  };
 
 
 
 
 
 
94
  }
95
 
96
+ // Generate a response using text generation model
97
+ async function generateResponse(inputText) {
98
+ console.log("Generating response for input:", inputText);
 
 
 
 
 
 
99
 
100
+ try {
101
+ console.log("Input text before sending to generator:", inputText);
102
+
103
+ const result = await generator(inputText, { max_new_tokens: 100 });
104
+ const generatedText = result;
105
+ console.log("Generated response text:", generatedText);
106
+
107
+ displayMessage("Bot: " + generatedText, 'bot-message');
108
+ speakText(generatedText);
109
+ } catch (error) {
110
+ console.error("Error in response generation:", error);
111
+ displayMessage("Error in response generation: " + error.message, 'bot-message');
112
  }
113
+ }
 
 
114
 
115
+ // Speak the generated text
116
+ function speakText(text) {
117
+ const utterance = new SpeechSynthesisUtterance(text);
118
+ window.speechSynthesis.speak(utterance);
119
+ }
120
 
121
+ // Initialize models when the page loads
122
+ window.addEventListener("DOMContentLoaded", initializeModels);