primocode 8.42.2 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -37
- package/bin/primocode.js +598 -360
- package/lib/acervo.js +8 -1
- package/lib/act.js +205 -114
- package/lib/api.js +35 -4
- package/lib/boas-vindas.js +31 -192
- package/lib/catalogo.js +60 -60
- package/lib/config.js +1 -1
- package/lib/conta.js +3 -24
- package/lib/diff.js +161 -0
- package/lib/diretor.js +37 -47
- package/lib/entrada.js +545 -0
- package/lib/especialistas.js +2 -2
- package/lib/estudio/assets.js +343 -0
- package/lib/estudio/identidade.js +560 -0
- package/lib/estudio/index.js +565 -0
- package/lib/estudio/plano.js +327 -0
- package/lib/estudio/projeto.js +246 -0
- package/lib/estudio/remotion.js +606 -0
- package/lib/estudio/slides.js +190 -0
- package/lib/estudio/video.js +296 -0
- package/lib/fala.js +13 -1
- package/lib/marca.js +4 -1
- package/lib/marketplace.js +189 -0
- package/lib/permissao.js +137 -0
- package/lib/registro.js +229 -0
- package/lib/skills.js +329 -0
- package/lib/tools.js +51 -181
- package/lib/ui.js +7 -3
- package/lib/voz.js +239 -0
- package/package.json +12 -3
- package/skills/acessibilidade/SKILL.md +28 -0
- package/skills/api-que-nao-quebra/SKILL.md +27 -0
- package/skills/depurar-de-verdade/SKILL.md +29 -0
- package/skills/editar-meu-video/SKILL.md +59 -0
- package/skills/escrever-em-portugues/SKILL.md +28 -0
- package/skills/git-limpo/SKILL.md +28 -0
- package/skills/motion-de-primeira/SKILL.md +62 -0
- package/skills/pagina-que-converte/SKILL.md +28 -0
- package/skills/performance-web/SKILL.md +28 -0
- package/skills/revisao-antes-de-entregar/SKILL.md +27 -0
- package/skills/slides-que-prendem/SKILL.md +40 -0
- package/studio/edge.py +16 -66
- package/studio/narrar.py +274 -0
- package/studio/pessoa.py +167 -0
- package/voz/primo_voz/__init__.py +0 -0
- package/voz/primo_voz/__main__.py +325 -0
- package/voz/primo_voz/escuta.py +235 -0
- package/voz/primo_voz/orbe.py +216 -0
- package/lib/audio-livre.js +0 -177
- package/lib/chaves.js +0 -149
- package/lib/claude-engine.js +0 -631
- package/lib/codex-engine.js +0 -208
- package/lib/remotion.js +0 -663
- package/lib/studio.js +0 -960
- package/studio/PRIMOCODE.md +0 -58
- package/studio/README.md +0 -154
- package/studio/__pycache__/edge.cpython-311.pyc +0 -0
- package/studio/__pycache__/elevenlabs.cpython-311.pyc +0 -0
- package/studio/__pycache__/voz.cpython-311.pyc +0 -0
- package/studio/arquivos/corte-teste-de-camera-fb823.json +0 -57
- package/studio/ferramentas/00-protocolo.md +0 -125
- package/studio/ferramentas/01-modelos.md +0 -270
- package/studio/ferramentas/README.md +0 -32
- package/studio/ferramentas/corte.md +0 -919
- package/studio/ferramentas/grade.md +0 -92
- package/studio/ferramentas/prisma.md +0 -107
- package/studio/ferramentas/prosa.md +0 -86
- package/studio/ferramentas/tela.md +0 -93
- package/studio/ferramentas/traco.md +0 -79
- package/studio/server.py +0 -2254
- package/studio/studio.log +0 -57
- package/studio/voz.py +0 -388
- package/studio/web/analise.html +0 -52
- package/studio/web/core.css +0 -1167
- package/studio/web/fontes/bebas.woff2 +0 -0
- package/studio/web/fontes/grotesk-700.woff2 +0 -0
- package/studio/web/fontes/inter-400.woff2 +0 -0
- package/studio/web/fontes/inter-700.woff2 +0 -0
- package/studio/web/fontes/jetbrains-400.woff2 +0 -0
- package/studio/web/fontes/playfair-700.woff2 +0 -0
- package/studio/web/fontes.css +0 -23
- package/studio/web/home.html +0 -217
- package/studio/web/js/analise.js +0 -510
- package/studio/web/js/audio.js +0 -607
- package/studio/web/js/editor.js +0 -1802
- package/studio/web/js/exportar.js +0 -222
- package/studio/web/js/ferramentas.js +0 -108
- package/studio/web/js/icones.js +0 -120
- package/studio/web/js/midia.js +0 -157
- package/studio/web/js/narracao.js +0 -325
- package/studio/web/js/player.js +0 -903
- package/studio/web/js/render-grade.js +0 -243
- package/studio/web/js/render-prosa.js +0 -104
- package/studio/web/js/render.js +0 -1852
- package/studio/web/js/sfx.js +0 -233
- package/studio/web/js/video.js +0 -464
- package/studio/web/js/voz-neural.js +0 -152
- package/studio/web/render.css +0 -1352
- package/studio/web/tf.html +0 -15
- package/studio/web/tool.html +0 -78
- package/studio/web/view.html +0 -27
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/* ==========================================================================
|
|
2
|
-
voz-neural.js — locução com voz de verdade.
|
|
3
|
-
|
|
4
|
-
── O QUE MUDOU, E POR QUÊ ──────────────────────────────────────────────
|
|
5
|
-
Este arquivo já tentou sintetizar no próprio navegador, falando por
|
|
6
|
-
WebSocket com o serviço de leitura em voz alta do Edge. Não funciona
|
|
7
|
-
mais: a Microsoft passou a responder 403 na síntese. A lista de vozes
|
|
8
|
-
ainda responde, o que enganava — parecia vivo e não estava.
|
|
9
|
-
|
|
10
|
-
Com o caminho neural morto, toda narração caía no speechSynthesis, o TTS
|
|
11
|
-
da própria máquina. Ele existe em todo computador, e é justamente por
|
|
12
|
-
isso que soa a computador. Era o que se ouvia em TODO vídeo.
|
|
13
|
-
|
|
14
|
-
Agora a síntese acontece no servidor do Studio, em Python (studio/voz.py),
|
|
15
|
-
com o Piper: rede neural que roda na máquina do usuário, offline, sem
|
|
16
|
-
chave, sem cota e sem limite — e com vozes graves de verdade, escolhidas
|
|
17
|
-
por frequência MEDIDA, não por adjetivo. Este arquivo virou o que devia
|
|
18
|
-
ter sido desde o começo: um cliente magro de /api/voz.
|
|
19
|
-
|
|
20
|
-
A vantagem não é só timbre. O servidor devolve um Blob, e Blob serve
|
|
21
|
-
tanto para tocar quanto para ir junto no vídeo exportado — coisa que o
|
|
22
|
-
speechSynthesis nunca permitiu, porque ele fala e some.
|
|
23
|
-
========================================================================== */
|
|
24
|
-
|
|
25
|
-
var VozNeural = (function () {
|
|
26
|
-
"use strict";
|
|
27
|
-
|
|
28
|
-
/* Preenchido por /api/voz/status na primeira consulta. Começa com a voz
|
|
29
|
-
padrão do servidor para a interface ter o que mostrar antes da resposta. */
|
|
30
|
-
var VOZES = [];
|
|
31
|
-
var estado = null;
|
|
32
|
-
|
|
33
|
-
function status(forcar) {
|
|
34
|
-
if (estado && !forcar) return Promise.resolve(estado);
|
|
35
|
-
return fetch("/api/voz/status")
|
|
36
|
-
.then(function (r) { return r.json(); })
|
|
37
|
-
.then(function (s) {
|
|
38
|
-
estado = s;
|
|
39
|
-
VOZES = (s.piper && s.piper.vozes) || [];
|
|
40
|
-
return s;
|
|
41
|
-
})
|
|
42
|
-
.catch(function () { return { piper: { pronta: false, vozes: [] } }; });
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function vozes() { return VOZES.slice(); }
|
|
46
|
-
function graves() { return VOZES.filter(function (v) { return v.grave; }); }
|
|
47
|
-
function vozPadrao() {
|
|
48
|
-
var p = VOZES.filter(function (v) { return v.padrao; })[0];
|
|
49
|
-
return p ? p.id : "";
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/* Manda baixar o motor e a voz. A interface chama isto quando o usuário
|
|
53
|
-
escolhe uma voz que ainda não está na máquina. */
|
|
54
|
-
function instalar(voz, esperar) {
|
|
55
|
-
return fetch("/api/voz/instalar", {
|
|
56
|
-
method: "POST",
|
|
57
|
-
headers: { "Content-Type": "application/json" },
|
|
58
|
-
body: JSON.stringify({ voz: voz || "", esperar: esperar || 0 }),
|
|
59
|
-
}).then(function (r) { return r.json(); });
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/* --------------------------------------------------------------- fala --- */
|
|
63
|
-
|
|
64
|
-
/* O texto vira áudio pelo melhor motor que o servidor tiver pronto. O
|
|
65
|
-
navegador não decide nada: só pede e toca. */
|
|
66
|
-
function audioDe(texto, cfg) {
|
|
67
|
-
cfg = cfg || {};
|
|
68
|
-
var t = String(texto || "").trim();
|
|
69
|
-
if (!t) return Promise.reject(new Error("sem texto"));
|
|
70
|
-
|
|
71
|
-
var q = "texto=" + encodeURIComponent(t);
|
|
72
|
-
if (cfg.voz) q += "&voz=" + encodeURIComponent(cfg.voz);
|
|
73
|
-
if (cfg.motor) q += "&motor=" + encodeURIComponent(cfg.motor);
|
|
74
|
-
if (cfg.grave) q += "&grave=1";
|
|
75
|
-
if (cfg.velocidade) q += "&velocidade=" + encodeURIComponent(cfg.velocidade);
|
|
76
|
-
|
|
77
|
-
return fetch("/api/voz?" + q).then(function (r) {
|
|
78
|
-
if (!r.ok) throw new Error("voz do servidor falhou (" + r.status + ")");
|
|
79
|
-
return r.blob();
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/* Quanto tempo a narração vai levar, SEM tocar nada.
|
|
84
|
-
|
|
85
|
-
O editor precisa disso para ajustar a duração da cena ao texto. Antes
|
|
86
|
-
ele media falando com volume zero — funcionava porque o speechSynthesis
|
|
87
|
-
obedece volume. Agora o áudio vem em Blob, e "tocar mudo" seria tocar
|
|
88
|
-
alto. Os metadados do arquivo já trazem a duração exata: é só perguntar,
|
|
89
|
-
e é mais preciso do que cronometrar a fala. */
|
|
90
|
-
function duracaoDe(texto, cfg) {
|
|
91
|
-
return audioDe(texto, cfg).then(function (blob) {
|
|
92
|
-
return new Promise(function (ok) {
|
|
93
|
-
var a = new Audio();
|
|
94
|
-
var url = URL.createObjectURL(blob);
|
|
95
|
-
var respondeu = false;
|
|
96
|
-
function fim(s) {
|
|
97
|
-
if (respondeu) return;
|
|
98
|
-
respondeu = true;
|
|
99
|
-
URL.revokeObjectURL(url);
|
|
100
|
-
ok(s);
|
|
101
|
-
}
|
|
102
|
-
a.onloadedmetadata = function () {
|
|
103
|
-
fim(isFinite(a.duration) && a.duration > 0 ? a.duration : 0);
|
|
104
|
-
};
|
|
105
|
-
a.onerror = function () { fim(0); };
|
|
106
|
-
setTimeout(function () { fim(0); }, 8000);
|
|
107
|
-
a.preload = "metadata";
|
|
108
|
-
a.src = url;
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
var tocando = null;
|
|
114
|
-
|
|
115
|
-
function falar(texto, cfg) {
|
|
116
|
-
return audioDe(texto, cfg).then(function (blob) {
|
|
117
|
-
return new Promise(function (ok) {
|
|
118
|
-
parar();
|
|
119
|
-
var a = new Audio(URL.createObjectURL(blob));
|
|
120
|
-
tocando = a;
|
|
121
|
-
a.onended = a.onerror = function () { URL.revokeObjectURL(a.src); ok(); };
|
|
122
|
-
a.play().catch(function () { ok(); });
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function parar() {
|
|
128
|
-
if (tocando) { try { tocando.pause(); } catch (e) {} tocando = null; }
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/* O player pergunta isto para segurar a cena até a voz acabar. */
|
|
132
|
-
function falando() {
|
|
133
|
-
return !!(tocando && !tocando.paused && !tocando.ended);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/* Serve para a interface avisar antes de o usuário montar o vídeo inteiro. */
|
|
137
|
-
function testar(cfg) {
|
|
138
|
-
return audioDe("Teste de voz do PrimoCode Studio.", cfg)
|
|
139
|
-
.then(function (b) { return { ok: true, bytes: b.size }; })
|
|
140
|
-
.catch(function (e) { return { ok: false, error: e.message }; });
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
status();
|
|
144
|
-
|
|
145
|
-
return {
|
|
146
|
-
vozes: vozes, vozPadrao: vozPadrao, graves: graves, status: status,
|
|
147
|
-
instalar: instalar, duracaoDe: duracaoDe,
|
|
148
|
-
audioDe: audioDe, falar: falar, parar: parar, falando: falando, testar: testar,
|
|
149
|
-
};
|
|
150
|
-
})();
|
|
151
|
-
|
|
152
|
-
if (typeof module !== "undefined" && module.exports) module.exports = VozNeural;
|