feat: Instalado essentia-tensorflow no venv whisperx-transcricao (

- Instalado essentia-tensorflow no venv whisperx-transcricao (usado pelo painel CEP), corrigindo erro "A classificação musical precisa do suporte TensorFlow do Essentia" no catálogo de trilhas.
- Ligada a classificação de emoção da fala (ProviderDeEmocaoHuggingFace) ao scanner via nova flag `classificar_emocao`, e adicionado emoção/confiança como critério de desempate secundário no zoom da skill editar-por-voz.
- Zoom do caminho Python (aplicar_plano_de_edicao.py) passou a usar adjustment layer numa faixa de vídeo própria, em vez de escalar o clipe inteiro via set_clip_properties — mesma técnica já usada pelo executor .mjs do painel CEP.
- Adicionado campo "Carregar por ID" na aba Editar Vídeo do painel CEP (step 2), para carregar um plano do SQLite direto pelo plano_id quando ele não está associado a nenhum video_id conhecido (ex.: plano de um vídeo que este banco nunca escaneou).
- Trocado o campo de ID numérico por uma lista suspensa (novo listar_planos_de_edicao.py + RepositorioDePlanos.listar_todos_os_planos) que mostra data/hora e a intenção registrada pela skill em cada plano salvo, para escolher sem decorar o id.

Resumo:
- 15 arquivos alterados
- 2 novos
- 13 modificados
- 0 removidos

 13 files changed, 451 insertions(+), 65 deletions(-)

Arquivos:
  - .jhonny/analises.db
  - code/cep-plugin/index.html
  - code/cep-plugin/main.js
  - code/engine/editor/aplicador_de_plano_de_edicao.py
  - code/engine/editor/escrita/escrita_no_editor.py
  - code/engine/executar_scanner.py
  - code/engine/persistencia/repositorio_de_planos.py
  - code/engine/scanner/configuracao_visual.py
  - code/engine/testes/duplos_de_premiere.py
  - code/engine/testes/test_aplicador_de_plano_de_edicao.py
  - code/engine/testes/test_escrita_no_editor.py
  - code/plugins/premiere-pro/skills/editar-por-voz/criterios/01-leitura-do-json.md
  - code/plugins/premiere-pro/skills/editar-por-voz/criterios/05-zoom.md
  - code/engine/listar_planos_de_edicao.py
  - code/engine/testes/test_configuracao_visual_do_scanner.py
This commit is contained in:
João Henrique
2026-09-10 16:04:15 -04:00
parent 2c9bdf2ff0
commit dd341e7d4c
15 changed files with 520 additions and 64 deletions
+10 -2
View File
@@ -182,6 +182,7 @@ def executar(entrada: Path, saida: Path) -> Path:
transcricao_configurada = {
**transcricao_configurada,
"metricas_de_fala": configuracao.metricas_de_fala,
"classificar_emocao": configuracao.classificar_emocao,
}
if faixas_de_audio and transcricao_configurada.get("caminho_modelo"):
try:
@@ -196,6 +197,10 @@ def executar(entrada: Path, saida: Path) -> Path:
analisador_de_metricas_de_voz = (
AnalisadorDeMetricasDeVoz() if configuracao.metricas_de_fala else None
)
analisador_de_emocao = None
if configuracao.classificar_emocao:
from engine.integracoes.huggingface import ProviderDeEmocaoHuggingFace
analisador_de_emocao = ProviderDeEmocaoHuggingFace()
diarizador = None
if transcricao_configurada.get("diarizacao"):
if not os.environ.get("HF_TOKEN"):
@@ -210,7 +215,8 @@ def executar(entrada: Path, saida: Path) -> Path:
emitir("Transcrevendo áudio", 5)
transcricoes = TranscricaoDaTimeline(provider, diretoria_de_trabalho=pasta / ".cache-audio",
diarizador=diarizador,
analisador_de_metricas_de_voz=analisador_de_metricas_de_voz).executar(
analisador_de_metricas_de_voz=analisador_de_metricas_de_voz,
analisador_de_emocao=analisador_de_emocao).executar(
Timeline(timeline.identificador, timeline.nome, faixas=faixas_de_audio))
# Persiste a transcrição (segmentos + falas) no banco de análises.
repositorio_de_analises.substituir_transcricoes(timeline.identificador, transcricoes)
@@ -218,7 +224,9 @@ def executar(entrada: Path, saida: Path) -> Path:
transcricoes_por_clipe[transcricao.identificador_do_clipe] = [
{"inicio": item.inicio, "fim": item.fim, "texto": item.texto,
"confianca": item.confianca, "falante": item.falante,
"caracteristicas_acusticas": item.caracteristicas_acusticas}
"caracteristicas_acusticas": item.caracteristicas_acusticas,
"emocao": item.emocao, "confianca_emocao": item.confianca_emocao,
"voz_aparente": item.voz_aparente, "confianca_voz": item.confianca_voz}
for item in transcricao.segmentos]
except (ImportError, OSError, RuntimeError, ValueError) as erro:
# Dependência ausente (ex.: soundfile), modelo/áudio ilegível, ou