Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/site.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ jobs:
"docs/reference/presets.md:docs/reference/presets_RU.md"
"docs/troubleshooting.md:docs/troubleshooting_RU.md"
"docs/roadmap.md:docs/roadmap_RU.md"
"docs/research/acoustic-1-phy-sources.md:docs/research/acoustic-1-phy-sources_RU.md"
"spec/protocol-v1.md:spec/protocol-v1_RU.md"
"spec/acoustic-1.md:spec/acoustic-1_RU.md"
)
for pair in "${pairs[@]}"; do
source_path="${pair%%:*}"
Expand Down
15 changes: 12 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@ AudioModem separates a versioned data object from the path that carries its PCM

## Status

AudioModem is in the **bootstrap** stage. The verified path is text → ADLP v1 object → lossless WAV → ADLP v1 object → verified text. Live capture/playback, Bluetooth audio routing, radio interfaces, encryption, file payloads in the CLI and release artifacts are **not implemented**. See the [roadmap](docs/roadmap.md) for the intended order of work.
AudioModem has verified Rust ADLP/WAV codecs, a native Flutter↔Rust bridge, and local WAV import/export. Two controlled WAV carriers are available: deterministic bootstrap and experimental Acoustic-1 B-FSK. The verified paths are text → ADLP v1 object → selected WAV carrier → ADLP v1 object → verified text. Live capture/playback, Bluetooth audio routing, radio interfaces, encryption, application-level file payload workflow and release artifacts are **not implemented**. See the [roadmap](docs/roadmap.md) for the intended order of work.

| Area | Current status | Read more |
| --- | --- | --- |
| ADLP v1 container | Implemented and tested in Rust | [Protocol](spec/protocol-v1.md) |
| Bootstrap WAV codec | Implemented for deterministic 48 kHz mono PCM WAV round trips | [Quick start](docs/guides/getting-started.md) |
| Flutter client | Cross-platform UI scaffold; no Rust bridge yet | [Platform support](docs/reference/platform-support.md) |
| Live acoustic modem | Designed, not implemented | [Audio routes](docs/guides/audio-routes.md) |
| Flutter client | Native Rust bridge plus local WAV import/export; web honestly reports native codec as unavailable | [Bridge architecture](docs/architecture/flutter-rust-bridge.md) |
| Acoustic-1 carrier | Experimental B-FSK controlled PCM/WAV codec with framing, Hamming(7,4), bounded sync and golden vectors; no live-route claim | [Acoustic-1 RFC](spec/acoustic-1.md) |
| Live acoustic modem | Not implemented: no capture/playback route adapter or device acceptance result | [Audio routes](docs/guides/audio-routes.md) |
| Encryption and verified identity | Future RFC work | [Security](SECURITY.md) |

## Quick start: a reproducible WAV round trip
Expand All @@ -29,6 +30,13 @@ cargo run -p adlp-cli -- decode hello.wav

The command writes a lossless mono 48 kHz, signed 16-bit PCM WAV file and decodes the same object. This bootstrap symbol mapper is deliberately simple; it is **not** a robust over-the-air modulation scheme. The [quick-start guide](docs/guides/getting-started.md) explains the guarantee and its limits.

For a controlled experiment with the separate experimental carrier, use the explicit Acoustic-1 commands. A successful WAV round trip proves only this codec contract; it does not demonstrate a speaker-to-microphone link.

```bash
cargo run -p adlp-cli -- encode-acoustic1-text acoustic1.wav N1 "Controlled test" balanced
cargo run -p adlp-cli -- decode-acoustic1 acoustic1.wav
```

## Documentation

| English (canonical) | Russian translation | Purpose |
Expand All @@ -37,6 +45,7 @@ The command writes a lossless mono 48 kHz, signed 16-bit PCM WAV file and decode
| [Quick start](docs/guides/getting-started.md) | [Быстрый старт](docs/guides/getting-started_RU.md) | Reproducible WAV workflow |
| [Audio routes](docs/guides/audio-routes.md) | [Аудиомаршруты](docs/guides/audio-routes_RU.md) | WAV, live PCM, cable, radio and Bluetooth boundaries |
| [Protocol v1](spec/protocol-v1.md) | [Протокол v1](spec/protocol-v1_RU.md) | ADLP object and bootstrap WAV carrier |
| [Acoustic-1 RFC](spec/acoustic-1.md) | [Acoustic-1 RFC на русском](spec/acoustic-1_RU.md) | Experimental B-FSK carrier and compatibility boundary |
| [Platform support](docs/reference/platform-support.md) | [Поддержка платформ](docs/reference/platform-support_RU.md) | Target runners and feature status |
| [Transmission presets](docs/reference/presets.md) | [Пресеты передачи](docs/reference/presets_RU.md) | Reliable, Balanced, Fast and Narrowband IDs |
| [Troubleshooting](docs/troubleshooting.md) | [Диагностика](docs/troubleshooting_RU.md) | Observable failures and useful reports |
Expand Down
17 changes: 13 additions & 4 deletions README_RU.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,19 @@

