Spaces:
Sleeping
Sleeping
from flask import Flask, request, jsonify, Response | |
import asyncio | |
from hypercorn.asyncio import serve | |
from hypercorn.config import Config | |
import os | |
os.environ['CURL_CA_BUNDLE'] = '' | |
app = Flask(__name__) | |
transcriptions = {} | |
def handle_transcription(username): | |
if request.method == 'POST': | |
data = request.get_json() | |
new_word = data.get('transcription', '') | |
# Append new word to the user's transcription list | |
transcriptions.setdefault(username, []).append(new_word) | |
# Remove the 20th last word if more than 20 words are present | |
if len(transcriptions[username]) > 1: | |
transcriptions[username].pop(0) | |
# Join the words to form the updated transcription | |
updated_transcription = ' '.join(transcriptions[username]) | |
return jsonify({"status": "success", "message": "Word added", "transcription": updated_transcription}) | |
elif request.method == 'GET': | |
transcription = ' '.join(transcriptions.get(username, [])) | |
return transcription if transcription else 'N/A' | |
def home(): | |
html_content = """ | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Speech to Text</title> | |
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> | |
</head> | |
<body> | |
<h1>Speech Recognition</h1> | |
<button id="start">Start Listening</button> | |
<button id="stop">Stop Listening</button> | |
<div> | |
<label for="username">Username:</label> | |
<input type="text" id="username" placeholder="Enter your username"> | |
</div> | |
<div id="transcription" style="border: 1px solid #ccc; padding: 10px; margin-top: 5px; min-height: 50px;"></div> | |
<script> | |
window.SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; | |
if (!window.SpeechRecognition) { | |
alert("Your browser does not support Speech Recognition. Try Google Chrome."); | |
} | |
let recognition = new window.SpeechRecognition(); | |
recognition.continuous = true; | |
recognition.interimResults = true; | |
let liveOutput = document.getElementById('transcription'); | |
let lastTranscription = ''; | |
recognition.onresult = (event) => { | |
let currentTranscription = ''; | |
for (const result of event.results) { | |
currentTranscription = result[0].transcript; | |
} | |
liveOutput.textContent = currentTranscription; | |
if (lastTranscription !== currentTranscription) { | |
lastTranscription = currentTranscription; | |
sendTranscriptionToServer(currentTranscription); | |
} | |
}; | |
recognition.onerror = (event) => { | |
console.error('Speech recognition error', event.error); | |
recognition.start(); | |
}; | |
recognition.onend = () => { | |
// Automatically restart the recognition when it ends | |
recognition.start(); | |
}; | |
function sendTranscriptionToServer(transcription) { | |
let username = document.getElementById('username').value; | |
$.ajax({ | |
url: 'https://johnpaulbin-api-test-stt.hf.space/' + username, | |
type: 'POST', | |
contentType: 'application/json', | |
data: JSON.stringify({ transcription: transcription }), | |
success: function(response) { | |
console.log('Transcription sent', response); | |
}, | |
error: function(error) { | |
console.error('Error sending transcription', error); | |
} | |
}); | |
} | |
document.getElementById('start').addEventListener('click', () => { | |
recognition.start(); | |
}); | |
document.getElementById('stop').addEventListener('click', () => { | |
recognition.stop(); | |
}); | |
</script> | |
</body> | |
</html> | |
""" | |
return Response(html_content, mimetype='text/html') | |
if __name__ == "__main__": | |
config = Config() | |
config.bind = ["0.0.0.0:7860"] # You can specify the host and port here | |
asyncio.run(serve(app, config)) |