import json from pathlib import Path from engine.integracoes.midia import ExtracaoDeAudio from engine.integracoes.whisper import ProviderDeTranscricaoLocal from engine.integracoes.huggingface import (ProviderDeDiarizacaoHuggingFace, ProviderDeEmocaoHuggingFace) from engine.integracoes.premiere.cliente_mcp import ClienteMCPPorStdio from engine.integracoes.premiere.conversores import ConversorDeTimeline from engine.scanner.transcricao_da_timeline import TranscricaoDaTimeline ARQUIVO = Path('/Volumes/Merongo/PROJETOS/03 - Mastopexia/0E6A8290.MP4') CHAVE = json.loads((Path.home()/'.premiere-mcp/config.json').read_text()).get('groqApiKey','') SAIDA = Path('/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code/relatorios') cliente = ClienteMCPPorStdio(['node', str(Path(__file__).resolve().parents[1] / 'dist/index.js')]) cliente.conectar() bruta = cliente.chamar('get_active_sequence', {})['structuredContent']['data'] timeline = ConversorDeTimeline().converter(bruta) for faixa in timeline.faixas: for clipe in faixa.clipes: if clipe.nome == '0E6A8290.MP4': clipe.arquivo = str(ARQUIVO) MODELO = Path('/Volumes/Merongo/SISTEMAS/MODELOSIA/hf-cache/hub/models--mobiuslabsgmbh--faster-whisper-large-v3-turbo/snapshots/0a363e9161cbc7ed1431c9597a8ceaf0c4f78fcf') provider = ProviderDeTranscricaoLocal(str(MODELO), idioma='pt') MODELO_EMOCAO = Path('/Volumes/Merongo/SISTEMAS/MODELOSIA/models/wav2vec2-xls-r-300m-pt-br-spontaneous-speech-emotion-recognition') analisador_de_emocao = ProviderDeEmocaoHuggingFace(str(MODELO_EMOCAO)) MODELO_DIARIZACAO = Path('/Volumes/Merongo/SISTEMAS/MODELOSIA/models/pyannote-speaker-diarization-community-1') diarizador = ProviderDeDiarizacaoHuggingFace(str(MODELO_DIARIZACAO)) transcricoes = TranscricaoDaTimeline(provider, ExtracaoDeAudio(duracao_da_parte=600), SAIDA/'audio', analisador_de_emocao, diarizador).executar(timeline) linhas = [f'# Relatório de transcrição — {timeline.nome}', '', f'Duração: {bruta["end"]:.3f} s', f'Clipes processados: {sum(len(f.clipes) for f in timeline.faixas if f.tipo == "video")}', ''] for faixa in timeline.faixas: if faixa.tipo != 'video': continue for clipe in faixa.clipes: if clipe.nome != '0E6A8290.MP4': continue resultado = next((r for r in transcricoes if r.identificador_do_clipe == clipe.identificador), None) intervalo = clipe.intervalo_na_origem texto = resultado.texto if resultado else '' linhas += [f'## {clipe.identificador} — {clipe.intervalo_na_timeline.inicio:.3f}s–{clipe.intervalo_na_timeline.fim:.3f}s', f'Origem: {intervalo.inicio:.3f}s–{intervalo.fim:.3f}s', '', texto or '_Sem fala detectada._', ''] if resultado and resultado.segmentos: linhas.append('Emoções detectadas por segmento:') for segmento in resultado.segmentos: if segmento.emocao: voz = f', voz {segmento.voz_aparente}' if segmento.voz_aparente else '' linhas.append(f'- [{segmento.inicio:.3f}s–{segmento.fim:.3f}s] {segmento.falante or "falante_indefinido"}: {segmento.emocao} ({segmento.confianca_emocao:.2f}{voz})') linhas.append('') for segmento in resultado.segmentos if resultado else []: for palavra in segmento.palavras: linhas.append(f'- [{palavra.inicio:.3f}s–{palavra.fim:.3f}s] {palavra.texto}') if resultado and resultado.segmentos: linhas.append('') (SAIDA/'transcricao-timeline.md').write_text('\n'.join(linhas), encoding='utf-8') print(SAIDA/'transcricao-timeline.md')