본문 바로가기
서버/리눅스 서버

mpd + Google Home 연동하기 (chromecast 포함)

by ㅋㅋ잠자 2021. 6. 29.
반응형

안녕하세요?

구글 홈으로 음악 듣는일이 많아지다 보니, 실제로 서브소닉에서도 구글 캐스트로 많이 활용을 하고 있습니다.

 

서브소닉으로 HomeAssistant 연동이 되면 좋으나, 차후에 만들어볼 생각도 있습니다. 

안되어서, 어쩔 수 없이 mpd 와 Google Home 을 연동해보기로 하였습니다.

 

실제로는 하기와 같이 PC에서 Subsonic WebUI 를 활용하여 구글 홈과 연동하여 음악을 듣고 있습니다.

요즘 드는 생각은 블루투스 스피커 활용보다는 구글홈을 여러군데 두고 음악을 동시에 멀티룸으로 재생시킬 수 있고 이런것이 조금 필요하다는 생각이 들었습니다.

 

홈 어시스턴트에 Media_Player 기능이 있지만 굉장히 기능이 부족해서 MPD와 연동하면 좋지 않을까 해서 연동을 해보게 되었네요.

 

구조는 하기와 같습니다.

MPD --> PulseAudio --> PulseAudio DLNA Sink --> Google Home 이렇게 연동됩니다.

실은 Sink 라는 이야기를 잘 모르겠는데 출력 장치인것 같습니다. gstreamer 를 사용할 때에도 fbsink / waylandsink 라고 설정하니까요.

 

그럼 시작합니다.

1. 의존성 패키지 설치하기

root@debian:~# apt install pulseaudio mpd pulseaudio-dlna

추가기능이 필요하시면 mpd를 컴파일 하시면 됩니다. SACD 를 틀 일은 없을 것 같아서 그냥 debian 레파지토리에 있는 것을 설치하였습니다. 혹시 필요하시면 차후에 컴파일 하는 방법을 작성해 보겠습니다.

 

흠.. 아래와 같이 에러가 발생하네요. docker 에 했었어야 했나 지금 막 후회가 되고 있습니다.

See "systemctl status mpd.socket" and "journalctl -xe" for details.
Setting up sox (14.4.2+git20190427-1) ...
Setting up python-bs4 (4.7.1-1) ...
Setting up pulseaudio-dlna (0.5.3+git20170406-1) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Processing triggers for libc-bin (2.28-10) ...
Processing triggers for systemd (241-7~deb10u7) ...
Processing triggers for man-db (2.8.5-2) ...
Processing triggers for mime-support (3.62) ...

바로 해결해 보겠습니다.

일단은 저널로그를 한번 봐야겠네요.

root@debian:~# journalctl -u mpd
-- Logs begin at Sun 2021-06-27 22:17:01 KST, end at Mon 2021-06-28 23:38:51 KST. --
Jun 28 23:37:37 debian systemd[1]: Starting Music Player Daemon...
Jun 28 23:37:38 debian mpd[13356]: Jun 28 23:37 : exception: Failed to open '/var/lib/mpd/tag_cache': No such file o
Jun 28 23:37:38 debian systemd[1]: Started Music Player Daemon.

저널로그를 볼때, -u 옵션으로 타겟팅을 해서 볼 수 있습니다. 물론 journalctl -f | grep mpd 이렇게도 볼 수 있겠습니다.

경로가 없다고 나오네요. 음.. 이거는 deb 파일 설치할 때 생성이 되어야할 것 같은데 생성이 안되는것 같습니다.

 

수동으로 생성하고 다시 시도해보겠습니다.

# 이미 폴더가 있다고 나오네요?
root@debian:~# mkdir /var/lib/mpd/tag_cache
mkdir: cannot create directory ‘/var/lib/mpd/tag_cache’: File exists

# 권한 문제인것 같습니다.
root@debian:~# chown mpd /var/lib/mpd/tag_cache

다시 시도해 보겠습니다.

하기와 같이 정상 실행 되었습니다.

