액자 스피커와 마이크
FreeKiosk 원격 제어를 쓰는 액자마다 Home Assistant에 오디오 엔티티 두 개가 생깁니다.
- Frame Speaker (
media_player): 액자 스피커로 소리를 재생합니다. - Frame Mic Stream (
switch): Frame Mic 보조 앱을 통해 액자 마이크를 들을 수 있게 합니다.
같은 앱으로 사이드바의 Frames 패널에서 양방향 통화도 할 수 있습니다.
Frame Speaker
액자가 접근할 수 있는 오디오 주소라면 FreeKiosk의 오디오 플레이어로 재생합니다.
- Home Assistant 미디어 브라우저에서 파일(로컬 미디어, 녹음)을 골라 Frame Speaker로 재생합니다.
tts.speak의 미디어 플레이어로 Frame Speaker를 지정해 음성 안내를 보냅니다.- 미디어 플레이어 카드에서 정지와 볼륨을 조절합니다. 볼륨은 액자의 미디어 볼륨이라 슬라이드쇼 플레이어와 공유됩니다.
action: tts.speak
target:
entity_id: tts.google_translate_ko_kr
data:
media_player_entity_id: media_player.living_room_frame_speaker
message: "저녁 준비됐어요"액자는 Home Assistant 내부 URL에서 오디오를 받아오므로 액자에서 그 주소에 접근할 수 있어야 합니다(원격 액자는 VPN을 통해). FreeKiosk가 재생 종료를 알려주지 않기 때문에 Home Assistant에서는 스피커가 계속 대기 상태로 보입니다.
Frame Mic Stream
듣기 기능에는 액자에 Frame Mic 보조 앱이 필요합니다. 스위치를 켜기 전까지는 꺼져 있고, 켠 뒤에도 누군가 스트림을 재생하는 동안에만 마이크가 열립니다.
- GitHub 릴리스에서
frame-mic-<버전>.apk를 받아 액자에 설치합니다. - Frame Mic을 한 번 실행해 마이크 권한을 허용합니다. 앱 화면에 키와 스트림 주소가 나옵니다.
- 컨트롤러 콘솔에서 디바이스를 열고 Frame Mic Key에 그 키를 입력합니다.
- Home Assistant에서 Frame Mic Stream을 켭니다.
stream_url속성이 AAC 실시간 스트림입니다(Frame Mic 0.5 이상). VLC, nPlayer처럼 인터넷 라디오를 재생할 수 있는 플레이어로 엽니다.wav_url은 같은 소리를 무손실 WAV로 제공합니다.
Home Assistant 안에서 바로 들으려면 미디어 > Immich Frame Mic에서 액자를 고릅니다(스위치가 꺼져 있으면 switch off로 표시됩니다). Home Assistant가 자체 로그인으로 스트림을 중계하므로, 액자의 LAN 주소에 닿지 않는 HTTPS 대시보드나 외부의 컴패니언 앱에서도 들을 수 있습니다.
스위치를 끄면 진행 중인 스트림이 끊기고 새 접속도 거부됩니다. 한 번에 한 기기만 들을 수 있고, 새 접속이 들어오면 이전 접속에서 넘겨받습니다.
누군가 듣는 동안에는 액자의 안드로이드 알림에 누가 듣는지 표시됩니다. Frame Mic Notification 스위치(기본 켜짐)를 끄면 그 정보가 숨겨집니다. 앱이 실행되는 동안 안드로이드는 단순한 Frame Mic 알림은 계속 유지합니다.
앱은 FreeKiosk REST와 같은 주소의 8765 포트를 씁니다. 다른 공유기 뒤에 있는 액자라면 REST 포트와 같은 방식으로 이 포트도 포워딩하세요.
통화
Home Assistant 사이드바 Frames 패널의 통화 탭에서 인터폰처럼 액자에 전화를 겁니다. 액자가 스스로 받아서 내 목소리를 스피커로 내보내고, 마이크 소리를 돌려보냅니다. 지연이 1초도 안 돼서 평소처럼 대화할 수 있습니다.
- Frame Mic 0.6 이상이 필요하고 Frame Mic Stream 스위치가 켜져 있어야 합니다. 스위치를 끄면 통화도 끊깁니다.
- Home Assistant에
https://주소로 접속하세요. 브라우저는 HTTPS에서만 마이크를 허용합니다. - 소리는 가능하면 내 기기와 액자 사이를 직접 오갑니다. Cloudflare 공개 STUN 서버 덕분에 집 밖에서 거는 통화도 상당수는 직접 연결됩니다. 직접 연결이 안 되는 경우(대부분의 모바일 망)를 위해 무료 Cloudflare TURN 키를 넣으면 소리를 중계합니다. 집 밖 통화에는 Frame Mic 0.7 이상이 필요합니다.
- Frame Mic에 다른 앱 위에 표시 권한이 있으면 통화 중에 액자 화면 위쪽에 작은 On call 표시가 나옵니다(앱을 열면 권한을 요청합니다). 안드로이드 설정에서 한 번 허용하거나 adb로
adb shell appops set org.junlim.framemic SYSTEM_ALERT_WINDOW allow를 실행하세요. - 패널을 벗어나면 통화가 끊깁니다. 통화와 Frame Mic 스트림은 마이크를 같이 쓰므로 나중에 시작한 쪽이 넘겨받습니다.
- 액자는 자기 스피커 소리를 소프트웨어로 제거합니다. 상대가 메아리를 듣는다면 듣는 동안 내 쪽을 음소거하세요.
통화 소리는 액자의 미디어 볼륨으로 나오며, 슬라이드쇼와 Frame Speaker와 같은 볼륨입니다. 화면을 끄면(Screen Off) 이 볼륨이 0이 되므로, 액자 볼륨이 40% 아래면 컨트롤러가 통화 동안 70%로 올립니다. 화면이 꺼져 있던 액자는 통화 동안 화면을 켜서 On call 표시가 보이게 합니다. 통화가 끝나면 어떻게 끝났든 둘 다 원래대로 되돌립니다.
집 밖에서 통화하기
- Cloudflare 대시보드에서 Realtime > TURN Server로 가서 키를 만들고 Turn Token ID와 API Token을 복사합니다.
- 애드온 구성에서 Cloudflare TURN 키 ID와 Cloudflare TURN API 토큰에 넣고 애드온을 재시작합니다.
그러면 컨트롤러가 통화마다 짧게 쓰는 Cloudflare TURN 자격 증명을 나눠 줍니다. 집 네트워크에서는 여전히 직접 연결됩니다. 중계되는 통화는 같은 지역 안에서 수십 ms 정도 지연이 늘고, Cloudflare는 매달 1,000GB까지 무료입니다(통화 1시간에 약 40MB).
개인정보
방에 있는 모든 사람이 알고 있는 액자에서만 듣기와 통화 기능을 켜세요.
문제 해결
- 스위치가 사용할 수 없음으로 표시됨: 디바이스에 Frame Mic Key가 없거나,
8765포트로 앱에 연결되지 않습니다. - 앱 업데이트 후 멈춤: 안드로이드가 업데이트 후 Frame Mic을 항상 다시 켜지는 않습니다. 액자에서 앱을 한 번 여세요.
- 스트림 시작이 느리거나 끊김: 다른 앱이 마이크를 쓰고 있습니다. 안드로이드는 한 번에 한 앱만 마이크를 쓸 수 있으니, FreeKiosk에 띄운
getUserMedia테스트 페이지처럼 마이크를 쓰는 화면을 닫으세요.