OneCompiler

nicksapp

1662
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Live Subtitles</title> <style> body { font-family: Arial, sans-serif; margin: 0; background-color: #f0f0f0; } .container { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; text-align: center; background: white; padding: 20px; box-sizing: border-box; } #subtitle-display { font-size: 24px; color: #333; background: #e0e0e0; width: 100%; height: calc(100vh - 160px); overflow-y: auto; padding: 20px; box-sizing: border-box; } button { padding: 10px 20px; font-size: 18px; margin: 10px; cursor: pointer; border: none; border-radius: 4px; background-color: #007bff; color: white; } button:disabled { background-color: #ccc; cursor: not-allowed; } .language-selector { display: flex; justify-content: flex-end; width: 100%; margin-bottom: 20px; } .language-selector select { padding: 5px; margin: 0 10px; } </style> </head> <body> <div class="container"> <div class="language-selector"> <label for="spoken-language">Spoken Language:</label> <select id="spoken-language"> <option value="EN">English</option> <option value="RU">Russian</option> <option value="DE">German</option> <option value="KY">Kyrgyz</option> </select> <label for="target-language">Target Language:</label> <select id="target-language"> <option value="EN">English</option> <option value="RU">Russian</option> <option value="DE">German</option> <option value="KY">Kyrgyz</option> </select> </div> <h1></h1> <div id="subtitle-display"></div> <button id="start-button">Start Listening</button> <button id="stop-button" disabled>Stop Listening</button> </div> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <script> const startButton = document.getElementById('start-button'); const stopButton = document.getElementById('stop-button'); const subtitleDisplay = document.getElementById('subtitle-display'); const spokenLanguageSelector = document.getElementById('spoken-language'); const targetLanguageSelector = document.getElementById('target-language');
    let recognition;
    let finalTranscript = '';
    let interimElement = document.createElement('div');
    subtitleDisplay.appendChild(interimElement);

    // Speech recognition setup
    if ('webkitSpeechRecognition' in window) {
        recognition = new webkitSpeechRecognition();
    } else if ('SpeechRecognition' in window) {
        recognition = new SpeechRecognition();
    } else {
        alert('Your browser does not support speech recognition.');
    }

    if (recognition) {
        recognition.continuous = true;
        recognition.interimResults = true;

        recognition.onstart = () => {
            startButton.disabled = true;
            stopButton.disabled = false;
        };

        recognition.onend = () => {
            startButton.disabled = false;
            stopButton.disabled = true;
        };

        recognition.onresult = async (event) => {
            interimElement.innerText = ''; // Clear the interim element

            let interimTranscript = '';
            for (let i = event.resultIndex; i < event.results.length; ++i) {
                if (event.results[i].isFinal) {
                    finalTranscript += event.results[i][0].transcript + ' ';
                    const translatedText = await translateText(event.results[i][0].transcript);
                    subtitleDisplay.innerHTML += `<br><span style="color: gray;">${translatedText}</span>`;
                } else {
                    interimTranscript += event.results[i][0].transcript;
                    const translatedText = await translateText(interimTranscript);
                    interimElement.innerText = translatedText;
                }
            }
            subtitleDisplay.scrollTop = subtitleDisplay.scrollHeight;
        };

        startButton.addEventListener('click', () => {
            finalTranscript = ''; // Reset final transcript when starting
            subtitleDisplay.innerHTML = ''; // Clear previous subtitles
            interimElement.innerText = ''; // Clear interim element
            recognition.lang = spokenLanguageSelector.value.toLowerCase();
            recognition.start();
        });

        stopButton.addEventListener('click', () => {
            recognition.stop();
        });
    }

    async function translateText(text) {
        const sourceLang = spokenLanguageSelector.value;
        const targetLang = targetLanguageSelector.value;
        const url = `https://api-free.deepl.com/v2/translate`;

        try {
            const response = await axios.post(url, null, {
                params: {
                    auth_key: '34922781-8d8e-4a39-b289-5766e02f24b8:fx',
                    text: text,
                    source_lang: sourceLang,
                    target_lang: targetLang,
                }
            });

            if (response.data && response.data.translations && response.data.translations[0]) {
                return response.data.translations[0].text;
            } else {
                return 'Translation error';
            }
        } catch (error) {
            console.error('Translation error:', error);
            return 'Translation error';
        }
    }
</script>
</body> </html>