rec2text : voice recorder transcription using whisper API

This commit is contained in:
fred 2024-02-21 21:41:42 +01:00
parent ba1f7146f9
commit 47211ca4b1
3 changed files with 241 additions and 0 deletions

View File

@ -0,0 +1,85 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Treasure Hunt App</title>
</head>
<body>
<h1>Treasure Hunt</h1>
<p id="status">Waiting for coordinates...</p>
<script>
// Function to calculate the distance between two points using Haversine formula
function calculateDistance(lat1, lon1, lat2, lon2) {
const R = 6371; // Radius of the Earth in kilometers
const dLat = (lat2 - lat1) * (Math.PI / 180);
const dLon = (lon2 - lon1) * (Math.PI / 180);
const a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1 * (Math.PI / 180)) * Math.cos(lat2 * (Math.PI / 180)) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const distance = R * c;
return distance;
}
// Function to check if the user is at the treasure spot
function checkTreasure(latitude, longitude) {
// Replace these values with the actual coordinates of the treasures
const treasureCoordinates = [
{ lat: 37.7749, lon: -122.4194 }, // Example coordinates (San Francisco, CA)
// Add more coordinates as needed
];
for (const treasure of treasureCoordinates) {
const distance = calculateDistance(latitude, longitude, treasure.lat, treasure.lon);
if (distance < 0.1) {
// User is at the treasure spot
document.getElementById('status').innerText = 'You found the treasure!';
// Ask for email and send a request to a GET URL
const userEmail = prompt('Congratulations! Enter your email to claim the treasure:');
sendRequest(userEmail);
return;
}
}
// User is not at any treasure spot
document.getElementById('status').innerText = 'Waiting for coordinates...';
}
// Function to send a request to a GET URL with the user's email
function sendRequest(email) {
// Replace 'YOUR_GET_URL' with the actual GET URL
const apiUrl = 'YOUR_GET_URL';
// Construct the final URL with the user's email
const finalUrl = `${apiUrl}?email=${encodeURIComponent(email)}`;
// Use fetch to send the GET request
fetch(finalUrl)
.then(response => {
if (response.ok) {
console.log('Request sent successfully.');
} else {
console.error('Error sending request:', response.status);
}
})
.catch(error => console.error('Error sending request:', error));
}
// Dummy function to simulate getting the user's current location
function getUserLocation() {
// Replace with actual geolocation API calls for a mobile app
// In a real-world scenario, you would request the user's location using the Geolocation API
// For this example, we'll use hardcoded values for testing
const userLatitude = 37.7749; // Example latitude (San Francisco, CA)
const userLongitude = -122.4194; // Example longitude (San Francisco, CA)
checkTreasure(userLatitude, userLongitude);
}
// Simulate checking for user location every few seconds (for demonstration purposes)
setInterval(getUserLocation, 5000);
</script>
</body>
</html>

46
earth/rec2text/api.py Normal file
View File

@ -0,0 +1,46 @@
#!/bin/python3
import os
import time
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
from fastapi.middleware.cors import CORSMiddleware
import whisper
app = FastAPI()
# Enable CORS for all origins
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Set this to ["*"] to allow all origins, or specify your trusted origins
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
whisper = whisper.load_model("medium.en")
@app.post("/speechToText")
async def speech_to_text(file: UploadFile = File(...)):
try:
# Save the uploaded audio file locally
audio_path = "temp_audio.wav"
with open(audio_path, "wb") as audio_file:
audio_file.write(file.file.read())
# Wait for the file to be fully written
while os.path.getsize(audio_path) == 0:
time.sleep(0.1) # Adjust the sleep duration as needed
# Use whisper to convert speech to text
text = whisper.transcribe(audio_path, language="en")['text']
# Return the transcribed text
return text
except Exception as e:
return JSONResponse(content={"error": str(e)}, status_code=500)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=9000)

110
earth/rec2text/index.html Normal file
View File

@ -0,0 +1,110 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Audio Recorder</title>
</head>
<body>
<h1>Audio Recorder</h1>
<p>Press the button to start recording. Click again to stop recording and send the audio.</p>
<button id="recordButton">Start Recording</button>
<span id="countdown"></span>
<div id="result"></div>
<script>
document.addEventListener('DOMContentLoaded', function () {
let recording = false;
let audioChunks = [];
let mediaRecorder;
let timeoutId;
let countdownValue = 5; // Initial countdown value in seconds
const recordButton = document.getElementById('recordButton');
const countdownElement = document.getElementById('countdown');
recordButton.addEventListener('click', () => {
if (!recording) {
startRecording();
countdown();
recordButton.textContent = 'Stop Recording';
} else {
stopRecording();
recordButton.textContent = 'Sending Audio...';
sendAudio();
}
recording = !recording;
});
function startRecording() {
navigator.mediaDevices.getUserMedia({ audio: true })
.then((stream) => {
audioChunks = [];
mediaRecorder = new MediaRecorder(stream);
mediaRecorder.ondataavailable = (event) => {
if (event.data.size > 0) {
audioChunks.push(event.data);
}
};
mediaRecorder.onstop = () => {
const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
const audioUrl = URL.createObjectURL(audioBlob);
const audio = new Audio(audioUrl);
audio.play();
};
mediaRecorder.start();
})
.catch((error) => {
console.error('Error accessing microphone:', error);
});
}
function stopRecording() {
if (mediaRecorder.state === 'recording') {
mediaRecorder.stop();
}
}
async function sendAudio() {
const formData = new FormData();
formData.append('file', new Blob(audioChunks, { type: 'audio/wav' }));
try {
const response = await fetch('http://alienware.local:9000/speechToText', {
method: 'POST',
body: formData
});
const result = await response.text();
console.log('Speech to text result:', result);
// Display the result on the page
resultElement.textContent = 'Speech to text result: ' + result;
recordButton.textContent = 'Start Recording';
countdownElement.textContent = '';
} catch (error) {
console.error('Error sending audio:', error);
recordButton.textContent = 'Error Sending Audio';
}
}
function countdown() {
countdownElement.textContent = `Recording: ${countdownValue} seconds remaining`;
timeoutId = setInterval(() => {
countdownValue--;
countdownElement.textContent = `Recording: ${countdownValue} seconds remaining`;
if (countdownValue <= 0) {
clearInterval(timeoutId);
stopRecording();
recordButton.textContent = 'Sending Audio...';
sendAudio();
}
}, 1000);
}
});
</script>
</body>
</html>