jamiepine/voicebox

O estúdio de síntese de voz de código aberto

O que é voicebox?

Voicebox é um estúdio de síntese de voz de código aberto que permite integrar novos mecanismos de texto-para-fala (TTS) de ponta a ponta. O fluxo de trabalho cobre desde a pesquisa de dependências, implementação do protocolo backend, integração da interface de frontend, até o empacotamento com PyInstaller e verificação em builds congelados. A SKILL.md detalha cada fase do processo, começando com a leitura obrigatória do guia completo em `docs/content/docs/developer/tts-engines.mdx`. É essencial realizar a pesquisa de dependências (Fase 0) antes de escrever qualquer código, clonando o repositório do modelo em um diretório temporário e auditando suas dependências transitivas. A implementação modifica arquivos específicos do backend (como `backend/backends/<engine>_backend.py`) e do frontend (como `app/src/lib/api/types.ts`), e o empacotamento PyInstaller requer configurações como `--collect-all` e `--copy-metadata`. Lições de versões anteriores (v0.2.3) destacam padrões comuns de falha em builds congelados, como problemas com `inspect.getsource`, `torch.load` e autenticação Hugging Face, que podem ser evitados com a pesquisa adequada. O usuário final só precisa testar o build final localmente, sem fazer push ou criar uma release.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add jamiepine/voicebox

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Adicionar Mecanismo TTS

Objetivo

Integrar um novo mecanismo de texto-para-fala no Voicebox de ponta a ponta: pesquisa de dependências, implementação do protocolo backend, integração da interface frontend, empacotamento com PyInstaller e verificação em build congelado. O usuário deve apenas testar o build final localmente.

Documento de Referência

O guia completo em fases está em docs/content/docs/developer/tts-engines.mdx. Leia este arquivo na íntegra antes de começar. Ele contém:

  • Fase 0: Pesquisa de dependências (obrigatório antes de escrever código)
  • Fase 1: Implementação do backend (protocolo TTSBackend)
  • Fase 2: Integração de rotas e serviços (geralmente zero alterações)
  • Fase 3: Integração do frontend (5 arquivos)
  • Fase 4: Dependências (requirements.txt, justfile, CI, Docker)
  • Fase 5: Empacotamento com PyInstaller (build_binary.py + server.py)
  • Fase 6: Workarounds comuns upstream
  • Checklist de implementação (portão entre as fases)

Fluxo de Trabalho

1. Leia o guia

# Leia o documento completo de mecanismos TTS
cat docs/content/docs/developer/tts-engines.mdx

Internalize todas as fases, especialmente a Fase 0 e a Fase 5. O lançamento v0.2.3 teve três patches porque a Fase 0 foi pulada.

2. Pesquisa de dependências (Fase 0)

Clone a biblioteca do modelo em um diretório temporário e audite-a. NÃO pule esta etapa.

mkdir /tmp/engine-research && cd /tmp/engine-research
git clone <model-library-url>

Execute as pesquisas grep da Fase 0.2 no guia contra o código clonado e suas dependências transitivas. Produza uma auditoria de dependências por escrito cobrindo:

  1. Pacotes PyPI vs não-PyPI
  2. Diretivas do PyInstaller necessárias (--collect-all, --copy-metadata, --hidden-import)
  3. Arquivos de dados em tempo de execução que devem ser incluídos
  4. Caminhos de bibliotecas nativas que precisam de substituições de variáveis de ambiente em builds congelados
  5. Monkey-patches necessários (torch.load, float64, MPS, token HF)
  6. Taxa de amostragem
  7. Método de download do modelo (from_pretrained vs snapshot_download + from_local)

Teste o carregamento do modelo e a geração na CPU no ambiente virtual descartável antes de prosseguir.

3. Implemente (Fases 1–4)

Siga as fases do guia em ordem. Arquivos-chave a modificar:

Backend (Fase 1):

  • Crie backend/backends/<engine>_backend.py
  • Registre em backend/backends/__init__.py (ModelConfig + TTS_ENGINES + factory)
  • Atualize a regex em backend/models.py

Frontend (Fase 3):

  • app/src/lib/api/types.ts — tipo de união do mecanismo
  • app/src/lib/constants/languages.ts — ENGINE_LANGUAGES
  • app/src/components/Generation/EngineModelSelector.tsx — ENGINE_OPTIONS, ENGINE_DESCRIPTIONS
  • app/src/lib/hooks/useGenerationForm.ts — esquema Zod, mapeamento nome-do-modelo
  • app/src/components/ServerSettings/ModelManagement.tsx — MODEL_DESCRIPTIONS

Dependências (Fase 4):

  • backend/requirements.txt
  • justfile (alvos setup-python, setup-python-release)
  • .github/workflows/release.yml
  • Dockerfile (se aplicável)

4. Empacotamento com PyInstaller (Fase 5)

Registre o mecanismo em backend/build_binary.py:

  • --hidden-import para o módulo backend e o pacote do modelo
  • --collect-all para pacotes que usam inspect.getsource, que enviam arquivos de dados ou bibliotecas nativas
  • --copy-metadata para pacotes que usam importlib.metadata

Se o mecanismo tiver caminhos de dados nativos, adicione os.environ.setdefault() em backend/server.py dentro do bloco if getattr(sys, 'frozen', False):.

5. Verifique no modo dev

just dev

Teste a cadeia completa: download do modelo → carregamento → geração → clonagem de voz.

6. Use o checklist

Percorra o Checklist de Implementação no final de tts-engines.mdx. Cada item deve ser verificado antes de entregar o build ao usuário.

Lições Principais (da v0.2.3)

Estes são os modos de falha mais comuns. A pesquisa da Fase 0 detecta todos eles:

PadrãoSintoma no Build CongeladoCorreção
@typechecked / inspect.getsource()"could not get source code"--collect-all <pacote>
Pacote envia arquivos de modelo pré-treinadoFileNotFoundError para .pth.tar, .yaml--collect-all <pacote>
Biblioteca C com caminhos de sistema fixosFileNotFoundError para /usr/share/...--collect-all + variável de ambiente em server.py
importlib.metadata.version()"No package metadata found"--copy-metadata <pacote>
torch.load sem map_locationDispositivo CUDA não disponível em build CPUMonkey-patch torch.load
torch.from_numpy em dados float64Erro de incompatibilidade de tipo RuntimeErrorConverter para .float()
token=True em chamadas de download HFFalha de autenticação sem token HF armazenadoUsar snapshot_download(token=None) + from_local()

Notas

  • As camadas de rota e serviço não possuem pontos de despacho por mecanismo. main.py requer zero alterações.
  • O registro de configuração do modelo em backends/__init__.py lida com todo o despacho automaticamente.
  • Use get_torch_device() e model_load_progress() de backends/base.py — não reimplemente detecção de dispositivo ou rastreamento de progresso.
  • Sempre teste com um cache HuggingFace limpo (sem modelos pré-baixados do dev).
  • NÃO faça push ou crie uma release. Entregue o build ao usuário para teste local.

Habilidades Relacionadas