api-test-stt / app.py
johnpaulbin's picture
Update app.py
0740c85 verified
raw
history blame
4.24 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()
transcription = data.get('transcription', '')
transcriptions[username] = transcription # Store the transcription
return jsonify({"status": "success", "message": "Transcription received"})
elif request.method == 'GET':
transcription = transcriptions.get(username, 'N/A')
return transcription
@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>
// Check for browser support
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; // Keep listening even after getting a result
recognition.interimResults = true; // Show interim results
let liveOutput = document.getElementById('transcription');
let lastTranscription = '';
let intervalId = null;
recognition.onresult = (event) => {
let currentTranscription = '';
// Concatenate all the transcriptions
for (const result of event.results) {
currentTranscription += result[0].transcript;
}
liveOutput.textContent = currentTranscription;
// Check if there's a new transcription
if (lastTranscription !== currentTranscription) {
lastTranscription = currentTranscription;
console.log(currentTranscription);
}
};
recognition.onerror = (event) => {
console.error('Speech recognition error', event.error);
};
function sendTranscriptionToServer(transcription) {
let username = document.getElementById('username').value;
$.ajax({
url: 'https://johnpaulbin-api-test-stt.hf.space/' + username, // Your server endpoint
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);
}
});
}
function clearTranscription() {
recognition.stop();
liveOutput.textContent = '';
lastTranscription = '';
recognition.start();
}
// Start and stop functions
document.getElementById('start').addEventListener('click', () => {
recognition.start();
intervalId = setInterval(() => sendTranscriptionToServer(lastTranscription), 350);
setInterval(clearTranscription, 3500); // Clear transcription every 2 seconds
});
document.getElementById('stop').addEventListener('click', () => {
recognition.stop();
clearInterval(intervalId);
});
</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))