initial commit
This commit is contained in:
commit
9ac446ef9b
12
.devcontainer/Dockerfile
Normal file
12
.devcontainer/Dockerfile
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
FROM node:18
|
||||||
|
|
||||||
|
# Install basic development tools
|
||||||
|
RUN apt update && apt install -y less man-db sudo
|
||||||
|
|
||||||
|
# Ensure default `node` user has access to `sudo`
|
||||||
|
ARG USERNAME=node
|
||||||
|
RUN echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
|
||||||
|
&& chmod 0440 /etc/sudoers.d/$USERNAME
|
||||||
|
|
||||||
|
# Set `DEVCONTAINER` environment variable to help with orientation
|
||||||
|
ENV DEVCONTAINER=true
|
8
.devcontainer/devcontainer.json
Normal file
8
.devcontainer/devcontainer.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// See https://containers.dev/implementors/json_reference/ for configuration reference
|
||||||
|
{
|
||||||
|
"name": "Untitled Node.js project",
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"remoteUser": "node"
|
||||||
|
}
|
6
package-lock.json
generated
Normal file
6
package-lock.json
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"name": "arti-ai",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {}
|
||||||
|
}
|
12
package.json
Normal file
12
package.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"main": "web/server.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node web/server.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.18.2",
|
||||||
|
"request": "^2.88.2",
|
||||||
|
"ws": "^8.12.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
82
web/client.html
Normal file
82
web/client.html
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Real-time Speech-to-Text</title>
|
||||||
|
<style>
|
||||||
|
.recording {
|
||||||
|
background-color: red;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Real-time Speech-to-Text</h1>
|
||||||
|
<p id="connection-status">WebSocket disconnected</p>
|
||||||
|
<button id="record-button" disabled > Start Recording</button>
|
||||||
|
<p id="transcription"></p>
|
||||||
|
<script>
|
||||||
|
let socket = new WebSocket('ws://localhost:8081');
|
||||||
|
let audioRecorder;
|
||||||
|
let recording = false;
|
||||||
|
let recordButton;
|
||||||
|
let connectionStatus;
|
||||||
|
|
||||||
|
function connect(socket) {
|
||||||
|
console.log("trying to connect to server");
|
||||||
|
socket.onopen = () => {
|
||||||
|
console.log("WebSocket connection opened.");
|
||||||
|
connectionStatus.innerHTML = "Connected";
|
||||||
|
recordButton.disabled = false;
|
||||||
|
};
|
||||||
|
socket.onmessage = (event) => {
|
||||||
|
transcription.innerHTML = event.data;
|
||||||
|
};
|
||||||
|
socket.onclose = () => {
|
||||||
|
console.log("WebSocket connection closed");
|
||||||
|
connectionStatus.innerHTML = "Disconnected";
|
||||||
|
recordButton.disabled = true;
|
||||||
|
setTimeout(connect, 5000);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function startRecording() {
|
||||||
|
recording = true;
|
||||||
|
navigator.mediaDevices.getUserMedia({ audio: true })
|
||||||
|
.then((stream) => {
|
||||||
|
audioRecorder = new MediaRecorder(stream);
|
||||||
|
audioRecorder.start();
|
||||||
|
audioRecorder.addEventListener('dataavailable', (event) => {
|
||||||
|
console.log("Sent some audio data to server.");
|
||||||
|
socket.send(event.data);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
recordButton.classList.add("recording");
|
||||||
|
recordButton.innerHTML = "Stop Recording";
|
||||||
|
}
|
||||||
|
|
||||||
|
function stopRecording() {
|
||||||
|
recording = false;
|
||||||
|
audioRecorder.stop();
|
||||||
|
recordButton.classList.remove("recording");
|
||||||
|
recordButton.innerHTML = "Start Recording";
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleRecording() {
|
||||||
|
if (recording) {
|
||||||
|
stopRecording();
|
||||||
|
} else {
|
||||||
|
startRecording();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onload = () => {
|
||||||
|
recordButton = document.getElementById("record-button");
|
||||||
|
recordButton.addEventListener('click', toggleRecording);
|
||||||
|
connectionStatus = document.getElementById("connection-status");
|
||||||
|
connect(socket);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<script src="https://cdn.webrtc-experiment.com/MediaStreamRecorder.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
55
web/server.js
Normal file
55
web/server.js
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
const WebSocket = require('ws');
|
||||||
|
const wss = new WebSocket.Server({ port: 8081 });
|
||||||
|
console.log('WebSocket server started on port 8081');
|
||||||
|
|
||||||
|
//we use https://hub.docker.com/r/onerahmet/openai-whisper-asr-webservice to transcribe the audio
|
||||||
|
//docker run -p 9009:9009 -d onerahmet/openai-whisper-asr-webservice
|
||||||
|
|
||||||
|
wss.on('connection', (ws) => {
|
||||||
|
console.log('Client ' + ws._socket.remoteAddress + ' connected');
|
||||||
|
ws.on('message', (data) => {
|
||||||
|
console.log('Received data from client: ' + data.length + ' bytes');
|
||||||
|
var request = require('request');
|
||||||
|
var formData = {
|
||||||
|
task: 'transcribe',
|
||||||
|
language: 'en-US',
|
||||||
|
output: 'json',
|
||||||
|
audio_file: {
|
||||||
|
value: data,
|
||||||
|
options: {
|
||||||
|
filename: 'audio.ogg',
|
||||||
|
contentType: 'audio/ogg'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
request.post({url:'http://192.168.0.10:9009/asr', formData: formData}, function optionalCallback(err, httpResponse, body) {
|
||||||
|
if (err) {
|
||||||
|
return console.error('upload failed:', err);
|
||||||
|
}
|
||||||
|
console.log('Upload successful! Server responded with:', body);
|
||||||
|
ws.send(">>: " + body);
|
||||||
|
});
|
||||||
|
|
||||||
|
ws.send("Processing audio...");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function transcribeAudio(audioData) {
|
||||||
|
// Use a speech-to-text library to transcribe the audio data
|
||||||
|
//return transcription;
|
||||||
|
return "TEST";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// --- web server that servers client.html
|
||||||
|
const express = require('express');
|
||||||
|
const app = express();
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
app.get('/', (req, res) => {
|
||||||
|
res.sendFile(path.join(__dirname, 'client.html'));
|
||||||
|
});
|
||||||
|
|
||||||
|
app.listen(8080, () => {
|
||||||
|
console.log('Server listening on port 8080');
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user