PW
Paweł Wójcikiewicz Architekt systemów AI • Notatki inżynierskie
Główna / Projekty / Selektywny routing transkrypcji na Androidzie
Android 15 • One UI 7 MacroDroid & Toybox Caller HUD SQLite WhisperX GPU Diarization Październik 2026

Selektywny routing transkrypcji na Androidzie: hybrydowa architektura prywatności i automatyzacji B2B

Wdrożenie 3-poziomowego silnika decyzyjnego dla połączeń głosowych na smartfonie Samsung Galaxy S25. Rozwiązanie łączy bezkompromisową ochronę prywatności domowników (Hard Drop) z bezdotykową wysyłką rozmów z klientami biznesowymi (0-Click B2B) do prywatnego klastra transkrypcji WhisperX na stacji RTX 5090 Blackwell.

< 1 ms
Ocena prywatności
Regex Toybox w pamięci telefonu
2 ms
Zapytanie Caller HUD
SQLite FTS5 na Proxmox LXC
0 kliknięć
Obsługa stałych klientów
100% bezdotykowy upload B2B
100%
Gwarancja prywatności
Zero wycieku rozmów domowych
01. Geneza projektu

Wyzwanie inżynierskie i ograniczenia systemowe Androida

W pracy inżyniera sprzedaży technicznej i architekta rozwiązań dziesiątki kluczowych ustaleń (parametry obiektów, terminy pomiarów wibroakustycznych, wymagania przetargowe czy budżety) padają w trakcie dynamicznych rozmów telefonicznych prowadzonych z samochodu lub w terenie. Ręczne sporządzanie notatek po zakończeniu każdej rozmowy jest nieefektywne, a odkładanie tego na koniec dnia prowadzi do utraty krytycznych szczegółów.

Standardowe podejścia do nagrywania i transkrypcji cierpią jednak na trzy krytyczne wady:

Pułapka pełnego automatu

Ślepe przesyłanie wszystkich nagrań do chmury lub na serwer GPU rażąco narusza prywatność rozmów prywatnych (żona, dzieci, rodzina) i zaśmieca firmowy skarbiec wiedzy zbędnymi transkrypcjami.

Niewygoda manualnej selekcji

Wymuszanie klikania przycisku po każdej rozmowie kończy się tym, że w One UI 7 powiadomienia zwijają się w anonimowy stosik MacroDroid, a inżynier po kilku godzinach nie pamięta, które powiadomienie dotyczyło kogo.

Ograniczenia fabrycznego dialera

Aplikacja telefonu w One UI zamyka plik audio (.m4a) z opóźnieniem do 1.5 sekundy po odłożeniu słuchawki. Zbyt szybka próba odczytu skutkuje skopiowaniem pustego pliku 0 B.

02. Architektura systemu

Trzypoziomowy dyspozytor połączeń (Caller HUD white-list)

Każde zakończone połączenie podlega natychmiastowej klasyfikacji przez lokalny skrypt powłoki, który decyduje o losie nagrania.

Przepływ sterowania zdarzeniem i routing audio
Architektura selektywnej transkrypcji Android
🔍 Kliknij, aby powiększyć

Rzeczywisty zrzut przepływu sterowania połączeniem wygenerowany na telefonie Samsung Galaxy S25.

1

Poziom 1: Hard Drop

Prywatność bezwzględna

Wykorzystuje rygorystyczny regex Toybox powłoki Androida. Dopasowuje numery i nazwiska najbliższych z rodziny. W ułamku milisekundy skrypt przerywa działanie (exit 0).

  • • Zero powiadomień na ekranie
  • • Zero transferu sieciowego
  • • Plik zostaje wyłącznie w pamięci telefonu
2

Poziom 2: 0-Click B2B

Pełna automatyzacja B2B

Jeśli rozmówca nie jest na czarnej liście, skrypt w 2 ms odpytuje bramkę Caller HUD połączoną z bazą kontrahentów SQLite na klastrze Proxmox.

  • • Natychmiastowa kopia do bufora wysyłki
  • • Dyskretny alert Heads-Up z danymi firmy
  • • Zero konieczności dotykania smartfona
3

Poziom 3: 1-Tap HITL

Kontrola nad nieznanymi

Dotyczy kurierów, banków, numerów prywatnych i nowych potencjalnych leadów. Nagranie nie wysyła się samo, chroniąc bazę wiedzy przed śmieciowymi wpisami.

  • • Czytelne powiadomienie z numerem dzwoniącego
  • • Jeden przycisk akcji: [ Wyślij do AI ]
  • • Brak kliknięcia = ciche zignorowanie
03. Realizacja niskopoziomowa

Implementacja skryptów powłoki na Samsung Galaxy S25

Logika decyzyjna została przeniesiona z zawodnych interfejsów blokowych makr do zoptymalizowanego skryptu powłoki Bash/Toybox: /sdcard/Recordings/on_call_ended.sh. Skrypt ten jest wywoływany przez MacroDroid z uprawnieniami powłoki natychmiast po zdarzeniu CallEndedTrigger.

/sdcard/Recordings/on_call_ended.sh (fragment kluczowy) Toybox Shell
#!/system/bin/sh
# Caller HUD Dispatcher — selektywny routing transkrypcji
RAW_CALL_NAME="$1"
RAW_CALL_NUMBER="$2"

# 1. Poziom 1: Bezpieczna czarna lista kontaktów prywatnych (Hard Drop)
FAMILY_REGEX="^(Rodzina|Prywatne|Dom|Bliscy).*"  # Wzorzec zanonimizowany na potrzeby publikacji
if echo "$RAW_CALL_NAME $RAW_CALL_NUMBER" | grep -Eqi "$FAMILY_REGEX"; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [HARD DROP] Pominięto połączenie prywatne: $RAW_CALL_NAME ($RAW_CALL_NUMBER)" >> /sdcard/Recordings/transcription_log.txt
    exit 0
