api-test-stt / app.py
johnpaulbin's picture
Update app.py
ddc3a0a verified
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="language">Language:</label>
<select id="language">
<option value="en-US">English (US)</option>
<option value="es-ES">Spanish (Spain)</option>
<option value="fr-FR">French</option>
<option value="de-DE">German (Germany)</option>
<option value="it-IT">Italian (Italy)</option>
<option value="ja-JP">Japanese (Japan)</option>
<option value="ko-KR">Korean (South Korea)</option>
<option value="pt-PT">Portuguese (Portugal)</option>
<option value="pt-BR">Portuguese (Brazil)</option>
<option value="ru-RU">Russian (Russia)</option>
<option value="sv-SE">Swedish (Sweden)</option>
<option value="tr-TR">Turkish (Turkey)</option>
<option value="hi-IN">Hindi (India)</option>
<option value="nl-NL">Dutch (Netherlands)</option>
<option value="el-GR">Greek (Greece)</option>
<option value="he-IL">Hebrew (Israel)</option>
<option value="hu-HU">Hungarian (Hungary)</option>
<option value="id-ID">Indonesian (Indonesia)</option>
<option value="no-NO">Norwegian (Norway)</option>
<option value="pl-PL">Polish (Poland)</option>
<option value="ro-RO">Romanian (Romania)</option>
<option value="th-TH">Thai (Thailand)</option>
<option value="vi-VN">Vietnamese (Vietnam)</option>
<option value="uk-UA">Ukrainian (Ukraine)</option>
<option value="ur-PK">Urdu (Pakistan)</option>
<!-- Add more languages as needed -->
</select>
</div>
<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.");
}
// ... existing code ...
let recognition = new window.SpeechRecognition();
recognition.continuous = true;
recognition.interimResults = true;
let liveOutput = document.getElementById('transcription');
let lastTranscription = '';
// Function to update language
function updateLanguage() {
let selectedLanguage = document.getElementById('language').value;
recognition.lang = selectedLanguage;
}
// Set initial language
updateLanguage();
// Update language when user changes selection
document.getElementById('language').addEventListener('change', updateLanguage);
// ... rest of your existing code ...
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))