Criar Vídeo por Template (chinês)
Transforma conteúdo chinês em um vídeo curto vertical 9:16. O design e as animações são gerenciados pelos templates HyperFrames em templates/; você só precisa preencher os campos de texto e o script.json.
Informações de instalação (ambiente DSH, leia primeiro)
-
PROJECT_DIR =
/Users/ming/.agents/skills/create-template-video-zh(skill + pipeline + templates;node_moduleslink simbólico para a versão vietnamita, dependências compartilhadas) -
Estrutura de diretórios:
SKILL.md,templates/(11 templates +CATALOG.md),src/(CLI/pipeline),package.json,.env(endpoint TTS chinês). -
Mapeamento de ferramentas: o original usa nomes de ferramentas Claude Code, aqui correspondem a DSH:
WebFetch→web_fetch,Read→read,Write→write,Bash→bash. -
Dependências de ambiente:
ffmpeg/ffprobe✓, Chrome ✓, Node ✓. -
TTS chinês implantado localmente: OmniVoice (MPS) + timbre clonado mandarim
voice-zh.pt, rodando na porta 8124 (a versão vietnamita usa fixo 8123, as duas não interferem):bash "$HOME/.agents/skills/create-template-video-zh/scripts/start-tts-zh.sh"O script verifica
/health, inicia o serviço em segundo plano e aguarda até ficar pronto (cerca de 4 s), o log fica em/tmp/omnivoice-zh.log. Após iniciar, confirme com uma sonda em chinês:curl -s -X POST http://127.0.0.1:8124/tts -H 'Content-Type: application/json' \ -d '{"text":"大家好,这是中文配音测试。"}' -o /tmp/zh-probe.mp3 && ls -l /tmp/zh-probe.mp3000/não conecta = não iniciou; se não iniciar, pare e avise o usuário, não forje áudio. Diretório do serviço e notas de implantação:/Users/ming/Documents/dsh_workspace/omnivoice(SETUP.md). -
A primeira renderização baixará o HyperFrames via
npx -y [email protected](requer internet, cada cena leva cerca de 15–20s; 8–10 cenas totalizam 3–5 minutos). -
Idioma: todo o vídeo em chinês. O texto na tela pode misturar chinês e inglês (
AI,GPT,Applemantêm o original), masvoiceTextdeve ser em chinês, com números escritos em caracteres chineses conforme as regras abaixo.
Entrada
1 parâmetro: URL de notícia (http:///https://) ou caminho de arquivo .txt.
Fluxo de trabalho (estritamente nesta ordem)
Passo 1–3: Obter conteúdo + criar diretório de saída
- URL →
web_fetchbusca o texto, extraititle,content(corpo 800–2000 caracteres),ogImage(og:image ou null),domain. Falha (paywall/JS puro/4xx) → peça ao usuário para salvar o texto em.txte executar novamente, depois pare. .txt→readlê;title= primeira linha (≤40 caracteres),content= resto do texto,ogImage=null,domain="local".slug: preferencialmente use palavras-chave em inglês ou pinyin (≤40 caracteres,[a-z0-9-]), por exemploxiaomi-17-price,ai-coding-jobs. Se o título puramente chinês não puder ser convertido para ASCII, você escreve o pinyin; se realmente não houver, usezh-video(há também um fallback com o mesmo nome no código).timestamp=YYYYMMDD-HHmm;outputDir=<diretório de trabalho atual>/videos/<slug>-<timestamp>/— dentro do espaço de trabalho: facilita a entrega e não polui o diretório da skill (a sandbox DSH geralmente só permite escrever no espaço de trabalho).mkdir -p. A localização da biblioteca de efeitos sonoros é apontada peloSFX_DIRno.envparaassets/sfxdentro da skill, desacoplada do diretório de saída; se a biblioteca de efeitos estiver vazia, essa camada é pulada automaticamente, sem afetar o fluxo principal.
Passo 4: Ler diretório de templates
Leia PROJECT_DIR/templates/CATALOG.md, confirme os templates e slots.
Use apenas templateId do CATALOG. Existentes:
HOOK (apenas este): frame-liquid-bg-hero — aurora + título grande + CTA.
BODY (escolha conforme o conteúdo, veja Passo 5):
frame-vignelli— 1 número, fundo carvão escuro + vermelho.frame-pentagram-stat— 1 número/benchmark, fundo escuro neon (grade suíça, número laranja brilhante + detalhe ciano + gráfico de barras).frame-bold-poster— declaração forte multi-linha + número grande.frame-build-minimal— frase curta impactante, fundo escuro + uma palavra grande em negrito (glow laranja, aparece letra por letra).frame-creative-voltage— slogan criativo, divisão azul elétrico + letra manuscrita.frame-glitch-title— glitch RGB cyberpunk (fundo com ruído), adequado para notícias urgentes/tecnologia.frame-aicoding-list— lista de 2–5 itens (cada com ícone + etiqueta de nível), fundo gradiente escuro.frame-aicoding-comparison— comparação A vs B (dois cartões gradientes + emblema WIN + dados).
OUTRO: frame-logo-outro (padrão: logo glow + marca + tagline + url);
frame-statement-outro (alternativa: fundo papel + cartão vermelho).
Os valores de exemplo embutidos nos 11 templates (
data-composition-variables) já foram todos substituídos por exemplos em chinês, você pode ver o resultado final diretamente na prévia ou copiá-los parascript.jsone modificar. Mas ao renderizar, passe explicitamenteinputs: sem parâmetros, o runtime não obtém as variáveis e o texto ficará vazio.
Passo 5: Gerar script.json
{
"version": "1.0",
"renderer": "hyperframes",
"aspect": "9:16",
"metadata": {
"title": "...",
"source": { "url": "...", "domain": "...", "image": null },
"channel": "Nome do canal chinês"
},
"voice": { "provider": "omnivoice", "speed": 1.0 },
"scenes": [
/* 8–12 cenas: 1 hook + 6–10 body + 1 outro */
]
}
providerfixoomnivoice(TTS local, não precisa de voiceId/API key).- Cada cena:
{ id, type, voiceText, templateId, inputs };inputsdeve cobrir os slots obrigatórios daquele template no CATALOG. scenes[0].type = "hook";scenes[-1].type = "outro"(frame-logo-outro).- 8–12 cenas;
voiceTexttotal cerca de 350–450 caracteres (≈90–120s, velocidade do chinês falado ~4.5 caracteres/s; a duração final será determinada pela dublagem; a pipeline alinha pela dublagem). Cada cena body 30–45 caracteres, aborda apenas um ponto; se um parágrafo tiver dois pontos, divida em duas cenas. Objetivo: cada cena dura 6–10s.
Mapeamento conteúdo → template:
- hook → fixo
frame-liquid-bg-hero(slots: kicker, headline, subheadline, cta, brand).headlinepadrão gradiente amarelo→roxo, useheadline_from/headline_to(dois hex) para alterar o tom. - body → escolha por você o template mais adequado ao conteúdo, e varie o máximo possível, não use o mesmo para todos os body:
frame-vignelli: cena com 1 número a destacar (kicker, number, label, note, brand).frame-pentagram-stat: com 1 número base/percentual + sensação de gráfico de barras (label, headline=número, subtitle, anchor, footer_left, footer_right).frame-build-minimal: frase curta impactante/uma palavra-chave (eyebrow, hero=palavra única, desc, side_left, side_right).frame-bold-poster: declaração forte multi-linha + número grande (kicker, date, figure, headline[], standfirst, footer_left, footer_right). A 2ª linha deheadlineautomaticamente fica vermelha.frame-creative-voltage: slogan criativo (meta, display_lines, accent_index, script, caption).frame-glitch-title: sensação de urgência/tecnologia/suspense (title, subtitle).frame-aicoding-list: lista/comparação de 2–5 itens (title, accent, accent_from, accent_to, subtitle, items[]). Cada item{icon, title, desc, tag, level}:iconvocê escolhe emoji (🚫 ⚠️ ✅ ❌ 📈 💡 🔒 🚀 …);level∈danger|warn|good|infodetermina a cor;taguse etiqueta curta em chinês (高危 / 注意 / 利好 / 稳健);accent_from/accent_tovocê escolhe dois hex.frame-aicoding-comparison: comparação exata de dois itens (badge, pre, vs, post, left{}, right{}). Cada lado{label, from, to, icon?, bullets[], stat?, stat_label?, win?};from/tosão dois hex de gradiente (contraste frio/quente entre os lados é melhor);win: truemarca o vencedor.- Sugestão de ritmo: quando houver muitas cenas numéricas, alterne
frame-vignelli(preto carvão+vermelho/amarelo) comframe-pentagram-stat(neon laranja/ciano escuro); para cenas não numéricas, useframe-build-minimal.
- outro →
frame-logo-outro(brand_name, tagline, primary_url).
Regras de formatação de texto chinês na tela (inputs)
- Chinês ocupa mais espaço que inglês/vietnamita: limite cada linha a 10–14 caracteres chineses;
se ultrapassar, quebre a linha ou corte o texto;
headlineno máximo 3 linhas. Prefira tirar duas palavras a deixar duas linhas e meia apertadas. - A fonte do template é
Inter Tight+system-ui; o chinês cai para PingFang SC como fallback, geralmente normal; se renderizar como quadrados/retângulos (tofu), insira"PingFang SC", "Noto Sans SC",no início defont-familynocompositions/portrait.htmldaquele template e re-renderize. - Chinês não precisa de espaços entre palavras; não adicione manualmente valores negativos de
letter-spacing; o-3pxpadrão do template pode grudar caracteres chineses; se o título ficar apertado, sobrescreva comletter-spacing: -1pxnessa classe. - Emojis são permitidos no texto da tela, mas 0–1 por campo; não os coloque em campos com animação letra por letra
(como
herodoframe-build-minimal), senão a animação quebra. - Números na tela mantenha o formato bonito (
4499 元,82.7%,17), converta para caracteres chineses apenas novoiceText.
Regras de TTS chinês (voiceText obrigatório)
OmniVoice lê caractere por caractere; números arábicos, pontos decimais e símbolos de moeda frequentemente são lidos errado ou em inglês.
Portanto, no voiceText escreva todos os números em caracteres chineses; inputs (texto na tela) mantém os números.
| Forma | Exemplo errado | Escrita correta |
|---|---|---|
| Decimal | 82.7% | 百分之八十二点七 |
| Número de versão | iOS 18.2 | iOS 十八点二 |
| Modelo de produto | 小米 17 | 小米十七 |
| Pixel | 200MP | 两百万像素 |
| Bateria | 5000mAh | 五千毫安时 |
| Grandeza | 1M tokens | 一百万 token |
| RMB | ¥4499 | 四千四百九十九元 |
| USD | $5 | 五美元 |
| Multiplicador | 2x | 两倍 |
| Percentual | 30% | 百分之三十 |
| Duração | 60s | 六十秒 |
| Razão | 3:1 | 三比一 |
| Ano | 2026 年 | 二零二六年 |
| Trilhões | 21 万亿 | 二十一万亿 |
| Ranking | Top 3 | 前三名 |
- Abreviaturas em inglês: teste com sonda antes de decidir:
AI,GPT,API,5G,GPUno TTS chinês às vezes são lidas letra por letra ("A-I"), às vezes como palavra em inglês. Antes de finalizar, use a sonda para ler duas frases de comparação:AI 很强大vs人工智能很强大, escolha a escrita que soa mais natural e mantenha consistência em todo o vídeo. - Nomes de marcas mantenha o original (
Apple,OpenAI,小米), marcas chinesas escreva em chinês. voiceTextabsolutamente proibido: emoji/ícones, URL, e símbolos& % $ # + = /etc.; use。ou?no final das frases para pausas naturais; vírgula use,.- Consistência entre "两" e "二": para quantificadores coloquiais use "两" (两千, 两万, 两倍), para ordinais/anos use "二" (二零二六年, 第二季度).
Passo 6: Autoverificação
scenes[0]é hook, o último é outro; cadatemplateIdestá no CATALOG; cadainputscobre os slots obrigatórios;- Largura da linha chinesa ≤14 caracteres, headline ≤3 linhas;
voiceTextsem números arábicos/símbolos/emoji; emoji apenas eminputs; vocabulário e pronúncia de abreviaturas consistentes em todo o vídeo; voiceTexttotal 350–450 caracteres. Correção silenciosa no máximo 2 rodadas.
Passo 7: Escrever script.json
Use a ferramenta write para escrever em <outputDir>/script.json (antes mkdir -p no diretório de saída).
Passo 8: Executar pipeline
Primeiro inicie o TTS chinês (veja início) e confirme que a sonda gerou áudio, depois execute em primeiro plano:
cd "$HOME/.agents/skills/create-template-video-zh" && npm run pipeline -- "<outputDir>/script.json"
O CLI usará renderer: "hyperframes" para seguir a pipeline de templates: TTS → renderizar template por template → alinhar
pela duração da dublagem → concatenar + mixar. Em caso de falha, reporte o erro claramente e dê o caminho do outputDir (os já renderizados
voice/scene-*.mp3, clips/scene-*.mp4 serão reutilizados; basta deletá-los para re-renderizar).
Ao reexecutar após alterar o texto chinês, primeiro delete os voice/scene-*.mp3 correspondentes, senão a dublagem antiga será reutilizada.
Passo 9: Entrega
Copie os três arquivos finais para o diretório de trabalho da sessão, facilitando o acesso do usuário:
mkdir -p "<cwd>/videos/<slug>" && cp "<outputDir>"/{video.mp4,voice.mp3,script.txt} "<cwd>/videos/<slug>/"
Em seguida, reporte (com links clicáveis):
✓ Vídeo: videos/<slug>/video.mp4
✓ Áudio: videos/<slug>/voice.mp3 — para剪映 (legendas automáticas/alinhamento labial)
✓ Roteiro: videos/<slug>/script.txt — texto quadro a quadro, fácil de editar manualmente
Duração total: XX.Xs
Observações
- Cada cena leva cerca de 15–20s para renderizar (Chromium); 8–10 cenas totalizam 3–5 minutos.
- TTS é idempotente (mantém
voice/scene-*.mp3), os clipes também são idempotentes (mantémclips/scene-*.mp4). - TTS chinês no M2 Max tem RTF (taxa de tempo real) de aproximadamente 2.8: 1 minuto de vídeo final leva cerca de 3 minutos de TTS puro.
Para acelerar, defina
OMNIVOICE_STEPScomo16no servidor (qualidade ligeiramente reduzida, tempo pela metade) e reinicie. - Se
assets/sfxestiver vazio, a camada de som é 0, não afeta o fluxo principal; para efeitos sonoros, executenpm run sfx:download(requer internet) antes de gerar (o download padrão é paraassets/sfx/dentro da skill, ou seja, o local apontado porSFX_DIRno.env). Palavras-chave semânticas já incluem chinês (警告/失败/纪录/首次/倒计时/史诗/悬念…). - Diferenças da versão vietnamita
create-template-video: porta TTS 8124 + timbre chinês, tabela de leitura de números chineses, restrições de formatação de texto chinês, palavras-chave SFX em chinês, fallback de slugzh-video. O código é uma cópia independente (apenasnode_moduleslink simbólico para a versão vietnamita); alterar templates/pipeline afeta apenas este diretório. Se deletar a versão vietnamita, lembre-se denpm cipara reconstruir as dependências. - Novo template: siga as instruções no final de
templates/CATALOG.mde adicione uma linha no CATALOG.