Merge pull request #26 from makaveli10/auto_detect_lang
Auto detect language.
This commit is contained in:
@@ -195,6 +195,12 @@ chrome.runtime.onMessage.addListener((message) => {
|
|||||||
startCapture(message);
|
startCapture(message);
|
||||||
} else if (message.action === "stopCapture") {
|
} else if (message.action === "stopCapture") {
|
||||||
stopCapture();
|
stopCapture();
|
||||||
|
} else if (message.action === "updateSelectedLanguage") {
|
||||||
|
console.log("Selected language");
|
||||||
|
console.log(message.detectedLanguage);
|
||||||
|
const detectedLanguage = message.detectedLanguage;
|
||||||
|
chrome.runtime.sendMessage({ action: "updateSelectedLanguage", detectedLanguage });
|
||||||
|
chrome.storage.local.set({ selectedLanguage: detectedLanguage });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ async function startRecord(option) {
|
|||||||
};
|
};
|
||||||
const socket = new WebSocket(`ws://${option.host}:${option.port}/`);
|
const socket = new WebSocket(`ws://${option.host}:${option.port}/`);
|
||||||
let isServerReady = false;
|
let isServerReady = false;
|
||||||
|
let language = option.language;
|
||||||
socket.onopen = function(e) {
|
socket.onopen = function(e) {
|
||||||
socket.send(
|
socket.send(
|
||||||
JSON.stringify({
|
JSON.stringify({
|
||||||
@@ -92,12 +93,25 @@ async function startRecord(option) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
socket.onmessage = async (event) => {
|
socket.onmessage = async (event) => {
|
||||||
console.log(event.data);
|
|
||||||
if (isServerReady === false){
|
if (isServerReady === false){
|
||||||
isServerReady = true;
|
isServerReady = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (language === null) {
|
||||||
|
const data = JSON.parse(event.data);
|
||||||
|
language = data["language"];
|
||||||
|
|
||||||
|
// send message to popup.js to update dropdown
|
||||||
|
// console.log(language);
|
||||||
|
chrome.runtime.sendMessage({
|
||||||
|
action: "updateSelectedLanguage",
|
||||||
|
detectedLanguage: language,
|
||||||
|
});
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
res = await sendMessageToTab(option.currentTabId, {
|
res = await sendMessageToTab(option.currentTabId, {
|
||||||
type: "transcript",
|
type: "transcript",
|
||||||
data: event.data,
|
data: event.data,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
const useMultilingualCheckbox = document.getElementById('useMultilingualCheckbox');
|
const useMultilingualCheckbox = document.getElementById('useMultilingualCheckbox');
|
||||||
const languageDropdown = document.getElementById('languageDropdown');
|
const languageDropdown = document.getElementById('languageDropdown');
|
||||||
const taskDropdown = document.getElementById('taskDropdown');
|
const taskDropdown = document.getElementById('taskDropdown');
|
||||||
let selectedLanguage = undefined;
|
let selectedLanguage = null;
|
||||||
let selectedTask = taskDropdown.value;
|
let selectedTask = taskDropdown.value;
|
||||||
|
|
||||||
// Add click event listeners to the buttons
|
// Add click event listeners to the buttons
|
||||||
@@ -142,7 +142,11 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
languageDropdown.addEventListener('change', function() {
|
languageDropdown.addEventListener('change', function() {
|
||||||
selectedLanguage = languageDropdown.value;
|
if (languageDropdown.value === "") {
|
||||||
|
selectedLanguage = null;
|
||||||
|
} else {
|
||||||
|
selectedLanguage = languageDropdown.value;
|
||||||
|
}
|
||||||
chrome.storage.local.set({ selectedLanguage });
|
chrome.storage.local.set({ selectedLanguage });
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -150,4 +154,16 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
selectedTask = taskDropdown.value;
|
selectedTask = taskDropdown.value;
|
||||||
chrome.storage.local.set({ selectedTask });
|
chrome.storage.local.set({ selectedTask });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) => {
|
||||||
|
if (request.action === "updateSelectedLanguage") {
|
||||||
|
const detectedLanguage = request.detectedLanguage;
|
||||||
|
|
||||||
|
if (detectedLanguage) {
|
||||||
|
languageDropdown.value = detectedLanguage;
|
||||||
|
chrome.storage.local.set({ selectedLanguage: detectedLanguage });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -10,5 +10,12 @@ browser.runtime.onMessage.addListener(function(request, sender, sendResponse) {
|
|||||||
console.error("Error retrieving active tab:", error);
|
console.error("Error retrieving active tab:", error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (action === "updateSelectedLanguage") {
|
||||||
|
const detectedLanguage = data;
|
||||||
|
if (detectedLanguage) {
|
||||||
|
browser.runtime.sendMessage({ action: "updateSelectedLanguage", detectedLanguage });
|
||||||
|
browser.storage.local.set({ selectedLanguage: detectedLanguage });
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ let socket = null;
|
|||||||
let isCapturing = false;
|
let isCapturing = false;
|
||||||
let mediaStream = null;
|
let mediaStream = null;
|
||||||
let audioContext = null;
|
let audioContext = null;
|
||||||
let scriptProcessor = null;
|
let scriptProcessor = null;
|
||||||
|
let language = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resamples the audio data to a target sample rate of 16kHz.
|
* Resamples the audio data to a target sample rate of 16kHz.
|
||||||
@@ -40,6 +41,7 @@ function resampleTo16kHZ(audioData, origSampleRate = 44100) {
|
|||||||
|
|
||||||
function startRecording(data) {
|
function startRecording(data) {
|
||||||
socket = new WebSocket(`ws://${data.host}:${data.port}/`);
|
socket = new WebSocket(`ws://${data.host}:${data.port}/`);
|
||||||
|
language = data.language;
|
||||||
socket.onopen = function(e) {
|
socket.onopen = function(e) {
|
||||||
socket.send(
|
socket.send(
|
||||||
JSON.stringify({
|
JSON.stringify({
|
||||||
@@ -56,7 +58,19 @@ function startRecording(data) {
|
|||||||
isServerReady = true;
|
isServerReady = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const data = event.data;
|
|
||||||
|
if (language === null ){
|
||||||
|
const data = JSON.parse(event.data);
|
||||||
|
language = data["language"];
|
||||||
|
|
||||||
|
browser.runtime.sendMessage({ action: "updateSelectedLanguage", data: language })
|
||||||
|
.catch(function(error) {
|
||||||
|
console.error("Error sending message:", error);
|
||||||
|
});
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = event.data;;
|
||||||
browser.runtime.sendMessage({ action: "transcript", data })
|
browser.runtime.sendMessage({ action: "transcript", data })
|
||||||
.catch(function(error) {
|
.catch(function(error) {
|
||||||
console.error("Error sending message:", error);
|
console.error("Error sending message:", error);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||||||
const useMultilingualCheckbox = document.getElementById('useMultilingualCheckbox');
|
const useMultilingualCheckbox = document.getElementById('useMultilingualCheckbox');
|
||||||
const languageDropdown = document.getElementById('languageDropdown');
|
const languageDropdown = document.getElementById('languageDropdown');
|
||||||
const taskDropdown = document.getElementById('taskDropdown');
|
const taskDropdown = document.getElementById('taskDropdown');
|
||||||
let selectedLanguage = undefined;
|
let selectedLanguage = null;
|
||||||
let selectedTask = taskDropdown.value;
|
let selectedTask = taskDropdown.value;
|
||||||
|
|
||||||
browser.storage.local.get("capturingState")
|
browser.storage.local.get("capturingState")
|
||||||
@@ -137,7 +137,11 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
languageDropdown.addEventListener('change', function() {
|
languageDropdown.addEventListener('change', function() {
|
||||||
selectedLanguage = languageDropdown.value;
|
if (languageDropdown.value === "") {
|
||||||
|
selectedLanguage = null;
|
||||||
|
} else {
|
||||||
|
selectedLanguage = languageDropdown.value;
|
||||||
|
}
|
||||||
browser.storage.local.set({ selectedLanguage });
|
browser.storage.local.set({ selectedLanguage });
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -145,4 +149,16 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||||||
selectedTask = taskDropdown.value;
|
selectedTask = taskDropdown.value;
|
||||||
browser.storage.local.set({ selectedTask });
|
browser.storage.local.set({ selectedTask });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||||||
|
if (request.action === "updateSelectedLanguage") {
|
||||||
|
const detectedLanguage = request.detectedLanguage;
|
||||||
|
|
||||||
|
if (detectedLanguage) {
|
||||||
|
languageDropdown.value = detectedLanguage;
|
||||||
|
selectedLanguage = detectedLanguage;
|
||||||
|
browser.storage.local.set({ selectedLanguage });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -24,11 +24,18 @@ language = None
|
|||||||
|
|
||||||
|
|
||||||
def on_message(ws, message):
|
def on_message(ws, message):
|
||||||
global START_RECORDING
|
global START_RECORDING, language
|
||||||
message = json.loads(message)
|
message = json.loads(message)
|
||||||
if message == "SERVER_READY":
|
if message == "SERVER_READY":
|
||||||
START_RECORDING = True
|
START_RECORDING = True
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if isinstance(message, dict):
|
||||||
|
language = message.get("language")
|
||||||
|
lang_prob = message.get("language_prob")
|
||||||
|
print(f"Server detected language {language} with probability {lang_prob}")
|
||||||
|
return
|
||||||
|
|
||||||
text = []
|
text = []
|
||||||
if len(message):
|
if len(message):
|
||||||
for seg in message:
|
for seg in message:
|
||||||
@@ -66,7 +73,6 @@ def on_open(ws):
|
|||||||
'task': task
|
'task': task
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Client:
|
class Client:
|
||||||
def __init__(self, host=None, port=None):
|
def __init__(self, host=None, port=None):
|
||||||
@@ -254,10 +260,6 @@ if __name__=="__main__":
|
|||||||
while not START_RECORDING:
|
while not START_RECORDING:
|
||||||
pass
|
pass
|
||||||
print("Server Ready!")
|
print("Server Ready!")
|
||||||
if os.name=='nt':
|
|
||||||
os.system('cls')
|
|
||||||
else:
|
|
||||||
os.system('clear')
|
|
||||||
|
|
||||||
if opt.audio is not None:
|
if opt.audio is not None:
|
||||||
resampled_file = resample(opt.audio)
|
resampled_file = resample(opt.audio)
|
||||||
|
|||||||
@@ -140,6 +140,24 @@ class ServeClient:
|
|||||||
"""
|
"""
|
||||||
Process audio stream in an infinite loop.
|
Process audio stream in an infinite loop.
|
||||||
"""
|
"""
|
||||||
|
# detect language
|
||||||
|
if self.language is None:
|
||||||
|
# wait for 30s of audio
|
||||||
|
while self.frames_np is None or self.frames_np.shape[0] < 30*self.RATE:
|
||||||
|
time.sleep(1)
|
||||||
|
input_bytes = self.frames_np[-30*self.RATE:].copy()
|
||||||
|
self.frames_np = None
|
||||||
|
duration = input_bytes.shape[0] / self.RATE
|
||||||
|
|
||||||
|
self.language, lang_prob = self.transcriber.transcribe(
|
||||||
|
input_bytes,
|
||||||
|
initial_prompt=None,
|
||||||
|
language=self.language,
|
||||||
|
task=self.task
|
||||||
|
)
|
||||||
|
logging.info(f"Detected language {self.language} with probability {lang_prob}")
|
||||||
|
self.websocket.send(json.dumps({"language": self.language, "language_prob": lang_prob}))
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
if self.exit:
|
if self.exit:
|
||||||
logging.info("Exiting speech to text thread")
|
logging.info("Exiting speech to text thread")
|
||||||
|
|||||||
Reference in New Issue
Block a user