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.
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:
Ś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.
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.
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.
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.
Rzeczywisty zrzut przepływu sterowania połączeniem wygenerowany na telefonie Samsung Galaxy S25.
(Kontakty prywatne / dom)"} D -- "TAK" --> E["🛑 1. HARD DROP
Cisza, zero powiadomień, plik zostaje w pamięci telefonu"] D -- "NIE" --> F{"🔍 Zapytanie Caller HUD
(Baza B2B SQLite / n8n gateway)"} F -- "Znaleziono B2B (found: true)" --> G["⚡ 2. 0-CLICK AUTOMATIC B2B
Auto-kopia do /Do_transkrypcji/ + Heads-Up PUSH"] F -- "Brak w B2B (found: false)" --> H["📲 3. 1-TAP HITL (Nieznany)
Powiadomienie z przyciskiem [ 🚀 Wyślij do AI ]"] G --> I["🔄 FolderSync Pro (Upload 5G/Wi-Fi)"] H -- "Tapnięcie przycisku" --> I I --> J["☁️ Google Drive ➔ WhisperX RTX 5090 ➔ Skarbiec i Telegram"] classDef default fill:#0f172a,stroke:#38bdf8,stroke-width:1.5px,color:#f8fafc; classDef hardDrop fill:#450a0a,stroke:#ef4444,stroke-width:2px,color:#fee2e2; classDef autoB2B fill:#064e3b,stroke:#10b981,stroke-width:2px,color:#ecfdf5; classDef hitl fill:#1e1b4b,stroke:#818cf8,stroke-width:2px,color:#e0e7ff; classDef sync fill:#082f49,stroke:#0ea5e9,stroke-width:1.5px,color:#e0f2fe; class E hardDrop; class G autoB2B; class H hitl; class I,J sync;
Poziom 1: Hard Drop
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
Poziom 2: 0-Click 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
Poziom 3: 1-Tap HITL
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
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.
#!/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
Potok serwerowy: od smartfona do bazy wiedzy w Obsidianie
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.
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).
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.
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.
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:
Chcesz porozmawiać o automatyzacji lub architekturze homelabu?
Skontaktuj się bezpośrednio ze mną lub przejrzyj pozostałe projekty.