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.
Files changed (102) hide show
  1. package/README.md +41 -37
  2. package/bin/primocode.js +598 -360
  3. package/lib/acervo.js +8 -1
  4. package/lib/act.js +205 -114
  5. package/lib/api.js +35 -4
  6. package/lib/boas-vindas.js +31 -192
  7. package/lib/catalogo.js +60 -60
  8. package/lib/config.js +1 -1
  9. package/lib/conta.js +3 -24
  10. package/lib/diff.js +161 -0
  11. package/lib/diretor.js +37 -47
  12. package/lib/entrada.js +545 -0
  13. package/lib/especialistas.js +2 -2
  14. package/lib/estudio/assets.js +343 -0
  15. package/lib/estudio/identidade.js +560 -0
  16. package/lib/estudio/index.js +565 -0
  17. package/lib/estudio/plano.js +327 -0
  18. package/lib/estudio/projeto.js +246 -0
  19. package/lib/estudio/remotion.js +606 -0
  20. package/lib/estudio/slides.js +190 -0
  21. package/lib/estudio/video.js +296 -0
  22. package/lib/fala.js +13 -1
  23. package/lib/marca.js +4 -1
  24. package/lib/marketplace.js +189 -0
  25. package/lib/permissao.js +137 -0
  26. package/lib/registro.js +229 -0
  27. package/lib/skills.js +329 -0
  28. package/lib/tools.js +51 -181
  29. package/lib/ui.js +7 -3
  30. package/lib/voz.js +239 -0
  31. package/package.json +12 -3
  32. package/skills/acessibilidade/SKILL.md +28 -0
  33. package/skills/api-que-nao-quebra/SKILL.md +27 -0
  34. package/skills/depurar-de-verdade/SKILL.md +29 -0
  35. package/skills/editar-meu-video/SKILL.md +59 -0
  36. package/skills/escrever-em-portugues/SKILL.md +28 -0
  37. package/skills/git-limpo/SKILL.md +28 -0
  38. package/skills/motion-de-primeira/SKILL.md +62 -0
  39. package/skills/pagina-que-converte/SKILL.md +28 -0
  40. package/skills/performance-web/SKILL.md +28 -0
  41. package/skills/revisao-antes-de-entregar/SKILL.md +27 -0
  42. package/skills/slides-que-prendem/SKILL.md +40 -0
  43. package/studio/edge.py +16 -66
  44. package/studio/narrar.py +274 -0
  45. package/studio/pessoa.py +167 -0
  46. package/voz/primo_voz/__init__.py +0 -0
  47. package/voz/primo_voz/__main__.py +325 -0
  48. package/voz/primo_voz/escuta.py +235 -0
  49. package/voz/primo_voz/orbe.py +216 -0
  50. package/lib/audio-livre.js +0 -177
  51. package/lib/chaves.js +0 -149
  52. package/lib/claude-engine.js +0 -631
  53. package/lib/codex-engine.js +0 -208
  54. package/lib/remotion.js +0 -663
  55. package/lib/studio.js +0 -960
  56. package/studio/PRIMOCODE.md +0 -58
  57. package/studio/README.md +0 -154
  58. package/studio/__pycache__/edge.cpython-311.pyc +0 -0
  59. package/studio/__pycache__/elevenlabs.cpython-311.pyc +0 -0
  60. package/studio/__pycache__/voz.cpython-311.pyc +0 -0
  61. package/studio/arquivos/corte-teste-de-camera-fb823.json +0 -57
  62. package/studio/ferramentas/00-protocolo.md +0 -125
  63. package/studio/ferramentas/01-modelos.md +0 -270
  64. package/studio/ferramentas/README.md +0 -32
  65. package/studio/ferramentas/corte.md +0 -919
  66. package/studio/ferramentas/grade.md +0 -92
  67. package/studio/ferramentas/prisma.md +0 -107
  68. package/studio/ferramentas/prosa.md +0 -86
  69. package/studio/ferramentas/tela.md +0 -93
  70. package/studio/ferramentas/traco.md +0 -79
  71. package/studio/server.py +0 -2254
  72. package/studio/studio.log +0 -57
  73. package/studio/voz.py +0 -388
  74. package/studio/web/analise.html +0 -52
  75. package/studio/web/core.css +0 -1167
  76. package/studio/web/fontes/bebas.woff2 +0 -0
  77. package/studio/web/fontes/grotesk-700.woff2 +0 -0
  78. package/studio/web/fontes/inter-400.woff2 +0 -0
  79. package/studio/web/fontes/inter-700.woff2 +0 -0
  80. package/studio/web/fontes/jetbrains-400.woff2 +0 -0
  81. package/studio/web/fontes/playfair-700.woff2 +0 -0
  82. package/studio/web/fontes.css +0 -23
  83. package/studio/web/home.html +0 -217
  84. package/studio/web/js/analise.js +0 -510
  85. package/studio/web/js/audio.js +0 -607
  86. package/studio/web/js/editor.js +0 -1802
  87. package/studio/web/js/exportar.js +0 -222
  88. package/studio/web/js/ferramentas.js +0 -108
  89. package/studio/web/js/icones.js +0 -120
  90. package/studio/web/js/midia.js +0 -157
  91. package/studio/web/js/narracao.js +0 -325
  92. package/studio/web/js/player.js +0 -903
  93. package/studio/web/js/render-grade.js +0 -243
  94. package/studio/web/js/render-prosa.js +0 -104
  95. package/studio/web/js/render.js +0 -1852
  96. package/studio/web/js/sfx.js +0 -233
  97. package/studio/web/js/video.js +0 -464
  98. package/studio/web/js/voz-neural.js +0 -152
  99. package/studio/web/render.css +0 -1352
  100. package/studio/web/tf.html +0 -15
  101. package/studio/web/tool.html +0 -78
  102. 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;