soundbridge-tx
Transmissor de arquivos por áudio. Envia arquivos de um PC para outro usando apenas som — sem rede, sem Wi-Fi, sem pendrive. Os bytes são codificados em um sinal OFDM (várias subportadoras de áudio em paralelo, como um modem de linha telefônica ou o Wi-Fi), tocados pela saída de áudio, e capturados pela entrada de linha do outro PC.
Este pacote é o transmissor (TX) em Python. O receptor (RX) é um aplicativo C++/Qt separado, mas
o pacote também inclui um oráculo em Python (soundbridge_tx.oracle) capaz de decodificar, útil
para testes e validação.
Instalação
pip install soundbridge-tx
O sounddevice (usado para tocar/capturar áudio) já vem incluído.
Uso rápido
Como biblioteca
from soundbridge_tx import send_file
# escolhe modulação e FEC automaticamente pelo tamanho do arquivo
send_file("meu_arquivo.zip", device=14, auto=True)
Gerar um WAV (sem tocar), para reproduzir depois:
from soundbridge_tx import generate_wav
generate_wav("meu_arquivo.zip", "saida.wav", auto=True)
Enviar um texto direto:
from soundbridge_tx import send_text
send_text("chave: abc123", device=14, copy_to_clipboard=True)
Listar os dispositivos de saída:
from soundbridge_tx import list_devices
for dev in list_devices():
print(dev)
Pela linha de comando
Após instalar, o comando soundbridge-tx fica disponível:
# transmitir ao vivo, escolhendo tudo automaticamente
soundbridge-tx --in meu_arquivo.zip --auto --stereo --band-high 22000 --play --device 14
# gerar um WAV
soundbridge-tx --in meu_arquivo.zip --auto --stereo --band-high 22000 --out saida.wav
# listar os dispositivos de saída
soundbridge-tx --list-devices
Não sabe o índice do
--device? Use--playsem o--device. O programa lista os dispositivos e pergunta qual usar antes de enviar.
Parâmetros da linha de comando
Entrada e saída
| Parâmetro | Descrição |
|---|---|
--in ARQUIVO |
arquivo a transmitir. Também aceita uma pasta (envia todos os arquivos dela, um a um) |
--text "..." |
envia um texto direto, em vez de um arquivo |
--out ARQUIVO.wav |
gera um arquivo WAV em vez de tocar ao vivo |
--play |
toca ao vivo na placa de som |
--device N |
índice do dispositivo de saída (com --play) |
--list-devices |
lista os dispositivos de saída disponíveis e encerra |
--size N |
tamanho de um arquivo de teste gerado internamente (quando não há --in nem --text) |
Modulação e correção de erro
| Parâmetro | Descrição |
|---|---|
--auto |
escolhe a modulação e o FEC automaticamente pelo tamanho do arquivo (recomendado) |
--qam16 |
16-QAM (4 bits por subportadora) |
--qam64 |
64-QAM (6 bits — o teto robusto, recomendado para arquivos grandes) |
--qam256 |
256-QAM (8 bits — experimental, ideal para arquivos pequenos-médios) |
--qam1024 |
1024-QAM (10 bits — experimental, para arquivos muito pequenos) |
| (nenhum) | QPSK (2 bits — o padrão, mais robusto) |
--fec MODO |
correção de erro: r12 (padrão, robusto), r23/r34 (mais leves/rápidos, para arquivos pequenos-médios) ou none (sem proteção) |
--resync MODO |
re-sincronização contra drift de clock: off, 10 (padrão), 25 ou 5 blocos |
--parity MODO |
blocos de paridade para recuperar perdas: off, 8, 16 (padrão) ou 32 grupos |
Canal e banda
| Parâmetro | Descrição |
|---|---|
--stereo |
usa os dois canais do cabo (2× mais rápido; recomendado) |
--band-high N |
frequência máxima da banda OFDM em Hz (padrão 14000; recomendado 22000) |
--peak V |
pico de amplitude do sinal (0–1; reduza se a entrada estiver saturando) |
--guard S |
silêncio de guarda em segundos no início/fim do sinal |
Metadados (o receptor usa ao salvar)
| Parâmetro | Descrição |
|---|---|
--name "NOME" |
nome do arquivo salvo no receptor (aceita subpasta: docs/a.txt) |
--profile NOME |
perfil de recepção (o receptor resolve a pasta de destino) |
--copymemory |
o receptor copia o conteúdo para a área de transferência |
--zip |
comprime os dados antes de enviar (o receptor descomprime). Grande ganho para texto/dados compressíveis |
Múltiplos arquivos (com --in PASTA)
| Parâmetro | Descrição |
|---|---|
--gap S |
intervalo em segundos entre arquivos (padrão 5) |
Diagnóstico
| Parâmetro | Descrição |
|---|---|
--verbose |
mostra detalhes de cada etapa (padrão: só a barra de progresso e o CRC) |
O modo automático (--auto)
Com --auto, o transmissor escolhe a modulação e o FEC pelo tamanho do arquivo,
com base no que foi validado no cabo:
| Tamanho | Escolha | Motivo |
|---|---|---|
| até ~12 KB | 1024-QAM + r12 | o mais rápido; a janela curta protege a modulação densa |
| até ~100 KB | 256-QAM + r34 | denso e com FEC leve — rápido e confiável nesse tamanho |
| acima disso | 64-QAM + r12 | o teto robusto, seguro para arquivos grandes |
As faixas são conservadoras (com margem sobre o medido), priorizando a entrega confiável. Para arquivos grandes, o 64-QAM r12 é sempre a escolha robusta.
Se combinado com --zip, a escolha considera o tamanho comprimido.
Velocidade
Depende da modulação (mais densa = mais rápida, menos robusta):
| Modulação | Velocidade | Observação |
|---|---|---|
| QPSK | ~4 KB/s | mais robusta |
| 16-QAM | ~8 KB/s | equilíbrio |
| 64-QAM | ~12 KB/s | recomendada (teto robusto) |
| 256/1024-QAM | ~16–20 KB/s | experimentais (arquivos pequenos-médios) |
--zip |
até 100×+ | quando os dados comprimem bem |
Preparar o PC transmissor (Windows)
Para o áudio chegar íntegro ao cabo, desative qualquer processamento de som na saída usada: efeitos do driver (equalizador, "surround", "bass boost"), o som espacial do Windows, e painéis de áudio de fabricante. Confirme que o dispositivo opera a 48000 Hz. Na prática o sistema decodifica mesmo com alguns efeitos ligados (o FEC corrige), mas desativá-los dá a melhor margem.
A listagem de dispositivos mostra apenas as saídas WASAPI a 48 kHz (as que o SoundBridge usa). Para ver todas as saídas do sistema, use
--all-devices.
API Python
from soundbridge_tx import send_file, send_text, generate_wav, list_devices
send_file(path, device=None, auto=False, modulation="qpsk", fec="r12", stereo=True, band_high=22000, zip=False, name=None, profile=None, copy_to_clipboard=False)
Transmite um arquivo ao vivo. modulation: "qpsk", "16qam", "64qam", "256qam",
"1024qam". fec: "none", "r12", "r23", "r34".
generate_wav(path, out_wav, **opts)
Gera um WAV em vez de tocar (mesmas opções, sem device).
send_text(text, device=None, **opts)
Envia um texto direto.
list_devices()
Retorna os dispositivos de saída disponíveis, como uma lista de dicionários com as chaves
index, name, channels, sample_rate, api e default.
Como funciona (resumo)
O sinal é OFDM a 48 kHz: um símbolo de sincronização, um de estimativa de canal, um cabeçalho protegido por CRC-24, e os símbolos de dados. Os dados passam por correção de erro (código convolucional + interleaver + paridade) e são organizados em blocos com CRC próprio. No estéreo, os blocos são divididos entre os dois canais (dobrando a velocidade). O receptor remonta os blocos, recupera perdas pela paridade quando possível, e valida o CRC32 final antes de salvar.
Licença
MIT.
Metadata
Release files for soundbridge-tx 1.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| soundbridge_tx-1.1.1.tar.gz | 34.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| soundbridge_tx-1.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 68.2 kB
Release files / soundbridge_tx-1.1.1.tar.gz
| Download URL | soundbridge_tx-1.1.1.tar.gz |
|---|---|
| Size | 34.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
211dd80eab2d034f7ecbc51e5109b31b3b7c132f83b8df6c9932c56a7df5008e
|
|
BLAKE2b-256 checksum How to use checksums |
5f4cb3fae2fdfef82471e0181f32a5e2a201c6891c3e5348ea059081fbfc8520
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.15.0b1
|
Release files / soundbridge_tx-1.1.1-py3-none-any.whl
| Download URL | soundbridge_tx-1.1.1-py3-none-any.whl |
|---|---|
| Size | 34.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2182a45b56a4244fd1fd1b51bf94ab3d26761470066d4349674952e81798db28
|
|
BLAKE2b-256 checksum How to use checksums |
2fea5da39fb36a3f7102d3efc67cb70157540331a3fc50042c88dcfbf21bd607
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.15.0b1
|