feat: removidos da tela Editar vídeo os passos legados de transcri
- removidos da tela Editar vídeo os passos legados de transcrição, falantes e métricas. Resumo: - 4 arquivos alterados - 0 novos - 4 modificados - 0 removidos 4 files changed, 35 insertions(+), 161 deletions(-) Arquivos: - .jhonny/analises.db - admin/PremiereMCP.command - code/cep-plugin/index.html - code/cep-plugin/main.js
This commit is contained in:
+6
-116
@@ -95,7 +95,7 @@
|
||||
|
||||
<section class="card scanner-analysis-card" id="scannerAnalysisCard">
|
||||
<div class="card-head"><h2>Análise do Scanner</h2><span class="step-chip" id="scannerAnalysisStatus">Não carregada</span></div>
|
||||
<p class="field-help" id="scannerAnalysisInfo">Carregue a análise mais recente do Scanner antes de gerar o plano de edição.</p>
|
||||
<p class="field-help" id="scannerAnalysisInfo">Carregue a análise mais recente do Scanner antes de concluir a edição.</p>
|
||||
<ul class="scanner-analysis-checks" id="scannerAnalysisChecks" aria-label="Componentes carregados da análise">
|
||||
<li id="scannerCheckTranscription" data-state="pending"><span class="check-dot" aria-hidden="true"></span><span>Transcrição</span><em>Aguardando</em></li>
|
||||
<li id="scannerCheckDiarization" data-state="pending"><span class="check-dot" aria-hidden="true"></span><span>Detecção de falantes</span><em>Aguardando</em></li>
|
||||
@@ -122,124 +122,14 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="step editar-video-legado" id="step2" data-state="locked">
|
||||
<section class="step" id="step2" data-state="locked">
|
||||
<div class="step-head">
|
||||
<span class="step-number" aria-hidden="true">2</span>
|
||||
<div class="step-title">
|
||||
<h2>Transcrever a fala</h2>
|
||||
<p>Gera o texto com marcação de tempo usando o Whisper local.</p>
|
||||
</div>
|
||||
<span class="step-chip" id="step2Chip">Bloqueado</span>
|
||||
</div>
|
||||
<div class="step-body">
|
||||
|
||||
<div class="callout callout-info" id="silenceCachedSection" hidden>
|
||||
<strong>Este vídeo já foi transcrito antes</strong>
|
||||
<p>Reaproveite e pule direto para o plano de cortes — leva segundos em vez de minutos.</p>
|
||||
<label class="field-label" for="silenceCachedSelect">Transcrição salva</label>
|
||||
<select id="silenceCachedSelect" class="select-field"></select>
|
||||
<button id="btnUseCachedTranscript" class="button button-primary" onclick="silenceUseCachedTranscript()" type="button">Usar esta transcrição</button>
|
||||
</div>
|
||||
|
||||
<!-- LEGADO comentado em 2026-09-09: transcrição/diarização/métricas de voz
|
||||
feitas aqui duplicavam o que a aba Scanner já faz e persiste no banco.
|
||||
Funções JS correspondentes (silenceTranscribe, silenceDiarizeSpeakers,
|
||||
silenceComputeVoiceFeatures) comentadas em main.js.
|
||||
<div class="field-grid">
|
||||
<div>
|
||||
<label class="field-label" for="silenceModel">Modelo</label>
|
||||
<select id="silenceModel" class="select-field">
|
||||
<option value="small" selected>small (recomendado)</option>
|
||||
<option value="base">base (mais rápido)</option>
|
||||
<option value="medium">medium (mais preciso)</option>
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<span class="field-label">Idioma</span>
|
||||
<p class="field-static" id="silenceLanguageInfo">Português</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label class="checkbox-field">
|
||||
<input type="checkbox" id="silenceDiarize">
|
||||
<span>Detectar quem fala logo após transcrever</span>
|
||||
</label>
|
||||
|
||||
<label class="checkbox-field">
|
||||
<input type="checkbox" id="silenceVoiceFeaturesAuto">
|
||||
<span>Calcular métricas de voz logo após transcrever</span>
|
||||
</label>
|
||||
-->
|
||||
|
||||
<div class="speaker-config" id="silenceSpeakerConfig" hidden>
|
||||
<div class="speaker-config-head">
|
||||
<strong>Falantes detectados</strong>
|
||||
<span id="silenceSpeakerCount"></span>
|
||||
</div>
|
||||
<p class="field-help">Dê um nome a cada falante e desative quem não deve aparecer no vídeo. A decisão será enviada no JSON para a IA.</p>
|
||||
<div id="silenceSpeakerList"></div>
|
||||
</div>
|
||||
|
||||
<div class="mini-action" id="silenceRemovalRow">
|
||||
<div>
|
||||
<label class="checkbox-field" style="border:none;padding:0;background:none">
|
||||
<input type="checkbox" id="silenceRemovalEnabled">
|
||||
<span>Remoção de silêncios</span>
|
||||
</label>
|
||||
<span>Só grava a preferência no JSON — não corta nada aqui. A IA decide os cortes usando esse valor.</span>
|
||||
</div>
|
||||
<div style="display:flex;align-items:center;gap:6px;flex:0 0 auto">
|
||||
<label class="field-label" for="silenceRemovalMinDuration" style="margin:0">Mín. (s)</label>
|
||||
<input type="number" id="silenceRemovalMinDuration" class="select-field" style="width:64px" step="0.1" min="0" value="0.8">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- LEGADO comentado em 2026-09-09 (ver nota acima).
|
||||
<button id="btnTranscribe" class="button button-primary" onclick="silenceTranscribe()" type="button" disabled>Transcrever</button>
|
||||
<p class="field-help" id="silenceCacheInfo"></p>
|
||||
-->
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- LEGADO comentado em 2026-09-09: "Refazer" chamava silenceDiarizeSpeakers()
|
||||
e silenceComputeVoiceFeatures(), agora comentadas em main.js — a aba
|
||||
Refinar já cobre revisão de falantes com dados vindos do Scanner.
|
||||
<section class="step step-optional" id="step3" data-state="locked">
|
||||
<div class="step-head">
|
||||
<span class="step-number" aria-hidden="true">3</span>
|
||||
<div class="step-title">
|
||||
<h2>Revisar falantes e áudio <span class="badge-optional">opcional</span></h2>
|
||||
<p>Confira os resultados processados e ajuste os dados antes de gerar o JSON.</p>
|
||||
</div>
|
||||
<span class="step-chip" id="step3Chip">Bloqueado</span>
|
||||
</div>
|
||||
<div class="step-body">
|
||||
<div class="mini-action">
|
||||
<div>
|
||||
<strong>Detecção de falantes</strong>
|
||||
<span id="silenceDiarizeInfo">Separa os falantes por trecho. Precisa do token Hugging Face.</span>
|
||||
</div>
|
||||
<button id="btnDiarize" class="button" onclick="silenceDiarizeSpeakers()" type="button" disabled>Refazer</button>
|
||||
</div>
|
||||
<div class="mini-action">
|
||||
<div>
|
||||
<strong>Métricas de voz</strong>
|
||||
<span id="silenceVoiceFeaturesInfo">Pitch, energia, velocidade de fala e pausas de cada trecho.</span>
|
||||
</div>
|
||||
<button id="btnVoiceFeatures" class="button" onclick="silenceComputeVoiceFeatures()" type="button" disabled>Refazer</button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
-->
|
||||
|
||||
<section class="step" id="step4" data-state="locked">
|
||||
<div class="step-head">
|
||||
<span class="step-number" aria-hidden="true">4</span>
|
||||
<div class="step-title">
|
||||
<h2>Concluir edição</h2>
|
||||
<p>Salva no banco a análise carregada, o tipo de vídeo e as configurações editoriais escolhidas. O JSON para a IA poderá ser gerado depois, quando necessário.</p>
|
||||
</div>
|
||||
<span class="step-chip" id="step4Chip">Bloqueado</span>
|
||||
<span class="step-chip" id="step2Chip">Bloqueado</span>
|
||||
</div>
|
||||
<div class="step-body">
|
||||
<button id="btnBuildPlan" class="button button-primary" onclick="silenceConcluirEdicao()" type="button" disabled>Concluir edição</button>
|
||||
@@ -255,14 +145,14 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="step" id="step5" data-state="locked">
|
||||
<section class="step" id="step3" data-state="locked">
|
||||
<div class="step-head">
|
||||
<span class="step-number" aria-hidden="true">5</span>
|
||||
<span class="step-number" aria-hidden="true">3</span>
|
||||
<div class="step-title">
|
||||
<h2>Aplicar na timeline</h2>
|
||||
<p>Selecione o plano de edição que a IA devolveu (cortes, zooms, textos, marcadores) e execute na sequência.</p>
|
||||
</div>
|
||||
<span class="step-chip" id="step5Chip">Bloqueado</span>
|
||||
<span class="step-chip" id="step3Chip">Bloqueado</span>
|
||||
</div>
|
||||
<div class="step-body">
|
||||
<label class="field-label" for="editorialPlanJson">JSON de ações devolvido pela IA</label>
|
||||
|
||||
+21
-36
@@ -2151,11 +2151,13 @@ function silenceSelecionarTipoVideo() {
|
||||
if (!tipo) {
|
||||
document.getElementById("silenceTipoVideoInfo").textContent = "Selecione um tipo cadastrado para continuar.";
|
||||
setStep(1, "ready", "Selecione um tipo");
|
||||
setStep(2, "locked", "Selecione o tipo");
|
||||
document.getElementById("btnBuildPlan").disabled = true;
|
||||
return;
|
||||
}
|
||||
document.getElementById("silenceTipoVideoInfo").textContent = tipo.nome + " · instruções serão incluídas no JSON para a IA.";
|
||||
setStep(1, "done", "Selecionado");
|
||||
setStep(2, "ready", "Pronto para concluir");
|
||||
document.getElementById("btnBuildPlan").disabled = false;
|
||||
silenceLog("Tipo de vídeo selecionado: " + tipo.nome + ".", "ok");
|
||||
}
|
||||
@@ -2371,10 +2373,9 @@ function silenceLoadScannerAnalysis() {
|
||||
info.textContent = silenceState.sequenceName + " · " + quantidade + " trecho(s) · " +
|
||||
(audioDoBanco.metricas_de_voz_disponiveis ? "métricas disponíveis" : "métricas não realizadas") + " · " +
|
||||
(audioDoBanco.diarizacao_disponivel ? falantes.length + " falante(s)" : "diarização não realizada");
|
||||
setStep(3, "ready", "Pronto");
|
||||
setStep(2, "locked", "Selecione o tipo");
|
||||
setStep(1, "ready", "Selecione um tipo");
|
||||
setStep(4, "locked", "Selecione o tipo");
|
||||
setStep(5, "locked", "Bloqueado");
|
||||
setStep(3, "locked", "Aguardando conclusão");
|
||||
renderizarTiposDeVideoParaEdicao();
|
||||
document.getElementById("btnBuildPlan").disabled = true;
|
||||
// btnDiarize/btnVoiceFeatures/silenceDiarizeInfo/silenceVoiceFeaturesInfo ficavam no
|
||||
@@ -2712,10 +2713,8 @@ function silenceDetectClip() {
|
||||
// muda — evita aplicar um plano gerado para outro material.
|
||||
function lockStepsFrom(first) {
|
||||
var buttons = {
|
||||
2: ["btnTranscribe"],
|
||||
3: ["btnDiarize", "btnVoiceFeatures"],
|
||||
4: ["btnBuildPlan"],
|
||||
5: ["btnApplyEditorialActions"],
|
||||
2: ["btnBuildPlan"],
|
||||
3: ["btnApplyEditorialActions"],
|
||||
};
|
||||
for (var n = first; n <= 5; n++) {
|
||||
setStep(n, "locked", "Bloqueado");
|
||||
@@ -2769,8 +2768,7 @@ function silenceUseCachedTranscript() {
|
||||
// Passos que dependem de existir uma transcrição, seja nova ou reaproveitada.
|
||||
function unlockAfterTranscript() {
|
||||
setStep(2, "done", "Transcrito");
|
||||
setStep(3, "ready", "Opcional");
|
||||
setStep(4, "ready", "Sua vez");
|
||||
setStep(2, "ready", "Pronto para concluir");
|
||||
document.getElementById("btnBuildPlan").disabled = false;
|
||||
// btnDiarize/btnVoiceFeatures ficavam no step3 (legado, comentado em 2026-09-09).
|
||||
var elBtnDiarize = document.getElementById("btnDiarize");
|
||||
@@ -3264,14 +3262,6 @@ function silenceConcluirEdicao() {
|
||||
configuracao: {
|
||||
nome_do_tipo: silenceState.tipoVideo.nome,
|
||||
instrucoes_do_tipo: tipoVideoResumoParaJson(silenceState.tipoVideo),
|
||||
configuracoes_de_fala: speakerConfigurationForJson(),
|
||||
configuracoes_de_edicao: {
|
||||
remocao_de_silencio: {
|
||||
habilitada: document.getElementById("silenceRemovalEnabled").checked,
|
||||
duracao_minima_segundos: Number(document.getElementById("silenceRemovalMinDuration").value) || 0.8,
|
||||
},
|
||||
legendas: carregarConfiguracaoDeLegendas(),
|
||||
},
|
||||
transcricao: {
|
||||
caminho: silenceState.transcriptPath,
|
||||
origem: "Scanner",
|
||||
@@ -3287,7 +3277,7 @@ function silenceConcluirEdicao() {
|
||||
}
|
||||
|
||||
setBusy("btnBuildPlan", true);
|
||||
setStep(4, "running", "Salvando…");
|
||||
setStep(2, "running", "Salvando…");
|
||||
taskStart("Concluindo a edição", "Salvando a configuração no banco");
|
||||
silenceLog("Salvando o tipo de vídeo e as configurações editoriais no banco…");
|
||||
runStreamed(
|
||||
@@ -3297,14 +3287,14 @@ function silenceConcluirEdicao() {
|
||||
function (codigo, ultimoErro) {
|
||||
setBusy("btnBuildPlan", false);
|
||||
if (codigo !== 0) {
|
||||
setStep(4, "error", "Falhou");
|
||||
setStep(2, "error", "Falhou");
|
||||
taskEnd(false, "Não foi possível concluir a edição.", ultimoErro);
|
||||
silenceLog("Falha ao salvar a configuração editorial.", "err");
|
||||
showToast("err", ultimoErro || "Não foi possível salvar a edição no banco.");
|
||||
return;
|
||||
}
|
||||
setStep(4, "done", "Edição concluída");
|
||||
setStep(5, "locked", "Aguardando plano da IA");
|
||||
setStep(2, "done", "Edição concluída");
|
||||
setStep(3, "locked", "Aguardando plano da IA");
|
||||
taskEnd(true, "Edição concluída e salva no banco.");
|
||||
silenceLog("Edição concluída e salva no banco de análises.", "ok");
|
||||
showToast("ok", "Edição concluída e salva no banco.");
|
||||
@@ -3323,20 +3313,15 @@ function silenceGenerateJson() {
|
||||
return;
|
||||
}
|
||||
setBusy("btnBuildPlan", true);
|
||||
setStep(4, "running", "Gerando…");
|
||||
setStep(2, "running", "Gerando…");
|
||||
silenceLog("Gerando arquivo JSON para a IA…");
|
||||
try {
|
||||
var transcript = JSON.parse(fs.readFileSync(silenceState.transcriptPath, "utf-8"));
|
||||
var silenceEnabled = document.getElementById("silenceRemovalEnabled").checked;
|
||||
var minSilence = parseFloat(document.getElementById("silenceRemovalMinDuration").value);
|
||||
if (!isFinite(minSilence) || minSilence < 0) minSilence = 0.8;
|
||||
|
||||
transcript.sequence = {
|
||||
name: silenceState.sequenceName,
|
||||
media_path: silenceState.mediaPath,
|
||||
};
|
||||
transcript.settings = Object.assign({}, transcript.settings, {
|
||||
silence_removal: { enabled: silenceEnabled, min_silence_seconds: minSilence },
|
||||
legendas: carregarConfiguracaoDeLegendas(),
|
||||
});
|
||||
transcript.speaker_configuration = speakerConfigurationForJson();
|
||||
@@ -3361,13 +3346,13 @@ function silenceGenerateJson() {
|
||||
document.getElementById("silencePlanInfo").textContent =
|
||||
"Envie este arquivo a um agente de IA externo. Ele deve devolver o plano de edição em JSON para o passo 5.";
|
||||
|
||||
setStep(4, "done", "JSON pronto");
|
||||
setStep(5, "ready", "Sua vez");
|
||||
setStep(2, "done", "JSON pronto");
|
||||
setStep(3, "ready", "Sua vez");
|
||||
document.getElementById("btnApplyEditorialActions").disabled = false;
|
||||
showToast("ok", "JSON gerado: " + path.basename(out));
|
||||
silenceLog("JSON gerado em " + out + " (" + segCount + " trechos).", "ok");
|
||||
} catch (e) {
|
||||
setStep(4, "error", "Falhou");
|
||||
setStep(2, "error", "Falhou");
|
||||
showToast("err", "Falha ao gerar o JSON: " + e.message);
|
||||
silenceLog("Falha ao gerar o JSON: " + e.message, "err");
|
||||
}
|
||||
@@ -3442,7 +3427,7 @@ function applyEditorialActions() {
|
||||
if (typeof window.confirm === "function" && !window.confirm(summary)) return;
|
||||
|
||||
setBusy("btnApplyEditorialActions", true);
|
||||
setStep(5, "running", "Aplicando…");
|
||||
setStep(3, "running", "Aplicando…");
|
||||
taskStart("Aplicando o plano de edição", "Criando backup da sequência");
|
||||
silenceLog("Criando backup da sequência…");
|
||||
cs.evalScript(
|
||||
@@ -3457,7 +3442,7 @@ function applyEditorialActions() {
|
||||
var caminhoDoPlano = path.join(silenceState.outputDir || os.tmpdir(), "plano-editorial-" + Date.now() + ".json");
|
||||
try { fs.writeFileSync(caminhoDoPlano, JSON.stringify(plan, null, 2), "utf-8"); } catch (erroEscrita) {
|
||||
setBusy("btnApplyEditorialActions", false);
|
||||
setStep(5, "error", "Falhou");
|
||||
setStep(3, "error", "Falhou");
|
||||
taskEnd(false, "Não foi possível salvar o plano.", erroEscrita.message);
|
||||
return;
|
||||
}
|
||||
@@ -3474,12 +3459,12 @@ function applyEditorialActions() {
|
||||
processoAplicacao = null;
|
||||
setBusy("btnApplyEditorialActions", false);
|
||||
if (code !== 0) {
|
||||
setStep(5, "error", "Falhou");
|
||||
setStep(3, "error", "Falhou");
|
||||
taskEnd(false, "Falha ao aplicar o plano (código " + code + ").", lastErr);
|
||||
silenceLog("Falha ao aplicar o plano (código " + code + ").", "err");
|
||||
return;
|
||||
}
|
||||
setStep(5, "done", "Aplicado");
|
||||
setStep(3, "done", "Aplicado");
|
||||
taskEnd(true, numActions + " ação(ões) aplicadas na timeline!");
|
||||
silenceLog("Plano de edição aplicado com sucesso!", "ok");
|
||||
}
|
||||
@@ -4134,8 +4119,8 @@ function downloadModel(model, btn, approxMB) {
|
||||
setStep(1, "locked", "Scanner");
|
||||
setStep(2, "locked", "Scanner");
|
||||
setStep(3, "locked", "Aguardando análise");
|
||||
setStep(4, "locked", "Aguardando análise");
|
||||
setStep(5, "locked", "Aguardando plano");
|
||||
setStep(2, "locked", "Aguardando análise");
|
||||
setStep(3, "locked", "Aguardando análise");
|
||||
|
||||
log("MCP for Adobe Premiere Pro CEP connector loaded");
|
||||
setStatus("waiting", "Aguardando — a ponte está iniciando");
|
||||
|
||||
Reference in New Issue
Block a user