initial commit

This commit is contained in:
Dobromir Popov 2023-03-06 19:12:54 +02:00
commit 9ac446ef9b
6 changed files with 175 additions and 0 deletions

12
.devcontainer/Dockerfile Normal file
View 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

View 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
View File

@ -0,0 +1,6 @@
{
"name": "arti-ai",
"lockfileVersion": 3,
"requires": true,
"packages": {}
}

12
package.json Normal file
View 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
View 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
View 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');
});