transcritor 1.1.1__tar.gz

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 (60) hide show
  1. transcritor-1.1.1/CHANGELOG.md +126 -0
  2. transcritor-1.1.1/CODE_OF_CONDUCT.md +86 -0
  3. transcritor-1.1.1/CONTRIBUTING.md +142 -0
  4. transcritor-1.1.1/LICENSE +21 -0
  5. transcritor-1.1.1/MANIFEST.in +34 -0
  6. transcritor-1.1.1/Makefile +50 -0
  7. transcritor-1.1.1/PKG-INFO +925 -0
  8. transcritor-1.1.1/README.md +884 -0
  9. transcritor-1.1.1/SECURITY.md +45 -0
  10. transcritor-1.1.1/bin/transcrever +45 -0
  11. transcritor-1.1.1/config.example.json +27 -0
  12. transcritor-1.1.1/docs/img/logo-escuro.svg +26 -0
  13. transcritor-1.1.1/docs/img/logo-mark.svg +30 -0
  14. transcritor-1.1.1/docs/img/logo.png +0 -0
  15. transcritor-1.1.1/docs/img/logo.svg +26 -0
  16. transcritor-1.1.1/docs/img/tui.svg +311 -0
  17. transcritor-1.1.1/docs/img/web.png +0 -0
  18. transcritor-1.1.1/docs/pacotes-linux.md +174 -0
  19. transcritor-1.1.1/docs/transcrever.1 +83 -0
  20. transcritor-1.1.1/docs/transcritor-watch.service +36 -0
  21. transcritor-1.1.1/instalar.sh +361 -0
  22. transcritor-1.1.1/pyproject.toml +141 -0
  23. transcritor-1.1.1/requirements.txt +15 -0
  24. transcritor-1.1.1/setup.cfg +4 -0
  25. transcritor-1.1.1/tests/conftest.py +196 -0
  26. transcritor-1.1.1/tests/test_cli.py +482 -0
  27. transcritor-1.1.1/tests/test_config.py +269 -0
  28. transcritor-1.1.1/tests/test_empacotamento.py +108 -0
  29. transcritor-1.1.1/tests/test_engine.py +200 -0
  30. transcritor-1.1.1/tests/test_formats.py +263 -0
  31. transcritor-1.1.1/tests/test_instalacao.py +365 -0
  32. transcritor-1.1.1/tests/test_jobs.py +302 -0
  33. transcritor-1.1.1/tests/test_media.py +270 -0
  34. transcritor-1.1.1/tests/test_pipeline.py +286 -0
  35. transcritor-1.1.1/tests/test_watcher.py +254 -0
  36. transcritor-1.1.1/tests/test_web.py +576 -0
  37. transcritor-1.1.1/transcritor/__init__.py +7 -0
  38. transcritor-1.1.1/transcritor/__main__.py +4 -0
  39. transcritor-1.1.1/transcritor/cli.py +1344 -0
  40. transcritor-1.1.1/transcritor/config.py +322 -0
  41. transcritor-1.1.1/transcritor/data/transcritor-arquivo.desktop +15 -0
  42. transcritor-1.1.1/transcritor/data/transcritor.desktop +12 -0
  43. transcritor-1.1.1/transcritor/data/transcritor.svg +25 -0
  44. transcritor-1.1.1/transcritor/engine.py +358 -0
  45. transcritor-1.1.1/transcritor/formats.py +322 -0
  46. transcritor-1.1.1/transcritor/jobs.py +258 -0
  47. transcritor-1.1.1/transcritor/media.py +183 -0
  48. transcritor-1.1.1/transcritor/pipeline.py +199 -0
  49. transcritor-1.1.1/transcritor/runner.py +249 -0
  50. transcritor-1.1.1/transcritor/tui.py +417 -0
  51. transcritor-1.1.1/transcritor/watcher.py +146 -0
  52. transcritor-1.1.1/transcritor/web/__init__.py +5 -0
  53. transcritor-1.1.1/transcritor/web/server.py +623 -0
  54. transcritor-1.1.1/transcritor/web/templates/index.html +577 -0
  55. transcritor-1.1.1/transcritor.egg-info/PKG-INFO +925 -0
  56. transcritor-1.1.1/transcritor.egg-info/SOURCES.txt +58 -0
  57. transcritor-1.1.1/transcritor.egg-info/dependency_links.txt +1 -0
  58. transcritor-1.1.1/transcritor.egg-info/entry_points.txt +3 -0
  59. transcritor-1.1.1/transcritor.egg-info/requires.txt +10 -0
  60. transcritor-1.1.1/transcritor.egg-info/top_level.txt +1 -0