fi

# 2. Normalizacja numeru telefonu pod zapytanie bazy B2B
CLEAN_PHONE=$(echo "$RAW_CALL_NUMBER" | sed 's/[^0-9]//g' | sed 's/^48//')

# 3. Poziom 2: Asynchroniczne odpytanie bazy B2B przez szybki webhook SQLite
IS_B2B=0
if [ ${#CLEAN_PHONE} -ge 9 ]; then
    RESP=$(curl -s -m 2 "https://n8nev.duckdns.org/webhook/caller-id?phone=$CLEAN_PHONE" 2>/dev/null)
    if echo "$RESP" | grep -q '"found":true'; then
        IS_B2B=1
        COMPANY=$(echo "$RESP" | sed -n 's/.*"company":"\([^"]*\)".*/\1/p')
    fi
fi

# 4. Wykonanie akcji w zależności od werdyktu
if [ "$IS_B2B" -eq 1 ]; then
    # Czekamy 1.5s na domknięcie pliku m4a przez kodek Androida
    sleep 1.5
    /sdcard/Recordings/copy_latest_call.sh "$RAW_CALL_NAME" "$COMPANY"
    # Wywołanie intencji cichego powiadomienia heads-up
    am broadcast -a com.pw.ACTION_B2B_RECORDING_SENT --es name "$RAW_CALL_NAME" --es company "$COMPANY" >/dev/null 2>&1
else
    # Poziom 3: Wyświetlenie promptu HITL w MacroDroid
    am broadcast -a com.pw.ACTION_PROMPT_HITL_TRANSCRIPTION --es name "$RAW_CALL_NAME" --es number "$RAW_CALL_NUMBER" >/dev/null 2>&1
fi
04. Infrastruktura serwerowa

Potok serwerowy: od smartfona do bazy wiedzy w Obsidianie

1. Transport audio i kolejka zadań

Aplikacja FolderSync Pro monitoruje katalog /sdcard/Recordings/Do_transkrypcji/. Gdy pojawi się w nim nowe nagranie, następuje natychmiastowy asynchroniczny upload do dedykowanego bufora w Google Drive (dostępnego w prywatnej sieci lokalnej).

Po udanym transferze plik tymczasowy na smartfonie jest natychmiast usuwany, co zapobiega dublowaniu danych i oszczędza pamięć urządzenia.

2. Transkrypcja WhisperX na RTX 5090

Watcher na stacji roboczej natychmiast przekazuje nagranie do kontenera z modelem WhisperX zintegrowanym z biblioteką pyannote.audio (akceleracja CUDA cu124 na karcie NVIDIA RTX 5090 z 32 GB VRAM).

15-minutowa rozmowa jest transkrybowana w mniej niż 20 sekund z precyzyjnym podziałem na role mówców (SPEAKER_00, SPEAKER_01).

3. Synteza i ekstrakcja faktów w n8n

Silnik orkiestracji n8n na kontenerze Proxmox LXC 100 odbiera surowy strumień transkrypcji i kieruje go do lokalnego modelu językowego (Ollama: Qwen 32B).

Model ekstraktuje: kluczowe ustalenia handlowe, zadeklarowane terminy, kwoty i listę kolejnych kroków (Action Items) w żelaznym standardzie inżynierskim BLUF.

4. Wpięcie do Skarbca i karta Telegram

Gotowa notatka trafia bezpośrednio do teczki kontrahenta w lokalnym Skarbcu wiedzy Obsidian (02_Klienci/<Klient>/Notatki/).

Równolegle n8n wysyła na prywatny kanał Telegram Pawła kompaktową kartę decyzyjną z transkrypcją oraz przyciskami 1-tap do autoryzacji wpisu w CRM ITCube.

05. Weryfikacja w środowisku produkcyjnym

Wyniki testów na żywym urządzeniu Samsung Galaxy S25

Wszystkie trzy ścieżki decyzyjne zostały zweryfikowane bezpośrednio na połączonym fizycznie telefonie przez interfejs Android Debug Bridge (ADB). Fragmenty rzeczywistego dziennika zdarzeń z pliku /sdcard/Recordings/transcription_log.txt:

// Scenariusz 1: Rozmowa prywatna (Hard Drop)
[2026-10-27 21:04:59] [HARD DROP] Pominięto połączenie prywatne: Kontakt prywatny (+48 600 ••• •••)
➔ Werdykt: Proces zamknięty w <1 ms. Zero powiadomień, plik nietknięty.
// Scenariusz 2: Rozmowa z klientem B2B (Zweryfikowany kontrahent)
[2026-10-27 21:06:25] [AUTO B2B] Klient B2B (Partner Przemysłowy) -> Skopiowano: Polaczenie_B2B_AUDIO.m4a (14.2 MB)
➔ Werdykt: Rozpoznano klienta w bazie SQLite. Auto-kopia do bufora + Heads-Up push.
// Scenariusz 3: Połączenie od numeru nieznanego / nowego kontrahenta
[2026-10-27 21:05:57] [HITL PROMPT] Nieznany rozmówca: Numer nierozpoznany (+48 700 ••• •••)
➔ Werdykt: Brak w bazie B2B. Blokada auto-uploadu, wyświetlenie przycisku decyzyjnego HITL.

Chcesz porozmawiać o automatyzacji lub architekturze homelabu?

Skontaktuj się bezpośrednio ze mną lub przejrzyj pozostałe projekty.