macOS companion app
Hamparan suara
Siklus Hidup Overlay Suara (macOS)
Audiens: kontributor aplikasi macOS. Tujuan: menjaga agar overlay suara berperilaku konsisten saat kata pemicu dan tekan-untuk-bicara bertumpang tindih.
Perilaku
- Jika overlay sudah terlihat karena kata pemicu dan pengguna menekan tombol pintas, sesi tombol pintas menggunakan teks yang sudah ada alih-alih mengatur ulang teks tersebut. Overlay tetap ditampilkan selama tombol pintas ditahan. Saat dilepas: kirim jika terdapat teks yang telah dipangkas, jika tidak, tutup.
- Kata pemicu saja tetap mengirim secara otomatis ketika hening; tekan-untuk-bicara langsung mengirim saat dilepas.
Implementasi
VoiceSessionCoordinator(apps/macos/Sources/OpenClaw/VoiceSessionCoordinator.swift) adalah satu-satunya pemilik sesi suara aktif. Ini merupakan singleton@MainActor @Observable, bukan actor. API:startSession,updatePartial,finalize,sendNow,dismiss,updateLevel,snapshot. Setiap sesi membawa tokenUUID; panggilan dengan token kedaluwarsa atau tidak cocok akan diabaikan.VoiceWakeOverlayController(VoiceWakeOverlayController+Session.swift) merender overlay dan meneruskan tindakan pengguna (requestSend,dismiss) kembali melalui koordinator menggunakan token sesi. Komponen ini tidak pernah memiliki status sesi itu sendiri.- Tekan-untuk-bicara (
VoicePushToTalk.begin()) menggunakan teks overlay yang terlihat sebagaiadoptedPrefix(melaluiVoiceSessionCoordinator.shared.snapshot()), sehingga menekan tombol pintas saat overlay pemicu suara ditampilkan akan mempertahankan teks dan menambahkan ucapan baru. Saat dilepas, fitur ini menunggu hingga 1,5 detik untuk transkrip final sebelum menggunakan teks saat ini sebagai alternatif. - Saat
dismiss, overlay memanggilVoiceSessionCoordinator.overlayDidDismiss, yang memicuVoiceWakeRuntime.refresh(state:)sehingga penutupan manual dengan X, penutupan karena teks kosong, dan penutupan setelah pengiriman semuanya melanjutkan pemantauan kata pemicu. - Jalur pengiriman terpadu: jika teks yang telah dipangkas kosong, tutup; jika tidak,
sendNowmemutar bunyi pengiriman satu kali, meneruskan melaluiVoiceWakeForwarder, lalu menutup overlay.
Pencatatan log
Subsistem suara adalah ai.openclaw; setiap komponen mencatat log dalam kategorinya sendiri:
| Kategori | Komponen |
|---|---|
voicewake.coordinator |
VoiceSessionCoordinator |
voicewake.overlay |
VoiceWakeOverlayController/VoiceWakeOverlay |
voicewake.ptt |
Tombol pintas dan perekaman tekan-untuk-bicara |
voicewake.runtime |
Runtime kata pemicu |
voicewake.chime |
Pemutaran bunyi |
voicewake.sync |
Sinkronisasi pengaturan global |
voicewake.forward |
Penerusan transkrip |
voicewake.meter |
Pemantau tingkat mikrofon |
Daftar periksa pengawakutuan
-
Alirkan log saat mereproduksi overlay yang tidak tertutup:
bash sudo log stream --predicate 'subsystem == "ai.openclaw" AND category CONTAINS "voicewake"' --level info --style compact -
Pastikan hanya ada satu token sesi aktif; panggilan balik kedaluwarsa akan diabaikan oleh koordinator.
-
Pastikan pelepasan tekan-untuk-bicara selalu memanggil
end()dengan token aktif; jika teks kosong, overlay seharusnya ditutup tanpa bunyi atau pengiriman.
Terkait
Was this useful?