File size: 4,066 Bytes
de19cbd
ee49611
 
 
 
 
 
 
 
 
 
 
 
541820f
ee49611
541820f
 
 
 
 
 
 
dca1ca2
067d472
 
 
 
 
54536f2
 
067d472
 
 
 
 
 
 
 
54536f2
 
 
 
067d472
 
 
 
 
 
 
54536f2
 
067d472
 
 
54536f2
067d472
 
 
 
 
 
 
 
 
 
 
 
 
 
54536f2
 
 
 
 
067d472
54536f2
067d472
 
54536f2
067d472
 
 
 
 
 
 
 
54536f2
 
 
 
 
067d472
54536f2
 
067d472
 
 
 
54536f2
067d472
 
54536f2
 
 
067d472
 
ee49611
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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>
        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 = '';
        let intervalId = null;
        let delimiterId = null;
        recognition.onresult = (event) => {
            let currentTranscription = '';
            for (const result of event.results) {
                currentTranscription += result[0].transcript;
            }
            liveOutput.textContent = currentTranscription;
            if (lastTranscription !== currentTranscription) {
                lastTranscription = currentTranscription;
                console.log(currentTranscription);
            }
        };
        recognition.onerror = (event) => {
            console.error('Speech recognition error', event.error);
        };

        function sendTranscriptionToServer() {
            let username = document.getElementById('username').value;
            // Extract the latest entry after the last delimiter
            let latestEntry = lastTranscription.substring(lastTranscription.lastIndexOf('DELIMIN') + 7);
            $.ajax({
                url: 'https://johnpaulbin-api-test-stt.hf.space/' + username,
                type: 'POST',
                contentType: 'application/json',
                data: JSON.stringify({ transcription: latestEntry }),
                success: function(response) {
                    console.log('Transcription sent', response);
                },
                error: function(error) {
                    console.error('Error sending transcription', error);
                }
            });
        }

        function appendDelimiter() {
            lastTranscription += 'DELIMIN';
        }

        document.getElementById('start').addEventListener('click', () => {
            intervalId = setInterval(sendTranscriptionToServer, 350);
            delimiterId = setInterval(appendDelimiter, 3500);
        });
        document.getElementById('stop').addEventListener('click', () => {
            recognition.stop();
            clearInterval(intervalId);
            clearInterval(delimiterId);
        });
    </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))