AudioModem отделяет версионированный объект данных от маршрута, который переносит его PCM-сигнал. Один и тот же объект ADLP можно экспортировать в WAV для воспроизводимой передачи, отправить будущим маршрутом «динамик → микрофон», подключить к line-level кабелю или направить через внешнее радиооборудование. Репозиторий содержит Rust protocol/core, Flutter-интерфейс и открытую спецификацию.

> **Статус перевода:** перевод `README.md`; синхронизировано 2026-08-19. Английский оригинал является нормативным для совместимости протокола, release commitments и решений реализации.
> **Статус перевода:** перевод `README.md`; синхронизировано 2026-08-20. Английский оригинал является нормативным для совместимости протокола, release commitments и решений реализации.

## Статус

AudioModem находится на стадии **bootstrap**. Проверенный путь выглядит так: text → ADLP v1 object → lossless WAV → ADLP v1 object → verified text. Live capture/playback, Bluetooth-аудиомаршрутизация, радиоинтерфейсы, шифрование, file payload в CLI и release artifacts **не реализованы**. Очерёдность работ приведена в [дорожной карте](docs/roadmap_RU.md).
AudioModem имеет проверенные Rust ADLP/WAV codecs, native Flutter↔Rust bridge и локальный WAV import/export. Доступны два контролируемых WAV carriers: детерминированный bootstrap и экспериментальный Acoustic-1 B-FSK. Проверенный путь выглядит так: text → ADLP v1 object → выбранный WAV carrier → ADLP v1 object → verified text. Live capture/playback, Bluetooth-аудиомаршрутизация, радиоинтерфейсы, шифрование, application-level file payload workflow и release artifacts **не реализованы**. Очерёдность работ приведена в [дорожной карте](docs/roadmap_RU.md).

| Область | Текущий статус | Подробнее |
| --- | --- | --- |
| ADLP v1 container | Реализован и покрыт Rust-тестами | [Протокол](spec/protocol-v1_RU.md) |
| Bootstrap WAV codec | Реализован для детерминированного 48 kHz mono PCM WAV round trip | [Быстрый старт](docs/guides/getting-started_RU.md) |
| Flutter client | Cross-platform UI scaffold; Rust bridge ещё нет | [Поддержка платформ](docs/reference/platform-support_RU.md) |
| Live acoustic modem | Спроектирован, не реализован | [Аудиомаршруты](docs/guides/audio-routes_RU.md) |
| Flutter client | Native Rust bridge и локальный WAV import/export; web честно сообщает, что native codec недоступен | [Архитектура bridge](docs/architecture/flutter-rust-bridge_RU.md) |
| Acoustic-1 carrier | Экспериментальный B-FSK controlled PCM/WAV codec с framing, Hamming(7,4), bounded sync и golden vectors; без live-route claim | [Acoustic-1 RFC](spec/acoustic-1_RU.md) |
| Live acoustic modem | Не реализован: нет capture/playback route adapter или device acceptance result | [Аудиомаршруты](docs/guides/audio-routes_RU.md) |
| Шифрование и проверяемая идентичность | Будущая RFC-работа | [Безопасность](SECURITY.md) |

## Быстрый старт: воспроизводимый WAV round trip
Expand All @@ -31,6 +32,13 @@ cargo run -p adlp-cli -- decode hello.wav

Команда записывает lossless mono 48 kHz signed 16-bit PCM WAV и затем декодирует тот же объект. Bootstrap symbol mapper намеренно прост и **не** является надёжной схемой модуляции для передачи по воздуху. Гарантии и ограничения описаны в [руководстве быстрого старта](docs/guides/getting-started_RU.md).

Для controlled experiment с отдельным экспериментальным carrier используйте явные Acoustic-1 commands. Успешный WAV round trip доказывает только этот codec contract; он не демонстрирует speaker-to-microphone link.

```bash
cargo run -p adlp-cli -- encode-acoustic1-text acoustic1.wav N1 "Контролируемый тест" balanced
cargo run -p adlp-cli -- decode-acoustic1 acoustic1.wav
```

