class AvatarCompleto {
    constructor(transcriptionId, translationId) {
        this.DURACAO = 300;
        this.linguaDestino = "en";
        // "en" "ja-JP" "it-IT" "fr-FR" "es-ES"  "en-GB" "zh-HK" "zh-CN"
        this.interval = null;
        this.api = 'backend/index.php';
        this.useGPT = false;
        this.voices = [];
        this.recebe_audio = null;
        this.transcricao_audio = '';
        this.esta_gravando = false;
        this.transcriptionElem = document.getElementById(transcriptionId);
        this.translationElem = document.getElementById(translationId);
        window.speechSynthesis.onvoiceschanged = this.carregaVozes.bind(this);
        this.configuraAudio();
        const languageButtons = document.querySelectorAll('.langButton');
        languageButtons.forEach(button => {
            button.addEventListener('click', () => this.selecionaLingua(button));
        });
        document.getElementById('falar').addEventListener('click', () => this.capturandoVoz());
    }
    async carregaVozes() {
        this.voices = window.speechSynthesis.getVoices();
        const voiceSelector = document.getElementById('vozSelector');
        this.voices.forEach(voice => {
            let option = document.createElement('option');
            option.value = voice.name;
            option.textContent = `${voice.name} (${voice.lang})`;
            voiceSelector.appendChild(option);
        });
        const destino = document.getElementById('destino');
        let gpt = document.createElement('option');
        let google = document.createElement('option');
        gpt.value = 1;
        gpt.textContent = `GPT`;
        google.value = 2;
        google.textContent = `Google`;
        destino.appendChild(google);
        destino.appendChild(gpt);
        destino.addEventListener('change', () => this.selectDestino(destino.value));
        this.abreCamera();
    }
    async abreCamera(){
        const videoElement = document.getElementById('video');
        if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
            try {
                const stream = await navigator.mediaDevices.getUserMedia({ video: {} });
                videoElement.srcObject = stream;
            } catch (error) {
                console.error("Erro ao acessar a câmera:", error);
            }
        }
    }
    selectDestino(valor) {
        this.useGPT = valor == 1 ? true : false;
    }
    configuraAudio() {
        if (window.SpeechRecognition || window.webkitSpeechRecognition) {
            const speech_api = window.SpeechRecognition || window.webkitSpeechRecognition;
            this.recebe_audio = new speech_api();
            this.recebe_audio.continuous = true;
            this.recebe_audio.interimResults = true;
            this.recebe_audio.lang = "pt-BR";
            this.recebe_audio.onresult = this.verificaResultado.bind(this);
            this.recebe_audio.onend = () => {
                if (this.esta_gravando) {
                    this.recebe_audio.start();
                }
            };
        } else {
            console.log('Navegador não suporta a Web Speech API');
        }
    }
    verificaResultado(event) {
        for (let i = event.resultIndex; i < event.results.length; i++) {
            if (event.results[i].isFinal) {
                this.transcricao_audio = event.results[i][0].transcript;
                this.transcriptionElem.innerHTML = this.transcricao_audio;
                this.traduzTexto(this.transcricao_audio, this.linguaDestino);
            }
        }
    }
    capturandoVoz() {
        if (this.esta_gravando) {
            this.recebe_audio.stop();
            this.esta_gravando = false;
        } else {
            this.recebe_audio.start();
            this.esta_gravando = true;
        }
    }
    traduzTexto(texto, langdestino) {
        const data = {
            text: texto,
            langDestino: langdestino,
            source: 'pt',
            useGPT: this.useGPT
        };
        fetch(`${this.api}`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(data)
        })
        .then(response => response.json())
        .then(data => {
            let chatbotResponse;
            if (this.useGPT) {
                chatbotResponse = data.response;
                document.getElementById("custo").textContent = `Custo: Prompt-${data.prompt_tokens} Total: ${data.total_token}`
            } else {
                chatbotResponse = data.response.data.translations[0].translatedText;
            }
            this.translationElem.innerHTML = chatbotResponse;
            this.falarTexto(chatbotResponse);
        })
        .catch(error => console.error('Erro na comunicação com o chatbot:', error));
    }
    falarTexto(text) {
        const selectedVoiceName = document.getElementById('vozSelector').value;
        const msg = new SpeechSynthesisUtterance(text);
        const selectedVoice = this.voices.find(voice => voice.name == selectedVoiceName);
        msg.voice = selectedVoice;
        msg.lang = this.linguaDestino;
        msg.pitch = 0.9;
        msg.rate = 0.9;
        msg.onend = this.fimDaFala.bind(this);
        window.speechSynthesis.speak(msg);
    }
    fimDaFala(event) {
        clearInterval(this.interval);
    }
    selecionaLingua(buttonElem) {
        const selectedLang = buttonElem.getAttribute('data-lang');
        const buttons = document.querySelectorAll('.langButton');
        buttons.forEach(btn => {
            btn.classList.remove('selecao');
        });
        buttonElem.classList.add("selecao");
        this.linguaDestino = selectedLang;
    }
}
const avatarCompleto = new AvatarCompleto('transcription', 'translatedText');
 
  |