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