root@debian:~# systemctl restart mpd
root@debian:~# systemctl status mpd
● mpd.service - Music Player Daemon
   Loaded: loaded (/lib/systemd/system/mpd.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-06-28 23:41:23 KST; 3s ago
     Docs: man:mpd(1)
           man:mpd.conf(5)
           file:///usr/share/doc/mpd/user-manual.html
 Main PID: 15436 (mpd)
    Tasks: 3 (limit: 4915)
   Memory: 13.7M
   CGroup: /system.slice/mpd.service
           └─15436 /usr/bin/mpd --no-daemon

Jun 28 23:41:23 debian systemd[1]: Starting Music Player Daemon...
Jun 28 23:41:23 debian systemd[1]: Started Music Player Daemon.

2. PulseAudio 설정하기

일단은 PulseAudio 관련하여 데몬 설정이 필요합니다. 

기본적으로 시작하도록 하는 서비스 파일이 없기 때문에 수동 추가가 필요합니다.

하기의 내용으로 조금 수정하고 서비스파일을 추가합니다.

root@debian:/lib/systemd/system# vi /etc/pulse/client.conf

; default-sink =
; default-source =
; default-server =

# 하기 부분을 추가합니다.
default-server = /var/run/pulse/native
; default-dbus-server =

; autospawn = yes

# 하기 부분을 추가합니다.
autospawn = no
; daemon-binary = /usr/bin/pulseaudio
; extra-arguments = --log-target=syslog

다음으로 서비스 파일을 생성해봅니다. 그리고 enable 합니다.

root@debian:/lib/systemd/system# vi pulseaudio.service

[Unit]
Description=PulseAudio system server

[Service]
Type=notify
ExecStart=/usr/bin/pulseaudio --daemonize=no --system --realtime --log-target=journal

[Install]
WantedBy=multi-user.target

root@debian:/lib/systemd/system# systemctl enable pulseaudio.service
Created symlink /etc/systemd/system/multi-user.target.wants/pulseaudio.service → /lib/systemd/system/pulseaudio.service.

root@debian:/lib/systemd/system# systemctl start pulseaudio.service
root@debian:/lib/systemd/system# systemctl status pulseaudio.service
● pulseaudio.service - PulseAudio system server
   Loaded: loaded (/lib/systemd/system/pulseaudio.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-06-28 23:47:34 KST; 3s ago
 Main PID: 18413 (pulseaudio)
    Tasks: 2 (limit: 4915)
   Memory: 6.8M
   CGroup: /system.slice/pulseaudio.service
           └─18413 /usr/bin/pulseaudio --daemonize=no --system --realtime --log-target=journal

정상 실행이 되었으면, 다음 작업으로 넘어갑니다.

3. PulseAudio DLNA 설정하기

일단은 PulseAudio DLNA 의 경우 포트가 8080입니다. 이게 마음에 들지 않아서 포트를 바꾸고 서비스를 추가하겠습니다.

root@debian:/lib/systemd/system# vi pulseaudio-dlna.service

[Unit]
Description=PulseAudio-DLNA system server
Requires=pulseaudio.service
After=pulseaudio.service

[Service]
Type=simple
User=pulse
ExecStart=/usr/bin/pulseaudio-dlna --port 19191

[Install]
WantedBy=multi-user.target

한가지 중요한 것이 이 dlna 서비스는 PulseAudio 서버에 의존이 있기 때문에 After 부분이 꼭 추가되어야합니다.

enable 하고 시작 해보겠습니다.

root@debian:/lib/systemd/system# systemctl enable pulseaudio-dlna.service
Created symlink /etc/systemd/system/multi-user.target.wants/pulseaudio-dlna.service → /lib/systemd/system/pulseaudio-dlna.service.
root@debian:/lib/systemd/system# systemctl start pulseaudio-dlna.service

root@debian:/lib/systemd/system# systemctl status pulseaudio-dlna.service
● pulseaudio-dlna.service - PulseAudio-DLNA system server
   Loaded: loaded (/lib/systemd/system/pulseaudio-dlna.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-06-28 23:51:12 KST; 7s ago
 Main PID: 20179 (pulseaudio-dlna)
    Tasks: 12 (limit: 4915)
   Memory: 56.2M
   CGroup: /system.slice/pulseaudio-dlna.service
           ├─20179 pulseaudio-dlna
           ├─20202 stream_server
           ├─20203 pulse_watcher
           └─20204 ssdp_listener

자 그러면 이제 명령어를 통해서 구글 홈을 찾아보겠습니다.

root@debian:/lib/systemd/system# pactl list sinks
Connection failure: Access denied

흠.. Sink 목록을 봐야하는데 보이지가 않네요. PulseAudio 서버에 접근을 못하는 것 같습니다. 역시.. 저널로그를 확인해보니 거부가 되어 있네요.

Jun 28 23:52:35 debian pulseaudio[18413]: Denied access to client with invalid authentication data.
Jun 28 23:52:54 debian pulseaudio[18413]: Denied access to client with invalid authentication data.
Jun 28 23:54:00 debian pulseaudio[18413]: Denied access to client with invalid authentication data.

확인해보니 pulse-access 그룹에 유저가 들어가 있어야 인증이 된다고 나와있네요. 추가후에 하기와 같이 Sink 리스트가 나옵니다.

root@debian:/lib/systemd/system# adduser root pulse-access
Adding user `root' to group `pulse-access' ...
Adding user root to group pulse-access
Done.

root@debian:/lib/systemd/system# pactl list sinks
Sink #1
        State: SUSPENDED
        Name: _chromecast
        Description: 거실 (Chromecast)
        Driver: module-null-sink.c
        Sample Specification: s16le 2ch 44100Hz
        Channel Map: front-left,front-right
        Owner Module: 12
        Mute: no
        Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB
                balance 0.00
        Base Volume: 65536 / 100% / 0.00 dB
        Monitor Source: _chromecast.monitor
        Latency: 0 usec, configured 0 usec
        Flags: DECIBEL_VOLUME LATENCY
        Properties:
                device.description = "거실 (Chromecast)"
                device.class = "abstract"
                device.icon_name = "audio-card"
        Formats:
                pcm

# 여기서 활용할 Sink
Sink #2
        State: SUSPENDED
        Name: _chromecast.2
        Description: 거실 세트 (Chromecast)
        Driver: module-null-sink.c
        Sample Specification: s16le 2ch 44100Hz
        Channel Map: front-left,front-right
        Owner Module: 13
        Mute: no
        Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB
                balance 0.00
        Base Volume: 65536 / 100% / 0.00 dB
        Monitor Source: _chromecast.2.monitor
        Latency: 0 usec, configured 0 usec
        Flags: DECIBEL_VOLUME LATENCY
        Properties:
                device.description = "거실 세트 (Chromecast)"
                device.class = "abstract"
                device.icon_name = "audio-card"
        Formats:
                pcm

저는 구글 홈 미니 2개를 연동하여 사용하기 때문에 거실 세트를 사용하면 됩니다.

관련글은 하기를 참고 하시면 되겠습니다.

https://blog.djjproject.com/688

4. MPD 설정하기

대략적으로 음원 경로 설정 및 출력 장치 설정을 PulseAudio 로 설정하면 됩니다.

root@debian:/lib/systemd/system# vi /etc/mpd.conf

music_directory     "/media/gdrive/100.djjproject/music"
playlist_directory      "/media/gdrive/100.djjproject/music/playlists"
bind_to_address     "0.0.0.0"
auto_update    "yes"
follow_outside_symlinks "yes"
follow_inside_symlinks      "yes"
zeroconf_enabled        "yes"
zeroconf_name           "DJJPROJECT MPD"

# 기본으로 있는 alsa 출력을 코멘트 처리하고 하기 pulse 출력을 추가합니다.
#audio_output {
#   type        "alsa"
#   name        "My ALSA Device"
#   device      "hw:0,0"    # optional
#   mixer_type      "hardware"      # optional
#   mixer_device    "default"   # optional
#   mixer_control   "PCM"       # optional
#   mixer_index "0"     # optional
#}

audio_output {
    type    "pulse"
    name    "google_home"
    sink    "_chromecast.2"
}

다음으로 pulse-access 에 mpd 그룹을 추가하고 재시작합니다.

root@debian:/lib/systemd/system# adduser mpd pulse-access
Adding user `mpd' to group `pulse-access' ...
Adding user mpd to group pulse-access
Done.

root@debian:/lib/systemd/system# systemctl restart mpd
root@debian:/lib/systemd/system# systemctl status mpd
● mpd.service - Music Player Daemon
   Loaded: loaded (/lib/systemd/system/mpd.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2021-06-29 00:08:40 KST; 7s ago
     Docs: man:mpd(1)
           man:mpd.conf(5)
           file:///usr/share/doc/mpd/user-manual.html
 Main PID: 28208 (mpd)
    Tasks: 3 (limit: 4915)
   Memory: 39.5M
   CGroup: /system.slice/mpd.service
           └─28208 /usr/bin/mpd --no-daemon

5. MPD + GoogleHome 테스트 하기

그러면 mpc 를 통해서 음악을 스캔하고 한번 틀어보겠습니다.

root@debian:/lib/systemd/system# apt install ncmpcpp

root@debian:/lib/systemd/system# ncmpcpp

스캔을 하기 위해서는 U 키를 누르면 스캔이 시작됩니다. 스캔이 다 되기 전 까지는 전체 라이브러리가 보이지 않습니다. 음원이 너무 많아서 한 폴더만 스캔이 되고 있네요.

메뉴 이동은 하기와 같이 가능합니다.

1234567

그러면 구글 홈에서는 하기와 같이 표시됩니다.

그런데 조금 문제가 있는게 딜레이가 매우 심각하네요. 그래서 코덱 설정을 조금 바꾸어 보았습니다.

 

찾아보니 wav 로 하면 거의 딜레이가 없다고 하는데.. 실제로 한 3초 정도는 걸리는 것 같습니다.

기기가 자동으로 다시 연결될 수 있도록 설정도 추가합니다.

root@debian:/lib/systemd/system# vi pulseaudio-dlna.service

[Unit]
Description=PulseAudio-DLNA system server
Requires=pulseaudio.service
After=pulseaudio.service

[Service]
Type=simple
User=pulse
ExecStart=/usr/bin/pulseaudio-dlna --port 19191 --codec wav \
                                --encoder-backend ffmpeg --auto-reconnect

[Install]
WantedBy=multi-user.target

root@debian:/lib/systemd/system# systemctl daemon-reload
root@debian:/lib/systemd/system# systemctl restart pulseaudio-dlna.service

6. 마치며

일단은 연동은 잘 했는데.. 노래를 틀고 딜레이가 심각하네요.

나오는 것은 문제가 없는데요 ㅎㅎ 일단은 차후에 해결해보도록 하고 알람시계 설정을 해야할 것 같습니다.

 

다음에는 딜레이 및 HA 연동으로 뵙겠습니다.

 

감사합니다.

반응형

댓글