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.
- transcritor-1.1.1/CHANGELOG.md +126 -0
- transcritor-1.1.1/CODE_OF_CONDUCT.md +86 -0
- transcritor-1.1.1/CONTRIBUTING.md +142 -0
- transcritor-1.1.1/LICENSE +21 -0
- transcritor-1.1.1/MANIFEST.in +34 -0
- transcritor-1.1.1/Makefile +50 -0
- transcritor-1.1.1/PKG-INFO +925 -0
- transcritor-1.1.1/README.md +884 -0
- transcritor-1.1.1/SECURITY.md +45 -0
- transcritor-1.1.1/bin/transcrever +45 -0
- transcritor-1.1.1/config.example.json +27 -0
- transcritor-1.1.1/docs/img/logo-escuro.svg +26 -0
- transcritor-1.1.1/docs/img/logo-mark.svg +30 -0
- transcritor-1.1.1/docs/img/logo.png +0 -0
- transcritor-1.1.1/docs/img/logo.svg +26 -0
- transcritor-1.1.1/docs/img/tui.svg +311 -0
- transcritor-1.1.1/docs/img/web.png +0 -0
- transcritor-1.1.1/docs/pacotes-linux.md +174 -0
- transcritor-1.1.1/docs/transcrever.1 +83 -0
- transcritor-1.1.1/docs/transcritor-watch.service +36 -0
- transcritor-1.1.1/instalar.sh +361 -0
- transcritor-1.1.1/pyproject.toml +141 -0
- transcritor-1.1.1/requirements.txt +15 -0
- transcritor-1.1.1/setup.cfg +4 -0
- transcritor-1.1.1/tests/conftest.py +196 -0
- transcritor-1.1.1/tests/test_cli.py +482 -0
- transcritor-1.1.1/tests/test_config.py +269 -0
- transcritor-1.1.1/tests/test_empacotamento.py +108 -0
- transcritor-1.1.1/tests/test_engine.py +200 -0
- transcritor-1.1.1/tests/test_formats.py +263 -0
- transcritor-1.1.1/tests/test_instalacao.py +365 -0
- transcritor-1.1.1/tests/test_jobs.py +302 -0
- transcritor-1.1.1/tests/test_media.py +270 -0
- transcritor-1.1.1/tests/test_pipeline.py +286 -0
- transcritor-1.1.1/tests/test_watcher.py +254 -0
- transcritor-1.1.1/tests/test_web.py +576 -0
- transcritor-1.1.1/transcritor/__init__.py +7 -0
- transcritor-1.1.1/transcritor/__main__.py +4 -0
- transcritor-1.1.1/transcritor/cli.py +1344 -0
- transcritor-1.1.1/transcritor/config.py +322 -0
- transcritor-1.1.1/transcritor/data/transcritor-arquivo.desktop +15 -0
- transcritor-1.1.1/transcritor/data/transcritor.desktop +12 -0
- transcritor-1.1.1/transcritor/data/transcritor.svg +25 -0
- transcritor-1.1.1/transcritor/engine.py +358 -0
- transcritor-1.1.1/transcritor/formats.py +322 -0
- transcritor-1.1.1/transcritor/jobs.py +258 -0
- transcritor-1.1.1/transcritor/media.py +183 -0
- transcritor-1.1.1/transcritor/pipeline.py +199 -0
- transcritor-1.1.1/transcritor/runner.py +249 -0
- transcritor-1.1.1/transcritor/tui.py +417 -0
- transcritor-1.1.1/transcritor/watcher.py +146 -0
- transcritor-1.1.1/transcritor/web/__init__.py +5 -0
- transcritor-1.1.1/transcritor/web/server.py +623 -0
- transcritor-1.1.1/transcritor/web/templates/index.html +577 -0
- transcritor-1.1.1/transcritor.egg-info/PKG-INFO +925 -0
- transcritor-1.1.1/transcritor.egg-info/SOURCES.txt +58 -0
- transcritor-1.1.1/transcritor.egg-info/dependency_links.txt +1 -0
- transcritor-1.1.1/transcritor.egg-info/entry_points.txt +3 -0
- transcritor-1.1.1/transcritor.egg-info/requires.txt +10 -0
- 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
|