Solução completa de texto-para-fala com interface gráfica nativa para BigLinux
- Introdução
- Funcionalidades
- Motores TTS
- Requisitos
- Instalação
- Uso
- Estrutura do Projeto
- Arquitetura
- Configuração
- Internacionalização
- Detalhes Técnicos
- Empacotamento
- Licença
O BigLinux TTS (Text-to-Speech) é um aplicativo nativo para desktop Linux que transforma texto em fala. Desenvolvido com GTK4 e libadwaita, é a ferramenta de leitura em voz alta do BigLinux — uma distribuição Linux brasileira baseada em Manjaro/Arch Linux.
O aplicativo resolve um problema prático: permitir que qualquer usuário ouça em voz alta textos selecionados na tela, sem configuração complicada. Basta selecionar um texto em qualquer janela, pressionar o Atalho configurado (padrão Alt+V), e o texto é lido automaticamente. Pressionando novamente, a leitura para (toggle).
- Acessibilidade: pessoas com deficiência visual ou dificuldade de leitura podem ouvir conteúdos de tela
- Multitarefa: ouvir artigos, documentos ou e-mails enquanto realiza outras atividades
- Aprendizado de idiomas: ouvir a pronúncia correta de textos em diferentes idiomas
- Revisão de texto: detectar erros de escrita ao ouvir o que foi digitado
- Produtividade: transformar leitura passiva em escuta ativa
- Três motores TTS — speech-dispatcher (RHVoice, espeak), espeak-ng direto e Piper Neural TTS, cobrindo desde vozes básicas até síntese neural de alta qualidade
- Descoberta automática de vozes — escaneia automaticamente todos os motores e vozes instalados no sistema
- Processamento inteligente de texto — expande abreviações (tb→também, vc→você), pronuncia caracteres especiais (#→cerquilha, @→arroba) e remove formatação HTML/Markdown
- Integração com KDE Plasma — atalho global, ícone na bandeja do sistema (system tray), fixação no launcher
- Interface moderna — design Adwaita com interface limpa, responsiva e acessível
- Multilíngue — traduzido para 29 idiomas com sistema i18n baseado em gettext
.po
- Atalho global configurável (padrão Alt+V) — Selecione qualquer texto em qualquer aplicativo e pressione o atalho para ouvir. Pressione novamente para parar (comportamento toggle)
- Botão na bandeja do sistema — Clique esquerdo no ícone do tray para ler o texto selecionado; clique direito para acessar configurações ou sair
- Teste de voz integrado — Campo de texto na interface para digitar e ouvir com a voz e configurações atuais
- Fixação no launcher — Opção para fixar o botão de falar na barra de tarefas do KDE Plasma
- Velocidade — Escala de -100 (lento) a +100 (rápido), com marcações "Lento", "Normal" e "Rápido"
- Tom — Escala de -100 (grave) a +100 (agudo)
- Volume — Escala de 0 (mudo) a 100 (máximo), com ajuste fino via sox para Piper
- Seleção de voz — Lista dinâmica filtrada por motor, mostrando "Nome — Idioma [Qualidade]"
| Recurso | Descrição | Exemplo |
|---|---|---|
| Expandir abreviações | Converte gírias e abreviações do idioma | tb → "também", vc → "você" |
| Caracteres especiais | Pronuncia símbolos por extenso | # → "cerquilha", @ → "arroba" |
| Remover formatação | Strip HTML tags, Markdown bold/italic/code | **negrito** → "negrito" |
| Ler URLs | Opção de incluir ou ignorar links | https://... → lê ou ignora |
| Limite de caracteres | Trunca textos muito longos | Ilimitado, 1K, 5K, 10K, 50K, 100K |
| Atalho | Ação |
|---|---|
| Atalho (padrão Alt+V) | Ler/parar texto selecionado (toggle) |
| Ctrl+Q | Fechar o aplicativo |
| Configurável | O atalho pode ser alterado na interface com captura visual de teclas |
- Ícone na área de notificação usando PySide6
QSystemTrayIconem subprocesso isolado - Clique esquerdo: ler texto selecionado (toggle falar/parar)
- Clique direito: menu com "Configurações" e "Sair"
- Executa em processo separado para evitar conflitos GTK/Qt
- Comunicação via protocolo JSON lines sobre stdin/stdout
Motor principal que roteia a fala através do daemon speech-dispatcher. Suporta múltiplos módulos de saída:
| Módulo | Descrição | Qualidade |
|---|---|---|
| RHVoice | Vozes de alta qualidade, com suporte forte para pt-BR (Letícia F123) e inglês | ★★★★ |
| espeak-ng | Leve, suporta 100+ idiomas, qualidade básica | ★★ |
| pico | SVOX Pico TTS | ★★★ |
| festival | Sistema Festival da Universidade de Edinburgh | ★★ |
Implementação técnica:
- Comunicação via API Python
speechd.SSIPClient(SSIP — Speech Synthesis Interface Protocol) - Cria conexão:
SSIPClient("biglinux-tts") - Define módulo de saída e voz selecionada
- Envia texto com callback de conclusão para detectar fim da fala
- Fallback robusto: se a API Python falhar, auto-reinicia o daemon (
systemctl --user restart speech-dispatcher) e tenta novamente; se isso também falhar, cai para execução CLI viaspd-say --wait
Mapeamento de parâmetros:
- Rate: -100 a 100 (passado diretamente ao SSIP)
- Pitch: -100 a 100 (passado diretamente)
- Volume: 0-100 → -100 a 100 (fórmula:
(volume × 2) - 100)
Ignora o speech-dispatcher e chama o espeak-ng diretamente via subprocesso. Útil para menor latência e configuração mais simples.
Comando: espeak-ng -v {voz} -s {wpm} -p {pitch} -a {volume} {texto}
Mapeamento de parâmetros:
| Parâmetro App | Fórmula | Faixa Final |
|---|---|---|
| Rate (-100 a 100) | 175 + (rate × 1.5) |
80-450 WPM |
| Pitch (-100 a 100) | 50 + (pitch × 0.5) |
0-99 |
| Volume (0-100) | volume × 2 |
10-200 (mínimo 10 para ser audível) |
Motor de síntese neural offline usando modelos ONNX. Produz fala de qualidade próxima à humana.
- Binário:
piper-tts(pacotepiper-tts-bin) - Modelos: arquivos
.onnxem/usr/share/piper-voices/{idioma}/{região}/{locutor}/{qualidade}/ - Configuração: arquivo
.onnx.jsonao lado de cada modelo com metadados
Pipeline de reprodução:
- Fase de síntese (thread em background):
piper-tts --model {caminho} --output_file {temp.wav} --length_scale {ls} --noise_scale {ns}- Recebe texto via stdin, gera arquivo WAV temporário
- Fase de reprodução:
- Com sox:
aplay→sox vol {fator}para controle de volume - Sem sox:
aplay -r 22050 -f S16_LE -t raw -q(reprodução direta)
- Com sox:
- Limpeza: arquivo WAV temporário removido após reprodução
Mapeamento de parâmetros:
| Parâmetro App | Mapeamento Piper | Efeito |
|---|---|---|
| Rate -100 | length_scale = 0.3 |
Muito rápido |
| Rate 0 | length_scale = 1.0 |
Normal |
| Rate +100 | length_scale = 2.5 |
Muito lento |
| Pitch (-100 a 100) | noise_scale = 0.667 ± 0.333 |
Variação de entonação |
| Volume (0-100) | sox vol factor = volume/50 |
0.2x a 2.0x |
O sistema descobre vozes de todos os motores simultaneamente:
- RHVoice:
spd-say -o rhvoice -L→ parsing dos nomes SSIP, com mapa de metadados hardcoded (idioma, gênero). Fallback para scan de diretório/usr/share/RHVoice/voices/e pacotes pacmanrhvoice-voice-* - espeak-ng:
espeak-ng --voices→ parsing do formato tabular com código de idioma e gênero - Piper: scan de diretórios
/usr/share/piper-voices/,~/.local/share/piper-voices/→ detecção de arquivos.onnxcom.onnx.jsonpadrão
Resultado: VoiceCatalog com todas as vozes disponíveis, filtráveis por idioma, motor e qualidade.
| Pacote | Descrição |
|---|---|
python (3.10+) |
Interpretador Python |
python-gobject |
Bindings GTK para Python (PyGObject) |
gtk4 |
Toolkit gráfico GTK versão 4 |
libadwaita |
Biblioteca de widgets Adwaita (GNOME HIG) |
speech-dispatcher |
Daemon de síntese de fala |
espeak-ng |
Motor TTS de código aberto |
xsel |
Acesso ao clipboard X11 (seleção primária) |
wl-clipboard-rs |
Acesso ao clipboard Wayland (wl-paste) |
alsa-utils |
Utilitários de áudio ALSA (aplay) |
| Pacote | Descrição |
|---|---|
pyside6 |
Ícone na bandeja do sistema (QSystemTrayIcon via subprocesso) |
rhvoice |
Motor TTS multilíngue de alta qualidade |
rhvoice-voice-leticia-f123 |
Voz feminina em português brasileiro |
rhvoice-voice-evgeniy-eng |
Voz masculina em inglês |
rhvoice-brazilian-portuguese-complementary-dict-biglinux |
Dicionário complementar pt-BR |
piper-tts-bin |
Motor TTS neural offline |
piper-voices-pt-BR |
Vozes neurais em português brasileiro |
sox |
Controle de volume para áudio Piper |
# Instalar do repositório BigLinux
sudo pacman -S tts-biglinux
# Opcional: voz RHVoice em português
sudo pacman -S rhvoice rhvoice-voice-leticia-f123
# Opcional: TTS neural Piper
sudo pacman -S piper-tts-bin piper-voices-pt-BR
# Opcional: bandeja do sistema
sudo pacman -S pyside6git clone https://github.com/biglinux/tts-biglinux.git
cd tts-biglinux/pkgbuild
makepkg -sigit clone https://github.com/biglinux/tts-biglinux.git
cd tts-biglinux/usr/share/biglinux/tts-biglinux
python main.py --debugbiglinux-tts # Abre a janela de configurações
biglinux-tts --debug # Modo debug com log detalhado
biglinux-tts --version # Exibe versãobiglinux-tts-speak # Lê o texto selecionado (chamado pelo Alt+V)O script biglinux-tts-speak funciona como toggle:
- Se já está falando → para imediatamente (mata o processo via PID em
/tmp/) - Se tem texto selecionado → lê em voz alta
- Se não tem texto → sai silenciosamente
- Primeiro uso: o app mostra um diálogo de boas-vindas explicando os recursos
- Configuração: selecione o motor TTS, voz e ajuste velocidade/tom/volume
- Teste: digite um texto no campo de teste e clique "Testar Voz"
- No dia a dia: selecione texto em qualquer janela → Alt+V → ouça
- Abra o aplicativo (
biglinux-tts) - Selecione um Motor TTS (speech-dispatcher, espeak-ng ou Piper)
- Escolha uma Voz na lista de vozes descobertas
- Ajuste Velocidade, Tom e Volume com os sliders
- Digite um texto de teste e clique Testar voz para visualizar
- Todas as alterações são salvas automaticamente
- Abra Opções avançadas → Atalho de teclado
- Clique em Alterar
- Pressione a combinação de teclas desejada (ex: Ctrl+Shift+S)
- O novo atalho é salvo e aplicado aos atalhos globais do KDE imediatamente
- Selecione Piper (Neural TTS) como motor
- Se o Piper não estiver instalado, um diálogo de instalação aparece
- Clique Instalar para baixar automaticamente via
pacman:piper-tts-bin— O binário Piperpiper-voices-<idioma>— Modelos de voz para seu idioma
- Após instalação, as vozes são descobertas automaticamente
tts-biglinux/
├── locale/ # Arquivos de tradução fonte (.po, .pot)
│ ├── tts-biglinux.pot # Template de tradução (29 idiomas)
│ ├── pt-BR.po # Português brasileiro
│ ├── en.po # Inglês
│ └── ... # bg, cs, da, de, el, es, et, fi, fr, he,
│ # hr, hu, is, it, ja, ko, nl, no, pl, pt,
│ # ro, ru, sk, sv, tr, uk, zh
├── pkgbuild/
│ └── PKGBUILD # Script de empacotamento Arch/BigLinux
├── usr/
│ ├── bin/
│ │ ├── biglinux-tts # Entry point bash → python main.py
│ │ └── biglinux-tts-speak # Script bash standalone para Alt+V
│ └── share/
│ ├── applications/
│ │ └── br.com.biglinux.tts.desktop # Launcher .desktop
│ ├── biglinux/tts-biglinux/ # ← Código Python do aplicativo
│ │ ├── main.py # Entry point: CLI args, logging, App.run()
│ │ ├── application.py # Adw.Application: ciclo de vida, ações
│ │ ├── config.py # Constantes, enums, dataclasses, I/O JSON
│ │ ├── window.py # Adw.ApplicationWindow: header bar, menu
│ │ ├── services/
│ │ │ ├── tts_service.py # Máquina de estados TTS: speak/stop
│ │ │ ├── voice_manager.py # Descoberta de vozes (3 motores)
│ │ │ ├── text_processor.py # Processamento: abrev, chars, URLs
│ │ │ ├── clipboard_service.py # Clipboard Wayland (wl-paste) / X11
│ │ │ ├── settings_service.py # Persistência JSON com debounce
│ │ │ └── tray_service.py # System tray PySide6 em subprocesso
│ │ ├── ui/
│ │ │ ├── main_view.py # View principal: hero, controles, seções
│ │ │ ├── components.py # 9 fábricas de widgets Adwaita
│ │ │ └── welcome_dialog.py # Diálogo de boas-vindas (primeiro uso)
│ │ ├── utils/
│ │ │ ├── async_utils.py # Debouncer, run_in_thread
│ │ │ └── i18n.py # Sistema i18n (parsing .po)
│ │ └── resources/
│ │ ├── __init__.py # load_css() — carrega style.css
│ │ └── style.css # CSS customizado (hero, animações)
│ ├── icons/hicolor/scalable/
│ │ ├── apps/biglinux-tts.svg # Ícone do aplicativo
│ │ └── status/tts-biglinux-symbolic.svg # Ícone symbolic (tray)
│ ├── khotkeys/
│ │ └── ttsbiglinux.khotkeys # Atalho KDE Plasma 5
│ └── locale/ # Traduções compiladas (.mo)
│ ├── pt_BR/LC_MESSAGES/tts-biglinux.mo
│ └── .../ # 28 idiomas
└── README.md
┌─────────────────────────────────────────────────────────────────┐
│ main.py │
│ Argument parsing, logging setup │
│ TTSApplication.run() │
├─────────────────────────────────────────────────────────────────┤
│ application.py │
│ TTSApplication (Adw.Application) │
│ startup → activate → shutdown lifecycle │
│ Global actions: about, quit, tray setup │
├──────────────────┬──────────────────┬───────────────────────────┤
│ UI Layer │ Service Layer │ Data Layer │
├──────────────────┼──────────────────┼───────────────────────────┤
│ window.py │ tts_service.py │ config.py │
│ ├ HeaderBar │ ├ speak() │ ├ AppSettings │
│ ├ NavigationView │ ├ stop() │ ├ SpeechConfig │
│ └ Toast overlay │ └ state machine │ ├ TextConfig │
│ │ │ ├ ShortcutConfig │
│ main_view.py │ voice_manager.py │ └ WindowConfig │
│ ├ Hero section │ └ discover() │ │
│ ├ Voice controls │ │ settings_service.py │
│ ├ Backend select │ text_processor.py│ ├ load/save JSON │
│ ├ Text options │ ├ abbreviations │ └ debounced auto-save │
│ └ Advanced │ ├ special chars │ │
│ │ └ formatting │ │
│ components.py │ │ │
│ └ 9 factories │ clipboard_svc.py │ │
│ │ ├ wl-paste │ │
│ welcome_dialog.py│ └ xsel │ │
│ └ First-run │ │ │
│ │ tray_service.py │ │
│ │ └ PySide6 subproc│ │
├──────────────────┼──────────────────┼───────────────────────────┤
│ utils/i18n.py │ utils/async_utils.py │
│ └ _() function │ ├ Debouncer (GLib.timeout_add) │
│ │ └ run_in_thread (daemon + GLib.idle_add) │
└──────────────────┴──────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
speech-dispatcher espeak-ng piper-tts
(speechd.SSIPClient) (direct) (stdin → aplay)
- UI Layer — Widgets GTK4 + libadwaita seguindo GNOME HIG. Seção hero com status ao vivo, grupos de preferências para configurações de voz, seleção de motor, processamento de texto e opções avançadas. Notificações toast para feedback
- Service Layer — Máquina de estados TTS com ciclo speak/stop/cleanup. Descoberta de vozes em background. Pipeline de normalização de texto. Acesso ao clipboard tanto Wayland quanto X11
- Data Layer — Dataclasses tipadas para todas as configurações. Persistência JSON em
~/.config/biglinux-tts/settings.json. Defaults sensatos com capacidade de reset
speak() stop() / error / conclusão
┌──────────────┐ ┌──────────────────────────────┐
│ ▼ │ │
│ ┌────────┐ │ ┌──────────┐ │
│ │ IDLE │───┘ │ SPEAKING │──────────────┘
│ └────────┘ └──────────┘
│ │ │
│ speak() error()
│ │ │
│ ┌────▼────┐ ┌────▼─────┐
│ │SPEAKING │ │ ERROR │
│ └─────────┘ └──────────┘
│ │
└──────────────────────────────┘
speak()
- IDLE: nenhuma fala em progresso, pronto para receber comandos
- SPEAKING: áudio sendo reproduzido; monitorado por polling a cada 300ms via
GLib.timeout_add - ERROR: erro ocorreu (motor indisponível, modelo não encontrado); retorna a IDLE na próxima tentativa
O system tray roda em um subprocesso PySide6 separado, comunicando-se com o processo GTK principal via JSON lines:
Processo GTK (pai) Processo Qt (filho)
│ │
│── {"cmd":"set_menu",...} ──────▶│ configura menu de contexto
│── {"cmd":"set_tooltip",...} ───▶│ define tooltip
│ │
│◀── {"event":"ready"} ─────────│ tray icon visível
│◀── {"event":"activate"} ──────│ clique esquerdo
│◀── {"event":"menu","id":1} ───│ item de menu clicado
│ │
│── {"cmd":"quit"} ─────────────▶│ encerrar
│ │
O processo pai monitora stdout do filho via GLib.IOChannel.unix_new() com watch não-bloqueante.
| Caminho | Conteúdo |
|---|---|
~/.config/biglinux-tts/settings.json |
Todas as configurações do app (JSON) |
/tmp/biglinux-tts-{usuario}.pid |
PID do processo de fala (toggle Alt+V) |
{
"speech": {
"rate": -25,
"pitch": -25,
"volume": 75,
"voice_id": "piper:/usr/share/piper-voices/pt/pt_BR/faber/medium/pt_BR-faber-medium.onnx",
"backend": "piper",
"output_module": "rhvoice"
},
"text": {
"expand_abbreviations": true,
"process_urls": false,
"process_special_chars": true,
"strip_formatting": true,
"max_chars": 0
},
"shortcut": {
"keybinding": "<Alt>v",
"enabled": true,
"show_in_launcher": false
},
"window": {
"width": 560,
"height": 680,
"maximized": false
},
"show_welcome": true
}| Configuração | Descrição | Padrão |
|---|---|---|
speech.backend |
Motor TTS: speech-dispatcher, espeak-ng, piper |
speech-dispatcher |
speech.output_module |
Módulo speech-dispatcher: rhvoice, espeak-ng, etc. |
rhvoice |
speech.voice_id |
Identificador da voz (específico do motor) | Auto-detectado |
speech.rate |
Velocidade da fala (-100 a 100) | 0 |
speech.pitch |
Tom da voz (-100 a 100) | 0 |
speech.volume |
Volume da fala (0 a 100) | 80 |
text.expand_abbreviations |
Substituir abreviações por palavras completas | true |
text.process_special_chars |
Ler símbolos (#, @, %) pelo nome | false |
text.strip_formatting |
Remover HTML/Markdown antes de ler | true |
text.process_urls |
Ler URLs em voz alta | false |
text.max_chars |
Limite de caracteres (0 = ilimitado) | 0 |
shortcut.keybinding |
Atalho global de teclado | <Alt>v |
shortcut.show_in_launcher |
Fixar botão de fala na barra de tarefas | false |
window.width/height |
Dimensões da janela em pixels | 560×680 |
show_welcome |
Mostrar diálogo de boas-vindas | true |
O app detecta automaticamente configurações do formato antigo em ~/.config/tts-biglinux/ (arquivos individuais: rate, pitch, volume, voice) e consolida tudo em um único JSON no novo caminho.
O sistema de tradução usa arquivos gettext .po (formato texto, não binário .mo) com parsing próprio em Python:
- Detecção de locale:
LANGUAGE→LC_ALL→LC_MESSAGES→LANG - Busca de arquivo: tenta variantes
pt-BRept_BR, depois fallback para código basept - Caminhos de busca:
./locale/(dev) →/usr/share/tts-biglinux/locale/(instalado)
Uso no código:
from utils.i18n import _
label.set_text(_("Ready to speak")) # → "Pronto para falar" em pt-BR| Código | Idioma | Código | Idioma |
|---|---|---|---|
| bg | Búlgaro | ko | Coreano |
| cs | Tcheco | nl | Holandês |
| da | Dinamarquês | no | Norueguês |
| de | Alemão | pl | Polonês |
| el | Grego | pt | Português |
| en | Inglês | pt-BR | Português (Brasil) |
| es | Espanhol | ro | Romeno |
| et | Estoniano | ru | Russo |
| fi | Finlandês | sk | Eslovaco |
| fr | Francês | sv | Sueco |
| he | Hebraico | tr | Turco |
| hr | Croata | uk | Ucraniano |
| hu | Húngaro | zh | Chinês |
| is | Islandês | it | Italiano |
| ja | Japonês |
- Copie o template:
cp locale/tts-biglinux.pot locale/<idioma>.po - Edite o arquivo
.pocom suas traduções - Compile:
msgfmt locale/<idioma>.po -o usr/share/locale/<idioma>/LC_MESSAGES/tts-biglinux.mo
O módulo text_processor.py aplica um pipeline de transformações ao texto antes da síntese:
- Strip de formatação (se ativo): remove tags HTML (
<[^>]+>), Markdown bold/italic/code, headers, listas, links - Remoção/leitura de URLs (configurável): remove ou mantém
https?://\S+ - Expansão de abreviações (sensível ao idioma):
- Português: ~65 abreviações —
tb→"também",vc→"você",blz→"beleza",rsrs→"risos",pq→"porque",msg→"mensagem",obg→"obrigado",vlw→"valeu", etc. - Inglês: ~30 —
btw→"by the way",idk→"I don't know",tbh→"to be honest", etc. - Espanhol: ~10 —
tb→"también",pq→"porque", etc.
- Português: ~65 abreviações —
- Caracteres especiais (sensível ao idioma):
- Português:
#→"cerquilha",@→"arroba",%→"por cento",&→"e comercial",$→"cifrão" - Inglês:
#→"hash",@→"at",%→"percent",&→"ampersand",$→"dollar"
- Português:
- Limpeza final: colapsa espaços/quebras de linha múltiplos
O módulo clipboard_service.py detecta automaticamente o ambiente gráfico:
- Wayland:
wl-paste --primary --no-newline(seleção primária), fallback para clipboard regular - X11:
xsel --primary -o, fallback paraxsel -o, depoisxclip - Timeout: 3 segundos por comando
- Detecção:
XDG_SESSION_TYPE == "wayland"ou presença deWAYLAND_DISPLAY
O settings_service.py implementa salvamento automático com debounce de 500ms:
- Qualquer alteração de configuração agenda um timer
GLib.timeout_add(500ms) - Se outra alteração ocorrer antes dos 500ms, o timer anterior é cancelado
- Após 500ms sem alterações, o JSON é gravado em disco
- Garante consistência sem I/O excessivo durante ajustes rápidos de sliders
O arquivo resources/style.css define o tema visual usando variáveis CSS do Adwaita:
- Hero section: gradiente de fundo com cor de destaque do tema (
@accent_bg_color) - Animação de fala: pulsação do ícone durante reprodução (
@keyframes pulse-speaking) - Badges de qualidade: chips coloridos para vozes neurais (cor de sucesso)
- Responsividade:
Adw.Clamplimita largura a 600px com threshold de 400px
9 funções fábricas para criar widgets Adwaita consistentes:
| Fábrica | Widget | Uso |
|---|---|---|
create_preferences_group |
Adw.PreferencesGroup |
Grupos de configurações |
create_action_row_with_switch |
Adw.ActionRow + Gtk.Switch |
Toggles on/off |
create_action_row_with_scale |
Adw.ActionRow + Gtk.Scale |
Sliders (velocidade, tom, volume) |
create_combo_row |
Adw.ComboRow |
Seleção de opções (motor, voz) |
create_spin_row |
Adw.SpinRow |
Entrada numérica |
create_expander_row |
Adw.ExpanderRow |
Seções expansíveis |
create_button_row |
Gtk.Button |
Botões de ação |
create_icon_button |
Gtk.Button (ícone) |
Botões com ícone |
Todos os widgets incluem AccessibleProperty.LABEL para acessibilidade.
- Debouncer: implementado com
GLib.timeout_add()— salva configurações após 500ms de inatividade - run_in_thread: executa operações pesadas (clipboard, descoberta de vozes) em daemon threads, entregando resultado ao main thread via
GLib.idle_add() - TTS monitoring: polling a cada 300ms via
GLib.timeout_add()para detectar conclusão da fala (speech-dispatcher) ou fim do processo (espeak-ng, Piper) - UI thread: nenhuma operação bloqueante na thread principal GTK
- kglobalshortcutsrc: atalho registrado via
kwriteconfig6nokglobalshortcutsrc5 - Desktop file:
X-KDE-Shortcutsno.desktoppara integração com Plasma - kbuildsycoca6: regenera cache de serviços após alterações de atalhos
- icontasks: configuração do launcher para fixação na barra de tarefas
Script standalone acionado pelo atalho global Alt+V. Funcionamento:
- Verifica se já está falando (
/tmp/biglinux-tts-speak-{user}.pid)- Se sim → mata o processo e sai (toggle off)
- Captura texto selecionado via clipboard (wl-paste/xsel)
- Aplica processamento de texto (abreviações, caracteres especiais)
- Lê configurações de
~/.config/biglinux-tts/settings.json - Executa o motor TTS configurado (speech-dispatcher/espeak-ng/piper)
- Registra PID para permitir toggle na próxima chamada
O pacote é construído para Arch Linux / BigLinux / Manjaro:
pkgname=tts-biglinux
pkgver=$(date +%y.%m.%d) # Versionamento por data (ex: 25.06.19)
pkgrel=$(date +%H%M) # Release por hora (múltiplos builds/dia)
arch=('any') # Independente de plataforma (Python puro)
license=('GPL')A função package() copia a árvore usr/ para o destino, mantendo a estrutura de diretórios já pronta no repositório. Cria o symlink de ícone para compatibilidade com nome antigo.
O projeto segue o padrão BigLinux para aplicativos Python:
usr/share/biglinux/{nome-do-app}/ # Código Python
usr/bin/{nome-do-app} # Script bash: cd + exec python main.py
Este padrão evita a necessidade de pyproject.toml, pip install, ou site-packages, simplificando empacotamento e distribuição.
Este projeto é licenciado sob a GPL-3.0.
Os motores TTS (speech-dispatcher, espeak-ng, RHVoice, Piper) possuem suas próprias licenças. Consulte a documentação de cada motor para detalhes.
- Tales A. Mendonça — Projeto BigLinux
- Bruno Gonçalves Araujo — Projeto BigLinux
- Rafael Ruscher — Desenvolvimento v3.0
BigLinux TTS v3.0 — Leitura de texto por voz para o desktop Linux