@@ -0,0 +1,126 @@
1
+ # Histórico de alterações
2
+
3
+ Todas as mudanças relevantes deste projeto são documentadas aqui.
4
+ O formato segue [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/)
5
+ e o projeto adota [Versionamento Semântico](https://semver.org/lang/pt-BR/).
6
+
7
+ ## [1.1.1] - 2026-10-17
8
+
9
+ Primeira publicação no PyPI.
10
+
11
+ ### Corrigido
12
+
13
+ - A transcrição não quebra mais com o PyAV 19. Quem decodifica o áudio passa a ser o **ffmpeg**,
14
+ e o modelo recebe as amostras prontas (16 kHz, mono, float32). O PyAV 19 removeu o argumento
15
+ `metadata_errors`, que o faster-whisper 1.2.1 ainda usa ao abrir o arquivo: como o `pip` já
16
+ instala o PyAV 19 no Python 3.12 ou mais novo, quem instalasse hoje falhava na primeira
17
+ transcrição com `unexpected keyword argument 'metadata_errors'`.
18
+ - O PyAV deixou de ser dependência direta (ele continua vindo com o faster-whisper, que o
19
+ importa, mas o transcritor não o usa mais).
20
+
21
+ ### Adicionado
22
+
23
+ - Pacote publicado no [PyPI](https://pypi.org/project/transcritor/) com os comandos `transcrever` e
24
+ `transcritor`. `pipx install transcritor` passa a ser a instalação mais rápida — o instalador de
25
+ uma linha já preferia o PyPI e agora o encontra.
26
+ - Publicação automática a partir das etiquetas, por Trusted Publishing (sem token guardado), com
27
+ atestados digitais dos artefatos e envio somente depois de `twine check` e da suíte de testes.
28
+ - Verificação de empacotamento na integração contínua: a cada envio, a wheel e o pacote de
29
+ código-fonte são construídos, conferidos e instalados em ambientes limpos; a suíte roda contra a
30
+ wheel instalada, fora do repositório, para provar que o que foi publicado funciona.
31
+ - Pacotes RPM (Fedora 44) e `.deb` (Ubuntu 24.04) construídos e testados em ambientes limpos:
32
+ instalação pelo gerenciador do sistema, comando, menu, associação de arquivos e transcrição real.
33
+ Os artefatos ficam anexados ao lançamento no GitHub.
34
+ - Testes que exercitam o motor de verdade (com um modelo dublê) e a decodificação do áudio — era
35
+ exatamente o caminho sem cobertura que deixou o problema do PyAV passar.
36
+ - Testes que conferem o empacotamento sem construir nada: versão do `pyproject.toml` igual à do
37
+ pacote, `requirements.txt` igual às dependências do `pyproject.toml`, comandos e dados declarados.
38
+ - `MANIFEST.in`, para que o pacote de código-fonte traga testes, documentação, o instalador e os
39
+ dados da interface junto do código — o que também serve de base para os pacotes RPM/DEB.
40
+
41
+ ### Alterado
42
+
43
+ - Metadados no padrão atual: licença como expressão SPDX (PEP 639), Linux e macOS declarados e
44
+ `Documentation` apontando para o README.
45
+ - No README, links e imagens passam a ser absolutos: no PyPI, caminho relativo quebra a imagem e a
46
+ página fica sem a logo e as capturas.
47
+
48
+ [1.1.1]: https://github.com/a32fred/transcritor/releases/tag/v1.1.1
49
+
50
+ ## [1.1.0] - 2026-10-17
51
+
52
+ Instalação e primeiro uso pensados para quem não tem conhecimento técnico.
53
+
54
+ ### Adicionado
55
+
56
+ - **Instalador de uma linha** (`instalar.sh`): descobre a distribuição, instala FFmpeg, Python e `pipx`,
57
+ instala o programa isolado, cria o ícone do menu e o “Abrir com”, oferece o download do modelo
58
+ e confere o resultado com `doctor`. Opções `--sim`, `--sem-modelo`, `--modelo`, `--sem-icone`,
59
+ `--versao`, `--dry-run` e `--help`.
60
+ - **Menu interativo**: `transcrever` sem argumentos, em um terminal, abre um menu numerado
61
+ (transcrever um arquivo ou pasta, abrir a interface, baixar ou trocar o modelo, diagnóstico).
62
+ Fora de um terminal, continua mostrando a ajuda.
63
+ - **Download do modelo guiado**: o tamanho e o tempo são informados antes de baixar, com barra de
64
+ progresso real em porcentagem; nada é baixado em silêncio durante a transcrição.
65
+ - **Comando `abrir`**: enfileira arquivos ou pastas (sem copiá-los) e abre a interface no navegador,
66
+ subindo o servidor em segundo plano quando necessário. É o que o ícone do menu e o “Abrir com” usam.
67
+ - **Comando `desktop`**: `instalar`, `remover` e `status` para o ícone no menu e a entrada
68
+ “Abrir com o transcritor” nos formatos de áudio e vídeo reconhecidos.
69
+ - **Download do modelo pela interface web**: faixa na página quando falta o modelo, com tamanho,
70
+ barra de progresso e estado em `/api/status` (`model_download`, `model_size_mb`, `model_quality`)
71
+ e no novo `POST /api/models/download` (responde `409` se já houver download em andamento).
72
+ - `transcrever models download NOME --usar`: baixa e já torna o modelo o padrão.
73
+ - Chave `-h` como atalho de `--help`.
74
+
75
+ ### Alterado
76
+
77
+ - **Dados separados do código**: por padrão, a base passa a ser `~/.local/share/transcritor`
78
+ (ou `$XDG_DATA_HOME/transcritor`). Quem já tem `~/transcritor/var`, `~/transcritor/models` ou
79
+ `~/transcritor/config.json` continua nesse layout — nada é movido nem perdido.
80
+ - Barras de progresso e mensagens técnicas de bibliotecas de terceiros (`huggingface_hub`, `httpx`)
81
+ deixam de poluir a saída em uso normal.
82
+ - Serviço systemd de exemplo passa a usar o executável `transcrever` instalado, com instrução de
83
+ override para quem trabalha a partir do repositório.
84
+ - README reescrito na parte de instalação: um comando, três formas de usar sem decorar comando,
85
+ onde ficam os dados, como atualizar e desinstalar.
86
+
87
+ ### Corrigido
88
+
89
+ - `download_model` não informava progresso: agora mede o que chegou ao disco e reporta porcentagem.
90
+ - A faixa de download da interface web ficava presa em “em andamento” depois de concluir.
91
+
92
+ [1.1.0]: https://github.com/a32fred/transcritor/releases/tag/v1.1.0
93
+
94
+ ## [1.0.0] - 2026-10-17
95
+
96
+ ### Adicionado
97
+
98
+ - Transcrição offline com faster-whisper e CTranslate2, usando CPU com `int8` e modelo padrão `large-v3`.
99
+ - Idioma e prompts voltados ao português do Brasil.
100
+ - Três interfaces: CLI, TUI no terminal e interface web local.
101
+ - Pasta vigiada com espera pela estabilização dos arquivos antes do processamento.
102
+ - Fila de jobs persistente com recuperação após queda.
103
+ - Saída em `txt`, `srt`, `vtt`, `json` e `md`.
104
+ - Reconhecimento de 23 extensões de áudio e vídeo.
105
+ - Normalização de áudio via ffmpeg, incluindo opção de normalização de volume.
106
+ - Download e troca de modelos de transcrição.
107
+
108
+ ### Corrigido
109
+
110
+ - Processamento duplicado no comando `watch --once`.
111
+ - Colisão de nomes no parâmetro `phase` durante notificações de progresso.
112
+ - Opção `--config` ignorada ao salvar a configuração.
113
+ - Quebra desbalanceada de cues nas legendas SRT.
114
+ - Criação de `Runner` sem o argumento `store`.
115
+ - Erro críptico ao processar um arquivo sem faixa de áudio.
116
+ - Nomes pouco legíveis quando há colisão de pasta de saída.
117
+ - Tracebacks ruidosos de `BrokenPipeError` no servidor web quando o cliente desconecta.
118
+ - Variável `TRANSCRITOR_HOME` ignorada ao carregar configuração sem `config.json`.
119
+
120
+ ### Segurança
121
+
122
+ - Processamento local, sem envio de áudio a serviços externos.
123
+ - Servidor web restrito a `127.0.0.1` por padrão; não possui autenticação e não deve ser exposto
124
+ diretamente à rede. Consulte a [política de segurança](SECURITY.md) para limites e recomendações.
125
+
126
+ [1.0.0]: https://github.com/a32fred/transcritor/releases/tag/v1.0.0
@@ -0,0 +1,86 @@
1
+ # Código de Conduta de Colaboração
2
+
3
+ ## Nosso compromisso
4
+
5
+ Como participantes, colaboradoras e líderes, nós nos comprometemos a fazer com que a participação em nossa comunidade seja uma experiência livre de assédio para todas as pessoas, independentemente de idade, tamanho do corpo, deficiência aparente ou não aparente, etnia, características sexuais, identidade ou expressão de gênero, nível de experiência, educação, situação sócio-econômica, nacionalidade, aparência pessoal, raça, casta, religião ou identidade e orientação sexuais.
6
+
7
+ Comprometemo-nos a agir e interagir de maneiras que contribuam para uma comunidade aberta, acolhedora, diversificada, inclusiva e saudável.
8
+
9
+ ## Nossos padrões
10
+
11
+ Exemplos de comportamentos que contribuem para criar um ambiente positivo para a nossa comunidade incluem:
12
+
13
+ - Demonstrar empatia e bondade com as outras pessoas
14
+ - Respeitar opiniões, pontos de vista e experiências contrárias
15
+ - Dar e receber feedbacks construtivos de maneira respeitosa
16
+ - Assumir responsabilidade, pedir desculpas às pessoas afetadas por nossos erros e aprender com a experiência
17
+ - Focar no que é melhor não só para nós individualmente, mas para a comunidade em geral
18
+
19
+ Exemplos de comportamentos inaceitáveis incluem:
20
+
21
+ - Uso de linguagem ou imagens sexualizadas, bem como o assédio sexual ou de qualquer natureza
22
+ - Comentários insultuosos/depreciativos e ataques pessoais ou políticos (Trolling)
23
+ - Assédio público ou privado
24
+ - Publicar informações particulares de outras pessoas, como um endereço de e-mail ou endereço físico, sem a permissão explícita delas
25
+ - Outras condutas que são normalmente consideradas inapropriadas em um ambiente profissional
26
+
27
+ ## Aplicação das nossas responsabilidades
28
+
29
+ A liderança da comunidade é responsável por esclarecer e aplicar nossos padrões de comportamento aceitáveis e tomará ações corretivas apropriadas e justas em resposta a qualquer comportamento que considerar impróprio, ameaçador, ofensivo ou problemático.
30
+
31
+ A liderança da comunidade tem o direito e a responsabilidade de remover, editar ou rejeitar comentários, commits, códigos, edições na wiki, erros e outras contribuições que não estão alinhadas com este Código de Conduta e irá comunicar as razões por trás das decisões da moderação quando for apropriado.
32
+
33
+ ## Escopo
34
+
35
+ Este Código de Conduta se aplica dentro de todos os espaços da comunidade e também se aplica quando uma pessoa estiver representando oficialmente a comunidade em espaços públicos. Exemplos de representação da nossa comunidade incluem usar um endereço de e-mail oficial, postar em contas oficiais de mídias sociais ou atuar como uma pessoa indicada como representante em um evento online ou offline.
36
+
37
+ ## Aplicação
38
+
39
+ Ocorrências de comportamentos abusivos, de assédio ou que sejam inaceitáveis por qualquer outro motivo poderão ser reportadas para a liderança da comunidade, responsável pela aplicação, via contato fredericocarlos.a32@gmail.com. Todas as reclamações serão revisadas e investigadas imediatamente e de maneira justa.
40
+
41
+ A liderança da comunidade tem a obrigação de respeitar a privacidade e a segurança de quem reportar qualquer incidente.
42
+
43
+ ## Diretrizes de aplicação
44
+
45
+ A liderança da comunidade seguirá estas Diretrizes de Impacto na Comunidade para determinar as consequências de qualquer ação que considerar violadora deste Código de Conduta:
46
+
47
+ ### 1. Ação Corretiva
48
+
49
+ **Impacto na comunidade**: Uso de linguagem imprópria ou outro comportamento considerado anti-profissional ou repudiado pela comunidade.
50
+
51
+ **Consequência**: Aviso escrito e privado da liderança da comunidade, esclarecendo a natureza da violação e com a explicação do motivo pelo qual o comportamento era impróprio. Um pedido de desculpas público poderá ser solicitado.
52
+
53
+ ### 2. Advertência
54
+
55
+ **Impacto na comunidade**: Violação por meio de um incidente único ou atitudes repetidas.
56
+
57
+ **Consequência**: Advertência com consequências para comportamento repetido. Não poderá haver interações com as pessoas envolvidas, incluindo interações não solicitadas com as pessoas que estiverem aplicando o Código de Conduta, por um período determinado. Isto inclui evitar interações em espaços da comunidade, bem como canais externos como as mídias sociais. A violação destes termos pode levar a um banimento temporário ou permanente.
58
+
59
+ ### 3. Banimento Temporário
60
+
61
+ **Impacto na comunidade**: Violação grave dos padrões da comunidade, incluindo a persistência do comportamento impróprio.
62
+
63
+ **Consequência**: Banimento temporário de qualquer tipo de interação ou comunicação pública com a comunidade por um determinado período. Estarão proibidas as interações públicas ou privadas com as pessoas envolvidas, incluindo interações não solicitadas com as pessoas que estiverem aplicando o Código de Conduta. A violação destes termos pode resultar em um banimento permanente.
64
+
65
+ ### 4. Banimento Permanente
66
+
67
+ **Impacto na comunidade**: Demonstrar um padrão na violação das normas da comunidade, incluindo a persistência do comportamento impróprio, assédio a uma pessoa ou agressão ou depreciação a classes de pessoas.
68
+
69
+ **Consequência**: Banimento permanente de qualquer tipo de interação pública dentro da comunidade.
70
+
71
+ ## Atribuição
72
+
73
+ Este Código de Conduta é adaptado do [Contributor Covenant][homepage], versão 2.1,
74
+ disponível na [versão original em inglês][v2.1].
75
+
76
+ As Diretrizes de Impacto na Comunidade foram inspiradas pela
77
+ [Aplicação do código de conduta Mozilla][Mozilla CoC].
78
+
79
+ Para obter respostas a perguntas comuns sobre este código de conduta, veja a página de
80
+ [Perguntas Frequentes (FAQ)][FAQ]. [Traduções][translations] estão disponíveis.
81
+
82
+ [homepage]: https://www.contributor-covenant.org
83
+ [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
84
+ [Mozilla CoC]: https://github.com/mozilla/diversity
85
+ [FAQ]: https://www.contributor-covenant.org/faq
86
+ [translations]: https://www.contributor-covenant.org/translations
@@ -0,0 +1,142 @@
1
+ # Como contribuir
2
+
3
+ Obrigado por contribuir com o transcritor! Siga nosso [Código de Conduta](CODE_OF_CONDUCT.md).
4
+
5
+ ## Usar ou desenvolver?
6
+
7
+ Se você só quer **usar** o transcritor, este documento não é para você: siga a
8
+ [instalação em um comando](README.md#instalação-em-um-comando) no README. O que vem
9
+ abaixo monta um ambiente de desenvolvimento a partir do código-fonte.
10
+
11
+ ## Preparar o ambiente
12
+
13
+ Use Python 3.10 ou superior e instale `ffmpeg` (inclui `ffprobe`). No Debian/Ubuntu:
14
+
15
+ ```shell
16
+ sudo apt-get update
17
+ sudo apt-get install ffmpeg
18
+ python3 -m venv .venv
19
+ source .venv/bin/activate
20
+ python -m pip install --upgrade pip
21
+ pip install -r requirements.txt
22
+ pip install -e .
23
+ pip install pytest "ruff==0.17.1"
24
+ ```
25
+
26
+ No Windows, ative com `.venv\Scripts\activate` e instale o ffmpeg pelo gerenciador de sua preferência,
27
+ garantindo que `ffmpeg` e `ffprobe` estejam no `PATH`.
28
+
29
+ A versão do `ruff` é fixada de propósito: o conjunto de regras e o comportamento de algumas delas
30
+ mudam entre versões, e o CI usa exatamente esta. Ao atualizar a versão, faça isso em um commit
31
+ próprio, com o CI verde, e ajuste `.github/workflows/ci.yml` e `pyproject.toml` juntos.
32
+
33
+ O comando instalado é `transcritor`; o projeto também fornece `bin/transcrever`.
34
+ Para usar os exemplos com esse nome no Linux/macOS, execute na raiz:
35
+
36
+ ```shell
37
+ export PATH="$PWD/bin:$PATH"
38
+ transcrever --help
39
+ ```
40
+
41
+ Como alternativa, use `transcritor` ou `python -m transcritor` nos mesmos exemplos.
42
+
43
+ ## Testes e lint
44
+
45
+ Execute na raiz do projeto:
46
+
47
+ ```shell
48
+ python -m pytest tests/ -q
49
+ ruff check transcritor tests
50
+ ```
51
+
52
+ Os testes usam um motor dublado (`FakeEngine`): não precisam de GPU, não baixam modelos e não exigem
53
+ transcrições reais. Testes de mídia são pulados automaticamente quando não há ffmpeg.
54
+ Para interromper na primeira falha, use `python -m pytest tests/ -x -q`.
55
+ Para cobertura opcional, instale `pytest-cov` e execute `make cov`.
56
+
57
+ O Makefile reúne os atalhos; consulte `make help`. Antes de formatar, confira o impacto de
58
+ `ruff format transcritor tests` e evite alterações de estilo sem relação com sua contribuição.
59
+
60
+ ## Convenções de código
61
+
62
+ - Use nomes de módulos, classes, funções e variáveis em inglês.
63
+ - Escreva docstrings, comentários explicativos e mensagens ao usuário em português do Brasil.
64
+ - Preserve os padrões existentes, com indentação Python de quatro espaços, UTF-8 e finais de linha LF.
65
+ - Prefira linhas de até 110 caracteres, funções pequenas e testes determinísticos.
66
+ - Inclua testes de regressão para correções e não introduza downloads de modelos na suíte automatizada.
67
+ - Não inclua modelos, áudios pessoais, transcrições, configurações locais, `.venv/` ou arquivos de `var/`.
68
+
69
+ ## Commits
70
+
71
+ Use [Conventional Commits](https://www.conventionalcommits.org/pt-br/v1.0.0/), com descrições em PT-BR
72
+ de forma consistente. Mantenha os tipos técnicos em inglês:
73
+
74
+ ```text
75
+ fix(watch): evita processamento duplicado
76
+ feat(cli): adiciona opção de saída
77
+ docs: esclarece instalação do ffmpeg
78
+ test: cobre recuperação da fila
79
+ ```
80
+
81
+ ## Issues e pull requests
82
+
83
+ 1. Procure relatos existentes antes de abrir uma [issue](https://github.com/a32fred/transcritor/issues).
84
+ 2. Use o formulário de erro ou sugestão. Para erros, inclua reprodução mínima, resultado esperado,
85
+ ambiente e saídas de `transcrever info` e `transcrever doctor`; remova dados pessoais dos diagnósticos.
86
+ 3. Para mudanças grandes, discuta a proposta em uma issue antes de implementar.
87
+ 4. Crie uma branch no seu fork, faça mudanças focadas e inclua os testes pertinentes.
88
+ 5. Execute testes e lint; atualize README e CHANGELOG quando aplicável.
89
+ 6. Abra o PR para `main`, preencha o modelo, vincule a issue e explique como validar a mudança.
90
+
91
+ Os mantenedores revisam os PRs e podem solicitar ajustes antes de integrar. Para vulnerabilidades,
92
+ **não abra uma issue pública**: siga [SECURITY.md](SECURITY.md).
93
+
94
+ ## Testar uma transcrição real (opcional)
95
+
96
+ Use uma gravação curta em PT-BR que você tenha autorização para processar:
97
+
98
+ ```shell
99
+ transcrever models download tiny
100
+ transcrever transcribe -m tiny -l pt -f txt -f srt caminho/amostra.wav
101
+ ```
102
+
103
+ O download inicial requer internet; depois, a transcrição usa o modelo local, sem enviar áudio.
104
+ O `tiny` é útil para um teste rápido em CPU, mas tem qualidade inferior ao padrão `large-v3`.
105
+ Confira o texto e os tempos das legendas na saída indicada pelo comando. Não envie esses arquivos no PR.
106
+ Esse teste manual não é requisito da suíte automatizada nem da CI.
107
+
108
+ ## Publicar uma versão (mantenedores)
109
+
110
+ O transcritor é publicado no [PyPI](https://pypi.org/project/transcritor/) a partir de uma etiqueta.
111
+ O envio usa [Trusted Publishing](https://docs.pypi.org/trusted-publishers/): o PyPI confia neste
112
+ repositório, no arquivo `.github/workflows/publish.yml` e no ambiente `pypi`, então **não existe
113
+ token guardado** — nem no GitHub, nem na sua máquina. O token é criado na hora, e cada arquivo sai
114
+ com um atestado digital de que foi construído aqui, a partir desta etiqueta.
115
+
116
+ Passo a passo:
117
+
118
+ 1. Atualize a versão em `transcritor/__init__.py` **e** em `pyproject.toml` (o teste
119
+ `tests/test_empacotamento.py` falha se elas divergirem) e registre a mudança no `CHANGELOG.md`.
120
+ 2. Envie para `main` e espere a CI ficar verde — o trabalho `empacotamento` constrói a wheel e o
121
+ pacote de código-fonte, confere os metadados e roda a suíte contra a wheel instalada.
122
+ 3. Crie a etiqueta e o lançamento:
123
+ ```shell
124
+ git tag -a v1.1.1 -m "transcritor 1.1.1"
125
+ git push origin v1.1.1
126
+ gh release create v1.1.1 --title "transcritor 1.1.1" --notes-from-tag
127
+ ```
128
+ 4. O lançamento publicado dispara o `publish.yml`, que constrói, confere e envia ao PyPI. Acompanhe
129
+ em <https://github.com/a32fred/transcritor/actions>.
130
+
131
+ O mesmo lançamento anexa os pacotes RPM e `.deb`, construídos a partir do mesmo sdist. Para
132
+ entender o ambiente isolado que eles carregam, construí-los localmente ou configurar o COPR, veja
133
+ [docs/pacotes-linux.md](docs/pacotes-linux.md).
134
+
135
+ Duas coisas são irreversíveis: **um número de versão não pode ser reaproveitado** no PyPI, e um
136
+ arquivo publicado não pode ser substituído (no máximo retirado do ar). Se algo sair errado depois do
137
+ envio, corrija e publique a versão seguinte.
138
+
139
+ Para ensaiar antes, sem gastar um número: use o [TestPyPI](https://test.pypi.org/) com
140
+ `python -m build` e `uv publish --publish-url https://test.pypi.org/legacy/`, e instale de lá com
141
+ `pipx install --index-url https://test.pypi.org/simple/ transcritor`. O nome precisa existir também
142
+ no TestPyPI, com o mesmo Trusted Publisher apontando para lá.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Frederico Carlos
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,34 @@
1
+ # Arquivos que entram no pacote de código-fonte (sdist).
2
+ #
3
+ # A wheel não depende deste arquivo: os dados de dentro do pacote
4
+ # (templates da interface e arquivos .desktop) vêm de
5
+ # [tool.setuptools.package-data] no pyproject.toml.
6
+ #
7
+ # O objetivo aqui é que o sdist seja suficiente para instalar E para
8
+ # empacotar em distribuições (RPM/DEB), com os testes, a documentação e o
9
+ # instalador de uma linha junto do código.
10
+
11
+ include LICENSE
12
+ include README.md
13
+ include CHANGELOG.md
14
+ include CONTRIBUTING.md
15
+ include CODE_OF_CONDUCT.md
16
+ include SECURITY.md
17
+ include config.example.json
18
+ include instalar.sh
19
+ include Makefile
20
+ include requirements.txt
21
+ include pyproject.toml
22
+ include bin/transcrever
23
+
24
+ recursive-include docs *.1 *.md *.service *.svg *.png
25
+ recursive-include tests *.py
26
+
27
+ # Dados locais de quem usa o programa não entram no pacote.
28
+ exclude config.json
29
+ prune var
30
+ prune models
31
+ prune .github
32
+
33
+ global-exclude *.py[cod]
34
+ global-exclude .DS_Store
@@ -0,0 +1,50 @@
1
+ .DEFAULT_GOAL := help
2
+ PYTHON ?= python
3
+
4
+ .PHONY: help install test test-fast cov lint format clean doctor
5
+
6
+ help: ## Lista os atalhos de desenvolvimento.
7
+ @awk 'BEGIN {FS = ":.*## "} /^[a-zA-Z_-]+:.*## / {printf " %-12s %s\n", $$1, $$2}' $(MAKEFILE_LIST)
8
+
9
+ install: ## Instala as dependências e o pacote em modo editável.
10
+ $(PYTHON) -m pip install -r requirements.txt
11
+ $(PYTHON) -m pip install -e .
12
+
13
+ # Dependência de desenvolvimento: python -m pip install pytest
14
+ test: ## Executa a suíte sem baixar modelos nem exigir GPU.
15
+ $(PYTHON) -m pytest tests/ -q
16
+
17
+ test-fast: ## Executa os testes e para na primeira falha.
18
+ $(PYTHON) -m pytest tests/ -x -q
19
+
20
+ # Dependência opcional: python -m pip install pytest-cov
21
+ cov: ## Executa testes com cobertura, quando pytest-cov estiver disponível.
22
+ @if $(PYTHON) -c "import pytest_cov" >/dev/null 2>&1; then \
23
+ $(PYTHON) -m pytest tests/ -q --cov=transcritor --cov-report=term-missing; \
24
+ else \
25
+ echo "pytest-cov não instalado; executando sem cobertura. Instale com: $(PYTHON) -m pip install pytest-cov"; \
26
+ $(PYTHON) -m pytest tests/ -q; \
27
+ fi
28
+
29
+ # Dependência opcional: python -m pip install ruff
30
+ lint: ## Verifica código e testes com Ruff, se instalado.
31
+ @if $(PYTHON) -m ruff --version >/dev/null 2>&1; then \
32
+ $(PYTHON) -m ruff check transcritor tests; \
33
+ else \
34
+ echo "Ruff não instalado; lint não executado. Instale com: $(PYTHON) -m pip install ruff"; \
35
+ fi
36
+
37
+ format: ## Formata código e testes com Ruff, se instalado.
38
+ @if $(PYTHON) -m ruff --version >/dev/null 2>&1; then \
39
+ $(PYTHON) -m ruff format transcritor tests; \
40
+ else \
41
+ echo "Ruff não instalado; formatação não executada. Instale com: $(PYTHON) -m pip install ruff"; \
42
+ fi
43
+
44
+ clean: ## Remove caches Python e pytest, sem tocar em modelos ou var/.
45
+ find transcritor tests -type d \( -name __pycache__ -o -name .pytest_cache \) -prune -exec rm -rf -- {} +
46
+ find transcritor tests -type f -name '*.pyc' -delete
47
+ rm -rf -- .pytest_cache __pycache__
48
+
49
+ doctor: ## Diagnostica o ambiente local (pode apontar modelo ausente).
50
+ $(PYTHON) -m transcritor doctor