## Документация

| Английский оригинал | Русский перевод | Назначение |
Expand All @@ -39,6 +47,7 @@ cargo run -p adlp-cli -- decode hello.wav
| [Quick start](docs/guides/getting-started.md) | [Быстрый старт](docs/guides/getting-started_RU.md) | Воспроизводимый WAV workflow |
| [Audio routes](docs/guides/audio-routes.md) | [Аудиомаршруты](docs/guides/audio-routes_RU.md) | Границы WAV, live PCM, cable, radio и Bluetooth |
| [Protocol v1](spec/protocol-v1.md) | [Протокол v1](spec/protocol-v1_RU.md) | ADLP object и bootstrap WAV carrier |
| [Acoustic-1 RFC](spec/acoustic-1.md) | [Acoustic-1 RFC на русском](spec/acoustic-1_RU.md) | Экспериментальный B-FSK carrier и граница compatibility |
| [Platform support](docs/reference/platform-support.md) | [Поддержка платформ](docs/reference/platform-support_RU.md) | Target runners и feature status |
| [Transmission presets](docs/reference/presets.md) | [Пресеты передачи](docs/reference/presets_RU.md) | Reliable, Balanced, Fast и Narrowband IDs |
| [Troubleshooting](docs/troubleshooting.md) | [Диагностика](docs/troubleshooting_RU.md) | Наблюдаемые ошибки и полезные отчёты |
Expand Down
31 changes: 26 additions & 5 deletions apps/audio_modem/lib/bridge/wav_bootstrap_bridge.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@ class WavBuildResult {
const WavBuildResult({
required this.sessionId,
required this.profile,
required this.carrier,
required this.sampleRateHz,
required this.wavBytes,
});

final int sessionId;
final String profile;
final String carrier;
final int sampleRateHz;
final Uint8List wavBytes;
}
Expand All @@ -24,6 +26,7 @@ class WavDecodeResult {
required this.sessionId,
required this.senderCallsign,
required this.profile,
required this.carrier,
required this.text,
required this.sampleRateHz,
required this.samplesConsumed,
Expand All @@ -32,6 +35,7 @@ class WavDecodeResult {
final int sessionId;
final String senderCallsign;
final String profile;
final String carrier;
final String text;
final int sampleRateHz;
final int samplesConsumed;
Expand All @@ -45,9 +49,13 @@ abstract interface class WavBootstrapBridge {
required String senderCallsign,
required String text,
required String profile,
required String carrier,
});

Future<WavDecodeResult> decodeWav(Uint8List wavBytes);
Future<WavDecodeResult> decodeWav({
required Uint8List wavBytes,
required String carrier,
});
}

class NativeWavBootstrapBridge implements WavBootstrapBridge {
Expand All @@ -72,28 +80,38 @@ class NativeWavBootstrapBridge implements WavBootstrapBridge {
required String senderCallsign,
required String text,
required String profile,
required String carrier,
}) async {
final result = await rust.encodeTextToWav(
sessionId: sessionId,
senderCallsign: senderCallsign,
text: text,
profile: profile,
carrier: carrier,
);
return WavBuildResult(
sessionId: result.sessionId,
profile: result.profile,
carrier: result.carrier,
sampleRateHz: result.sampleRateHz,
wavBytes: result.wavBytes,
);
}

@override
Future<WavDecodeResult> decodeWav(Uint8List wavBytes) async {
final result = await rust.decodeWavText(wavBytes: wavBytes);
Future<WavDecodeResult> decodeWav({
required Uint8List wavBytes,
required String carrier,
}) async {
final result = await rust.decodeWavText(
wavBytes: wavBytes,
carrier: carrier,
);
return WavDecodeResult(
sessionId: result.sessionId,
senderCallsign: result.senderCallsign,
profile: result.profile,
carrier: result.carrier,
text: result.text,
sampleRateHz: result.sampleRateHz,
samplesConsumed: result.samplesConsumed,
Expand All @@ -115,9 +133,12 @@ class UnavailableWavBootstrapBridge implements WavBootstrapBridge {
required String senderCallsign,
required String text,
required String profile,
required String carrier,
}) => Future.error(StateError(reason));

@override
Future<WavDecodeResult> decodeWav(Uint8List wavBytes) =>
Future.error(StateError(reason));
Future<WavDecodeResult> decodeWav({
required Uint8List wavBytes,
required String carrier,
}) => Future.error(StateError(reason));
}
Loading
Loading