api-test-stt / app.py
johnpaulbin's picture
Update app.py
5571210 verified
raw history blame
No virus
4.17 kB
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 = {}
@app.route('/<username>', methods=['POST', 'GET'])
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'
@app.route('/')
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))