TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
翻译准备中
Local dictation for Windows and Linux: Silero VAD + faster-whisper on CUDA, text typed or pasted where the cursor is. No audio leaves the machine.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Ditado para Windows e Linux: fale no microfone e o texto aparece digitado/colado onde o cursor estiver. Com modelo local (Turbo ou Large-v3) tudo roda na sua máquina e nenhum áudio sai do computador. A nuvem (ElevenLabs Scribe ou Grok da xAI) é opcional: no ditado, cai pro Turbo local se a rede falhar, e na reunião transcreve e separa as vozes sem precisar de GPU.
Site · Release v0.10.0 · Changelog
O caminho do áudio é: microfone → Silero VAD (segmentação de fala) → faster-whisper Turbo/Large-v3 local ou STT na nuvem, com uma HUD Tkinter discreta e uma barra de overlay que indica gravação/transcrição.
wl-clipboard e wtype (Wayland) ou xclip/xsel (X11). Em Wayland, configure um atalho no compositor para encaminhar os comandos de gravação. Sem ferramenta de clipboard o envio colar cai no modo digitar.Os comandos abaixo instalam o suporte a GPU NVIDIA. Sem GPU dedicada, troque requirements-cuda.txt por requirements.txt: a instalação em CPU dispensa os pacotes CUDA.
Com uv (recomendado):
Windows:
uv venv --python 3.11
uv pip install -r requirements-cuda.txt --override overrides-cuda.txt
Linux:
uv venv --python 3.11
uv pip install -r requirements-cuda.txt --override overrides-cuda.txt
O --override troca o onnxruntime de CPU (que o faster-whisper puxa) pelo onnxruntime-gpu, usado pela separação de vozes das reuniões. Sem ele os dois pacotes brigam pelo mesmo módulo e a separação de vozes não acha a GPU.
Ou com venv + pip:
Windows:
python -m venv .venv
.venv\Scripts\pip install -r requirements-cuda.txt
Linux:
python3.11 -m venv .venv
.venv/bin/pip install -r requirements-cuda.txt
.venv/bin/pip uninstall -y onnxruntime onnxruntime-gpu
.venv/bin/pip install --no-deps onnxruntime-gpu==1.24.4
As bibliotecas de CUDA (cublas, cudnn) vêm dos wheels da NVIDIA listados no requirements-cuda.txt (nvidia-cublas-cu12 / nvidia-cudnn-cu12). No Windows o app.py registra site-packages\nvidia\*\bin via os.add_dll_directory() e prefixa o PATH. No Linux pré-carrega os .so em nvidia/*/lib (e lib64) — sem isso a transcrição falha com DLL/.so de cublas ausente. Se você instalar as dependências fora de um venv na raiz do projeto, garanta que esses pacotes estejam visíveis no ambiente usado para rodar.
O Tk que vem com o CPython do uv (python-build-standalone) é compilado sem Xft: a interface sai com fontes bitmap, sem antialias. Crie o venv com o Python do sistema (/usr/bin/python3, com o tk da distro) e as fontes ficam certas. O app.py funciona do 3.11 ao 3.14.
No Omarchy a barra de gravação segue o monitor do cursor e ganha cantos recortados pelo compositor, e a aba OMARCHY aciona o ditado pelo headset MCHOSE X9 sem tocar no PC (roda de volume invertida rápido ou toque duplo no mute, com Enter automático ao terminar). Regras de janela, regra udev e instruções em contrib/omarchy/.
Pra cancelar sem mirar no X da barra, use sussurro cancel (ou python app.py cancel). Ele descarta o ditado atual, inclusive enquanto termina de processar. Sem ditado, responde ok sem efeito. toggle durante a gravação confirma e transcreve, não cancela. Texto já colado no modo simultâneo não é apagado. Bind sugerido no Hyprland: Super+Shift+Escape executando sussurro cancel, conforme o exemplo de configuração.
sussurro toggle-enter começa o ditado e, no segundo acionamento, para, cola o texto no campo de destino e aperta Enter depois da última colagem. Use só onde Enter envia a mensagem. Pra revisar antes de enviar, use sussurro toggle, sem -enter.
Bind sugerido no Omarchy com configuração Lua:
o.bind("SUPER + ALT + RETURN", "Ditar e enviar no chat", "sussurro toggle-enter")
Na configuração .conf do Hyprland:
bind = SUPER ALT, Return, exec, sussurro toggle-enter
Deixe o campo do chat focado antes de começar. sussurro cancel descarta o ditado e não envia Enter, mas não desfaz texto já colado. O comando também funciona como python app.py toggle-enter. A configuração do bind é manual, o app não altera seus atalhos.
Windows:
.venv\Scripts\activate
python app.py
Sem terminal (janela própria, sem console):
.venv\Scripts\pythonw.exe app.py
Linux:
source .venv/bin/activate
python app.py
Na primeira execução o modelo local é baixado pelo faster-whisper; as próximas usam o cache local. O botão GRAVAR só é liberado após carregar e aquecer o modelo. O padrão é o Turbo, na GPU NVIDIA se houver e na CPU se não. O seletor mostra o nome real da GPU NVIDIA e do processador encontrados na máquina.
Fechar a janela (X ou Super+W) encerra o app de vez, motor e atalhos juntos, como qualquer programa. Uma reunião gravando fica no cache e a próxima abertura oferece salvar. Com o app aberto, sussurro show traz a janela e sussurro quit encerra pelo terminal.
No card de configuração, escolher em MODELO ou EXECUTAR EM já troca o modelo, sem reiniciar; a troca só é aceita fora de um ditado ou transcrição em andamento (recusada, o combo volta pro modelo ativo). EM USO AGORA mostra o que transcreve o próximo trecho: verde quando é o escolhido, laranja quando a nuvem caiu e o Turbo local assumiu ou quando o outro provedor de nuvem respondeu, vermelho sem modelo (VRAM cheia, por exemplo). O status de cada trecho diz com qual motor saiu e o histórico guarda isso no campo engine. python app.py status mostra o modelo e dispositivo ativos. A preferência só é salva depois que o modelo carrega; se a troca falhar, o app tenta recuperar o anterior pelo cache.
| Modelo | Onde roda | Quando usar |
|---|---|---|
| Turbo | local, GPU ou CPU | padrão: rápido, privado, ~1,3 GB de VRAM |
| Large-v3 | local, GPU ou CPU | mais preciso que o Turbo, ~2,1 GB de VRAM |
| ElevenLabs Scribe | nuvem | melhor em termos técnicos, zero VRAM |
| Grok (xAI) | nuvem | quase igual ao Scribe, mais rápido, zero VRAM |
Os modelos locais ficam carregados na VRAM o tempo todo, mesmo parados. Os de nuvem não ocupam a GPU: o áudio do ditado vai por HTTPS e volta como texto. Em 31 termos técnicos ditados em português (nomes de produto, siglas, inglês no meio da frase), o Scribe acertou 29, o Grok 28 e o Large-v3 local 18. Em troca, a nuvem leva de 1,5 a 3 s por trecho, contra ~0,7 s do local numa RTX 4070 Ti Super. Na CPU, sem GPU NVIDIA, os locais ficam lentos e a nuvem é o caminho para ditado fluido.
A qualidade depende do idioma, ruído, sotaque e vocabulário: compare com suas gravações na aba COMPARAR.
ELEVENLABS_API_KEY ou do chaveiro do sistema: secret-tool store --label='ElevenLabs (Sussurro)' servico elevenlabs tipo api-key.XAI_API_KEY ou reaproveita o login do Grok CLI (~/.grok/auth.json, criado por grok login). O token expirado é renovado pelo próprio CLI.settings.json nem aparece em log ou mensagem de erro. Sem credencial, o seletor recusa a troca e o modelo atual continua.Se houver uma GPU AMD junto da NVIDIA, o Sussurro a identifica e explica seu estado abaixo do seletor, mas não oferece um botão AMD que falharia. O pacote Python normal do CTranslate2 usa CUDA; AMD requer uma compilação ROCm/HIP separada. Os dois backends não se somam para acelerar um único ditado, e manter a AMD livre evita disputar memória compartilhada quando ela é integrada ao processador.
O Turbo reduz o decodificador do large-v3 de 32 para 4 camadas, com uma pequena perda de qualidade reportada pelos autores. INT8 reduz a precisão numérica para economizar memória. Fontes: modelo oficial Turbo e faster-whisper. Não incluímos modelos .en ou distil-large-v3, que são voltados ao inglês, na seleção para ditado em português.
Abra a aba COMPARAR, selecione os modelos e clique em Gravar frase. Os de nuvem vêm desmarcados: marque só se quiser mandar a frase pro provedor. Fale uma vez e clique em Parar e comparar. O áudio do microfone selecionado é limitado a 30 segundos e reutilizado em todos os modelos. Você também pode carregar um WAV PCM de 16 bits, mono ou estéreo, de até 30 segundos.
Todos recebem exatamente o mesmo WAV, idioma e beam_size=5, sem substituições da Biblioteca, para expor as diferenças de reconhecimento. O primeiro uso baixa os pesos. A comparação usa processos separados e mantém o modelo normal de ditado intacto; enquanto grava/compara, o ditado, a troca de modelo e a transcrição de arquivos do app ficam bloqueados para evitar interferência. Outros aplicativos ainda podem disputar CPU/GPU. Se faltar VRAM, tente Individual, menos modelos ou CPU.
O áudio de comparação fica apenas na memória e em um WAV temporário sob ~/.cache/sussurro/compare, removido ao terminar/cancelar; ele não depende da cota do /tmp compartilhado. Os testes não entram no histórico de ditados. Resultados ficam na aba enquanto o app estiver aberto. O comparador não calcula uma nota de precisão: leia as transcrições e compare com a frase que você falou.
Feche o Sussurro, atualize o código (git pull --ff-only, em um checkout sem alterações pendentes), atualize as dependências e abra novamente. Vindo de antes das reuniões, na instalação CUDA troque o onnxruntime de CPU pelo de GPU: uv pip uninstall onnxruntime e depois uv pip install -r requirements-cuda.txt --override overrides-cuda.txt. Se baixou um ZIP, extraia a nova versão e preserve settings.json, library.json e history/ da instalação anterior.
Quem usava Automático, Tiny, Base, Small, Medium ou Parakeet passa para o Turbo ao atualizar; Turbo e Large-v3 continuam como estavam. Histórico, biblioteca e demais preferências são preservados. Para liberar disco, apague o cache antigo do Parakeet em ~/.cache/sussurro/models/parakeet-*. Não há atualizador automático: é necessário instalar a nova versão.
Setar você clica o botão desejado (meio, lateral 1 ou lateral 2) para redefinir.alternar (clique liga/desliga) ou segurar (push-to-talk).MCHOSE X9, FIFINE Microphone). Os plugins do ALSA (lavrate, speex, upmix...), monitores e sinks virtuais não aparecem. Um microfone específico grava pela rota pulse com PULSE_SOURCE, então funciona mesmo com o PipeWire segurando o aparelho. Sem PipeWire (ou no Windows) a lista volta a ser a do PortAudio.microfone (entrada), audio do PC (o que está saindo nas caixas/fones: loopback WASAPI no Windows, monitor Pulse/PipeWire no Linux) ou os dois (mistura mic + PC antes do VAD/whisper).audio do PC / os dois) é sempre a saída padrão do sistema.simultaneo: trechos vão aparecendo conforme você pausa entre frases (corte por VAD após ~0,7 s de silêncio); final: acumula tudo e transcreve de uma vez ao parar.Pergunta 7, Questão 12, Primeiro/Segundo/Terceiro). Não reescreve nem tira “né/sabe”. Vale no colar, no histórico e no copiar. Ditados antigos ficam como estão.colar: no Linux, foca a janela (e o campo web) sob o mouse e cola via Ctrl+V. No Windows cola via Ctrl+V no campo onde o cursor estiver. No Windows o clipboard original é preservado em todos os formatos; no Linux o backup é só texto (wl-copy/xclip/xsel). digitar: simula teclado.pt, en ou auto.A aba REUNIÃO grava o seu microfone e o que o PC toca em duas trilhas separadas, e ao parar transcreve com quem falou o quê. Funciona com qualquer app de chamada, porque só escuta o áudio do sistema: nenhum bot entra na call. Portado do Meeting Recorder de Jankees van Woezik (MIT), trocando o whisper.cpp na CPU pelo modelo do ditado na GPU.
O combo MOTOR, ao lado de Importar áudio, escolhe quem transcreve e separa as vozes:
| Motor | Onde roda | Quando usar |
|---|---|---|
| Local · modelo do ditado | modelo do ditado + Nemotron na GPU | padrão: nada sai da máquina |
| Grok (xAI) · nuvem | xAI transcreve e separa as vozes | notebook sem GPU NVIDIA |
| ElevenLabs Scribe · nuvem | ElevenLabs transcreve e separa as vozes | idem; aceita o número fixo de falantes |
Na nuvem, cada lado sobe uma vez, em Opus a 32 kbit/s e só com os trechos de fala (silêncio e eco ficam de fora), e os dois lados vão em paralelo. O Nemotron não é carregado e o ditado continua livre durante a transcrição. Uma reunião real de 9 min saiu em 10 s pelo Grok e 14 s pela ElevenLabs num notebook sem GPU dedicada; o arquivo misturado de 9 min, com as duas vozes separadas pelo provedor, em 35 s e 17 s. Se o provedor escolhido falhar, a reunião vai pro outro, se houver credencial dele. As credenciais são as mesmas do ditado na nuvem.
A bolinha mostra REUNIAO em azul com o tempo gravado, mesmo fora da aba. Pausada, fica cinza e o relógio para. Durante um ditado a bolinha prioriza o ditado e volta à reunião quando ele termina. O indicador da reunião não tem X nem confirmar, para não parar uma call por engano.
sussurro meeting-start|meeting-stop|meeting-pause espera o resultado do painel. ok confirma o comando aplicado. err sai com código 1, inclusive quando há gravação interrompida aguardando recuperação ou o painel está indisponível. Se o comando não confirmar a tempo, confira o estado antes de repetir.
python app.py meeting-start, meeting-stop e meeting-pause controlam a gravação sem abrir a janela.Cada reunião vira uma pasta em ~/Documentos/Reuniões (a pasta de documentos do xdg-user-dir), com o prefixo de data para ordenar: audio.ogg (os dois lados nivelados), transcricao.md, reuniao.json (falas, nomes e modelo) e .trilhas/ com cada lado separado, que é o que "Refazer" usa. Requer parec/pacat (libpulse) e ffmpeg com Opus. O modelo de vozes (~200 MB) baixa no primeiro uso do motor Local.
Pela linha de comando, sussurro_meeting.py transcribe mic.ogg pc.ogg --model cloud-xai (ou cloud-elevenlabs, e transcribe-file audio.ogg --speakers 2) roda o mesmo caminho de nuvem.
No bench do Meeting Recorder (os casos de teste dele com gabarito, rodado com sussurro_meeting.py), com Turbo na GPU: 97,2% das palavras com a pessoa certa na call (o app original: 94,1%), 93,5% no arquivo importado (90,7%) e 99,4% numa reunião real do corpus AMI (97,6%), em 2 a 6 s por caso contra 20 a 160 s do original na CPU.
O comando sussurro toggle usa um cliente leve de socket, sem importar Tk, áudio ou CUDA. A interface consulta os comandos a cada 20 ms. No Linux, o microfone abre primeiro na taxa nativa do dispositivo, com blocos de 20 ms; os blocos que ainda estão no mixer são enviados antes de encerrar o ditado.
A cópia via wl-copy/xclip não captura os pipes dos processos que ficam servindo o clipboard. Capturá-los provocava um timeout de 2 segundos e acionava a digitação de reserva. A restauração do clipboard aguarda 400 ms em segundo plano, respeita cópias feitas pelo usuário durante essa espera e mantém a ordem entre colagens consecutivas.
O padrão é large-v3-turbo: em GPU NVIDIA com CUDA e int8_float16, em CPU com int8. Se o hardware não suportar essa precisão, é usada uma alternativa suportada. A decodificação usa beam_size=5. O aquecimento consome o gerador de transcrição e inicializa o VAD antes de liberar a gravação. No modo final, os blocos são concatenados uma única vez e o VAD é executado pelo faster-whisper, evitando uma segunda varredura do mesmo áudio.
sussurro status: informa se o modelo está pronto, se está gravando e se ainda há trabalho pendente.sussurro-performance.log: registra duração do áudio, tempo de transcrição, tempo de entrega e tempo desde o comando de parada. Não contém áudio nem texto ditado. Rotação de 1 MB, com duas cópias anteriores..venv/bin/python -m unittest discover -s tests -v.Os exemplos com sussurro pressupõem um launcher local com esse nome; ele não é instalado automaticamente. Com o ambiente virtual ativado, também é possível chamar os comandos diretamente no diretório do projeto:
python app.py toggle
python app.py status
Em Wayland, a injeção usa wtype; configure o atalho do compositor para executar o Python do ambiente virtual e o app.py usando caminhos absolutos, com o argumento toggle (ou start/stop).
history/ — gravações WAV e transcrições das suas sessões (indexadas em history.jsonl). É conteúdo seu e privado; não versionamos.settings.json — preferências locais (atalho, microfone, idioma etc.). Também fica de fora do git.library.json — sua biblioteca de correções de palavras. Também fica de fora do git.sussurro.log — log escrito quando rodando sob pythonw.Todos estão no .gitignore. Com modelo local, nada é enviado para serviço externo: captura, VAD, modelo e injeção de texto são 100% locais. Com ElevenLabs Scribe ou Grok, o áudio de cada trecho do ditado vai para o provedor escolhido (ou pro local, se ele falhar), assim como o do Refazer e o do sussurro transcribe, que usam o modelo atual. O áudio de reunião só sai do PC com um MOTOR de nuvem escolhido na aba REUNIÃO. Pastas de reunião, histórico, biblioteca e configurações nunca saem do PC.
wtype para enviar teclas.-transparentcolor é Windows); cantos da janela ficam opacos.sussurro transcribe /caminho/audio.wav devolve JSON na saída padrão. Sucesso tem
"ok": true e os campos do registro do histórico. Falha tem "ok": false,
"error" e código de saída 1.
Durante um ditado, inclusive enquanto os últimos trechos ainda estão sendo entregues, o arquivo é recusado antes de usar o modelo. O Hermes pode tentar de novo depois que o ditado terminar. Exemplo de resposta:
{"ok": false, "error": "RuntimeError: Modelo ocupado com ditado; aguarde o ditado terminar e tente novamente."}
Uma recusa por ocupação não cria histórico nem altera o status do ditado. Arquivo sem fala continua retornando o diagnóstico no JSON, sem criar histórico ou status de erro na interface.
Na aba HISTÓRICO, Liberar espaço pede uma idade em dias (30 por padrão) e mostra quantos WAVs e MiB serão removidos. A confirmação começa em Não. Só são removidos áudios mais antigos que essa idade e que já tenham texto salvo. Áudios sem texto, recentes e arquivos fora do histórico são preservados.
Os textos, datas, estatísticas e correções ficam no histórico. Os itens passam a mostrar Sem áudio e continuam disponíveis para copiar. Depois da remoção não dá pra ouvir ou Refazer esses áudios. A operação é manual, sem limpeza automática, e não pode ser desfeita. Pare a reprodução e aguarde trabalhos ativos antes de usar.
grock, groque, nine houter), em "deve virar" o termo certo (Grok), e clique em Adicionar. A troca é aplicada em toda transcrição antes de ela aparecer na tela, ser colada/digitada e ir para o histórico — sem diferença de maiúscula, tolerando espaçamento diferente em termos de duas palavras, e só em palavra inteira (grok não mexe em grokking). O ✕ remove a entrada; tudo vale na hora, sem reiniciar.history/history.jsonl (não há contador paralelo): total de palavras, palavras por minuto (palavras ÷ tempo de fala, com o melhor ditado à parte), sequência de dias seguidos e recorde, tempo falado e média por ditado, quanto tempo o mesmo texto levaria digitado a 40 ppm, correções aplicadas pela Biblioteca, mapa de atividade das últimas 26 semanas, distribuição por hora do dia e as palavras que você mais fala (boas candidatas à Biblioteca). Ditados antigos entram na conta — a duração é medida pelo tamanho do WAV; só a contagem de correções começa nesta versão. A janela se alarga sozinha ao abrir a aba (limitada à área útil do monitor) e volta ao tamanho anterior ao sair: nada de número escondido atrás de barra de rolagem.