From 8f754b3f005652e0000cbeff154d920d4ef75b45 Mon Sep 17 00:00:00 2001 From: Evandro Date: Thu, 11 Jun 2026 01:18:40 -0300 Subject: [PATCH] feat: wire model download UI and native docs --- .github/workflows/build.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/release.yml | 12 +- README.md | 32 ++- ...0-transcription-app-native-integrations.md | 46 ++-- src-tauri/src/injection/mod.rs | 16 +- src/app.ts | 39 +++- src/styles.css | 221 +++++++++--------- 8 files changed, 218 insertions(+), 152 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ddd8dc8..187a6b6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,7 @@ jobs: if: matrix.platform == 'ubuntu-22.04' run: | sudo apt-get update - sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf + sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libasound2-dev - name: Setup Node.js uses: actions/setup-node@v4 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2270341..3cd325f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: - name: Install Tauri Linux dependencies run: | sudo apt-get update - sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf + sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libasound2-dev - name: Setup Node.js uses: actions/setup-node@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5d899af..08c1281 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,11 +3,11 @@ name: Release on: push: tags: - - 'v*.*.*' + - "v*.*.*" workflow_dispatch: inputs: tag: - description: 'Tag de release, por exemplo v0.1.0' + description: "Tag de release, por exemplo v0.1.0" required: true type: string @@ -20,9 +20,9 @@ jobs: matrix: include: - platform: windows-latest - args: '' + args: "" - platform: ubuntu-22.04 - args: '' + args: "" runs-on: ${{ matrix.platform }} @@ -34,7 +34,7 @@ jobs: if: matrix.platform == 'ubuntu-22.04' run: | sudo apt-get update - sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf + sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libasound2-dev - name: Setup Node.js uses: actions/setup-node@v4 @@ -60,7 +60,7 @@ jobs: with: tagName: ${{ github.event.inputs.tag || github.ref_name }} releaseName: Transcript ${{ github.event.inputs.tag || github.ref_name }} - releaseBody: 'Build automatizado do Transcript para Windows e Linux.' + releaseBody: "Build automatizado do Transcript para Windows e Linux." releaseDraft: false prerelease: false args: ${{ matrix.args }} diff --git a/README.md b/README.md index 85c4a94..aa84172 100644 --- a/README.md +++ b/README.md @@ -4,26 +4,28 @@ Aplicativo desktop de transcrição para Windows e Linux, construído com Tauri ## Estado atual -Este repositório contém o MVP estrutural: +Este repositório contém um MVP nativo funcional: - app Tauri 2 funcional; - modal editável em TypeScript sem framework pesado; - backend Rust modular; -- catálogo do modelo `cstr/parakeet-tdt-0.6b-v3-GGUF` em Q8; -- contratos para CrispASR sidecar, API OpenAI-compatible, gravação e inserção de texto; +- catálogo e download do modelo `cstr/parakeet-tdt-0.6b-v3-GGUF` em Q8; +- captura real de microfone em WAV via CPAL; +- execução do sidecar CrispASR/Parakeet; +- hotkey global `Ctrl+Shift+Space`; +- inserção híbrida por clipboard + paste automático no Windows/X11 quando disponível; +- fallback manual no Wayland; - tray/system tray básico; - CI, build e release via GitHub Actions. -Ainda não implementa captura real de áudio, hotkey global, download real do modelo ou injeção nativa em outros aplicativos. Essas integrações já têm módulos dedicados para implementação incremental. - ## Arquitetura ```text src/ Frontend TypeScript/CSS src-tauri/src/ - audio/ Estado de gravação MVP + audio/ Captura de microfone e gravação WAV transcription/ Contratos, CrispASR sidecar e API compatível com OpenAI - injection/ Contratos/fallback de inserção + injection/ Clipboard, paste automático e fallback manual models/ Catálogo do modelo offline settings/ Configuração padrão tray.rs Menu da bandeja do sistema @@ -44,10 +46,22 @@ A regra de design é manter arquivos pequenos, responsabilidades claras e zero o O modelo não deve ser embutido no instalador principal. A estratégia recomendada é instalar o app leve e baixar o GGUF pelo gerenciador de modelos. +## Sidecar CrispASR + +O app chama por padrão o binário `parakeet-main` com: + +```bash +parakeet-main -m -f -t +``` + +Para o modelo v3, o projeto CrispASR recomenda compilar o target `parakeet-main` no branch `parakeet`. O app limita automaticamente o número de threads a no máximo 4 para manter compatibilidade com PCs simples. + +Enquanto o binário não estiver no `PATH` ou empacotado como sidecar, a transcrição local retorna erro claro após a gravação. + ## Compatibilidade Windows/Linux -- Windows: alvo principal para inserção automática futura via APIs Win32. -- Linux X11: alvo de automação completa quando possível. +- Windows: clipboard + tentativa de `Ctrl+V` via `SendKeys`. +- Linux X11: clipboard + tentativa de `Ctrl+V` via `xdotool` quando instalado. - Linux Wayland: suporte parcial por limitação de segurança dos compositors. O fallback seguro é copiar o texto e orientar o usuário a colar manualmente. ## Comandos locais diff --git a/docs/superpowers/plans/2026-06-10-transcription-app-native-integrations.md b/docs/superpowers/plans/2026-06-10-transcription-app-native-integrations.md index bb59b6c..87e16c6 100644 --- a/docs/superpowers/plans/2026-06-10-transcription-app-native-integrations.md +++ b/docs/superpowers/plans/2026-06-10-transcription-app-native-integrations.md @@ -17,10 +17,10 @@ - Modify: `src-tauri/src/ui_commands.rs` - Modify: `src-tauri/Cargo.toml` -- [ ] Add URL de download do Hugging Face e resolução de diretório local. -- [ ] Add validação por existência e tamanho mínimo/esperado. -- [ ] Add comando `download_default_model` com escrita em arquivo temporário e rename atômico. -- [ ] Testar status notInstalled/ready sem baixar o arquivo real. +- [x] Add URL de download do Hugging Face e resolução de diretório local. +- [x] Add validação por existência e tamanho mínimo/esperado. +- [x] Add comando `download_default_model` com escrita em arquivo temporário e rename atômico. +- [x] Testar status notInstalled/ready sem baixar o arquivo real. ## Task 2: Captura real de áudio @@ -30,10 +30,10 @@ - Modify: `src-tauri/src/ui_commands.rs` - Modify: `src-tauri/Cargo.toml` -- [ ] Implementar gravador CPAL que escreve WAV via hound. -- [ ] Guardar stream ativo no estado para manter gravação viva. -- [ ] Stop finaliza WAV e retorna caminho. -- [ ] Manter teste unitário de máquina de estados. +- [x] Implementar gravador CPAL que escreve WAV via hound. +- [x] Manter stream vivo em thread de gravação e guardar handles seguros no estado. +- [x] Stop finaliza WAV e retorna caminho. +- [x] Manter teste unitário de máquina de estados. ## Task 3: Execução CrispASR @@ -42,10 +42,10 @@ - Modify: `src-tauri/src/ui_commands.rs` - Modify: `src-tauri/tauri.conf.json` -- [ ] Resolver binário via variável/env/config e depois sidecar empacotado. -- [ ] Executar `crispasr -m -f