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