1. 작업 환경
이번 글에서는 TurtleBot3 또는 Ubuntu 22.04 Server 환경에서 USB 스피커를 연결하고, 재부팅 후에도 자동으로 기본 출력 장치로 설정되도록 구성하는 방법을 정리합니다.
사용 목적은 다음과 같습니다.
- ROS 2에서 TTS 음성 출력
- 효과음 출력
- 로봇 상태 안내음 출력
- Ubuntu Server 환경에서 USB 스피커 사용
테스트 환경은 다음과 같습니다.
OS: Ubuntu 22.04 Server
Audio System: PulseAudio
Speaker: USB Audio Speaker
ROS: ROS 2 Humble
이번에 사용한 USB 스피커는 PulseAudio에서 다음 sink 이름으로 인식되었습니다.
alsa_output.usb-Jieli_Technology_UACDemoV1.0_4150353131373114-00.analog-stereo
이 이름은 각자의 USB 스피커마다 다를 수 있습니다.
2. 필요한 패키지 설치
먼저 오디오 출력에 필요한 패키지를 설치합니다.
sudo apt update
sudo apt install -y alsa-utils pulseaudio pulseaudio-utils mpg123

패키지 용도는 다음과 같습니다.
alsa-utils : aplay, speaker-test, alsamixer 사용
pulseaudio : Ubuntu Server에서 오디오 출력 관리
pulseaudio-utils : pactl 명령어 사용
mpg123 : mp3 효과음 또는 TTS 음성 파일 재생
설치 후 재부팅합니다.
sudo reboot
3. USB 스피커 인식 확인
USB 스피커를 연결한 뒤 USB 장치가 인식되는지 확인합니다.
lsusb

오디오 장치 목록을 확인합니다.
aplay -L
출력 중에 다음과 비슷한 항목이 보이면 USB 스피커가 정상적으로 인식된 것입니다.
hw:CARD=UACDemoV10,DEV=0
UACDemoV1.0, USB Audio
plughw:CARD=UACDemoV10,DEV=0
UACDemoV1.0, USB Audio
front:CARD=UACDemoV10,DEV=0
UACDemoV1.0, USB Audio

현재 USB 오디오 카드 이름은 다음과 같습니다.
UACDemoV10
4. ALSA에서 USB 스피커 직접 테스트
먼저 PulseAudio 설정 전에 ALSA에서 USB 스피커가 직접 소리를 낼 수 있는지 확인합니다.
speaker-test -D plughw:CARD=UACDemoV10,DEV=0 -c 2 -t wav

또는 다음 명령어로 테스트합니다.
aplay -D plughw:CARD=UACDemoV10,DEV=0 /usr/share/sounds/alsa/Front_Center.wav

소리가 나면 USB 스피커 자체는 정상입니다.
소리가 나지 않는다면 볼륨이 음소거되어 있을 수 있습니다.
alsamixer -c UACDemoV10
MM으로 표시되어 있으면 음소거 상태입니다.M 키를 눌러 음소거를 해제하고, 볼륨을 올립니다.



설정 저장:
sudo alsactl store

5. PulseAudio sink 목록 확인
PulseAudio에서 출력 장치 목록을 확인합니다.
pactl list short sinks
예시 출력:
0 alsa_output.platform-bcm2835_audio.stereo-fallback
1 alsa_output.usb-Jieli_Technology_UACDemoV1.0_4150353131373114-00.analog-stereo
여기서 USB 스피커 sink 이름은 다음입니다.
alsa_output.usb-Jieli_Technology_UACDemoV1.0_4150353131373114-00.analog-stereo

6. USB 스피커를 기본 출력 장치로 수동 설정
아래 명령어를 실행하면 현재 세션에서 USB 스피커가 기본 출력 장치로 설정됩니다.
pactl set-default-sink alsa_output.usb-Jieli_Technology_UACDemoV1.0_4150353131373114-00.analog-stereo
설정 확인:
pactl info
출력에서 다음 항목을 확인합니다.
Default Sink: alsa_output.usb-Jieli_Technology_UACDemoV1.0_4150353131373114-00.analog-stereo

테스트:
speaker-test -c 2 -t wav

또는:
aplay /usr/share/sounds/alsa/Front_Center.wav
여기까지 정상이라면 USB 스피커 출력은 성공입니다.

하지만 이 설정은 재부팅 후 풀릴 수 있습니다.
따라서 다음 단계에서 자동 적용 설정을 진행합니다.
7. 재부팅 후에도 USB 스피커를 기본 출력으로 설정하기
Ubuntu Server 환경에서는 PulseAudio가 부팅 직후 바로 준비되지 않을 수 있습니다.
그래서 단순히 부팅 시 pactl set-default-sink를 한 번 실행하면 실패할 수 있습니다.
가장 안정적인 방법은 다음과 같습니다.
1. USB 스피커 기본 설정 스크립트 작성
2. PulseAudio가 준비될 때까지 대기
3. USB 스피커 sink가 보이면 기본 출력으로 설정
4. user systemd 서비스로 자동 실행
8. 자동 설정 스크립트 작성
먼저 스크립트를 저장할 폴더를 만듭니다.
mkdir -p ~/bin

스크립트를 작성합니다.
nano ~/bin/set_usb_speaker.sh

아래 내용을 넣습니다.
#!/bin/bash
export XDG_RUNTIME_DIR="/run/user/$(id -u)"
SINK_KEYWORD="Jieli_Technology_UACDemoV1.0"
echo "[USB Speaker] Waiting for PulseAudio/PipeWire..."
echo "[USB Speaker] XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR"
echo "[USB Speaker] User=$(whoami)"
echo "[USB Speaker] UID=$(id -u)"
for i in {1..60}
do
echo "[USB Speaker] Retry $i/60"
pactl info 2>/dev/null | grep "Server Name" || {
echo "[USB Speaker] pactl server not ready"
sleep 1
continue
}
echo "[USB Speaker] Current sinks:"
pactl list short sinks 2>/dev/null
SINK_NAME=$(pactl list short sinks 2>/dev/null | grep "$SINK_KEYWORD" | awk '{print $2}' | head -n 1)
if [ -z "$SINK_NAME" ]; then
echo "[USB Speaker] USB sink not found yet: $SINK_KEYWORD"
sleep 1
continue
fi
echo "[USB Speaker] Found sink: $SINK_NAME"
if pactl set-default-sink "$SINK_NAME"; then
sleep 1
CURRENT_DEFAULT=$(pactl get-default-sink 2>/dev/null)
echo "[USB Speaker] Current default sink: $CURRENT_DEFAULT"
if [ "$CURRENT_DEFAULT" = "$SINK_NAME" ]; then
echo "[USB Speaker] Default sink successfully set to: $SINK_NAME"
exit 0
else
echo "[USB Speaker] set-default-sink command succeeded but default mismatch"
fi
else
echo "[USB Speaker] Failed to set default sink: $SINK_NAME"
fi
sleep 1
done
echo "[USB Speaker] Failed to set USB speaker as default sink"
exit 1

실행 권한을 부여합니다.
chmod +x ~/bin/set_usb_speaker.sh

스크립트를 직접 실행해서 테스트합니다.
~/bin/set_usb_speaker.sh
정상이라면 다음과 비슷하게 출력됩니다.
[USB Speaker] Waiting for PulseAudio and USB sink...
[USB Speaker] Default sink set to: alsa_output.usb-Jieli_Technology_UACDemoV1.0_4150353131373114-00.analog-stereo


확인:
pactl info | grep "Default Sink"

정상 출력:
Default Sink: alsa_output.usb-Jieli_Technology_UACDemoV1.0_4150353131373114-00.analog-stereo

9. user systemd 서비스 생성
이제 위 스크립트가 로그인 또는 부팅 후 자동으로 실행되도록 user systemd 서비스를 만듭니다.
mkdir -p ~/.config/systemd/user
서비스 파일 생성:
nano ~/.config/systemd/user/usb-speaker-default.service
아래 내용을 넣습니다.
[Unit]
Description=Set USB Speaker as Default PulseAudio Sink
After=pulseaudio.service pulseaudio.socket default.target
Wants=pulseaudio.service
[Service]
Type=oneshot
ExecStart=%h/bin/set_usb_speaker.sh
RemainAfterExit=yes
[Install]
WantedBy=default.target

저장 후 systemd user 데몬을 다시 로드합니다.
systemctl --user daemon-reload
서비스를 활성화합니다.
systemctl --user enable usb-speaker-default.service

바로 실행합니다.
systemctl --user start usb-speaker-default.service
상태 확인:
systemctl --user status usb-speaker-default.service

정상이라면 active 또는 exited 상태가 표시됩니다.
10. SSH 로그인 없이도 부팅 시 적용되도록 설정
Ubuntu Server에서는 user systemd 서비스가 사용자가 로그인해야 실행되는 경우가 있습니다.
로봇은 보통 전원을 켜면 자동으로 동작해야 하므로, 로그인 없이도 user service가 실행되도록 설정합니다.
sudo loginctl enable-linger $USER
확인:
loginctl show-user $USER | grep Linger
정상 출력:
Linger=yes

11. 재부팅 후 확인
이제 재부팅합니다.
sudo reboot
재접속 후 기본 출력 장치를 확인합니다.
pactl info | grep "Default Sink"
정상 출력:
Default Sink: alsa_output.usb-Jieli_Technology_UACDemoV1.0_4150353131373114-00.analog-stereo

스피커 테스트:
speaker-test -c 2 -t wav

또는:
aplay /usr/share/sounds/alsa/Front_Center.wav

MP3 테스트:
mpg123 test.mp3
12. TTS 음성 출력 테스트
한국어 TTS 출력 테스트를 위해 gTTS를 설치합니다.
sudo apt install python3-pip
pip3 install gTTS


테스트용 TTS 파일을 생성합니다.
python3 - << 'EOF'
from gtts import gTTS
text = "터틀봇 음성 출력 테스트입니다."
tts = gTTS(text=text, lang="ko")
tts.save("/tmp/tts_test.mp3")
EOF

재생합니다.
mpg123 /tmp/tts_test.mp3
정상적으로 USB 스피커에서 음성이 나오면 성공입니다.

python3 - << 'EOF'
from gtts import gTTS
text = "안녕하세요? 저는 휴머노이드시스템 로봇 휴이로입니다. 만나서 반가워요!"
tts = gTTS(text=text, lang="ko")
tts.save("/tmp/tts_intro.mp3")
EOF
mpg123 /tmp/tts_intro.mp3

13. 효과음 출력 테스트
효과음 폴더를 만듭니다.
mkdir -p ~/turtlebot3_sounds/effects
윈도우에 있는 사운드 효과 mp3 파일이나 wav 파일들을 shared 폴더에 복사합니다.
우분투에서 파일 관리자를 실행하고 shared 폴더에서 사운드 효과 파일들을 ~/Downloads 폴더에 복사합니다.
cd Downloads/sounds/
scp 00009.mp3 sjyong@192.168.200.28:/home/sjyong/turtlebot3_sounds/effects/
scp 00010.mp3 sjyong@192.168.200.28:/home/sjyong/turtlebot3_sounds/effects/

예를 들어 start.mp3 파일을 아래 위치에 저장합니다.
~/turtlebot3_sounds/effects/00009.mp3
재생 테스트:
mpg123 ~/turtlebot3_sounds/effects/00009.mp3

14. ROS 2에서 사용하는 예시
ROS 2 Python 노드에서 효과음을 출력할 때는 다음처럼 사용할 수 있습니다.
import subprocess
subprocess.run([
"mpg123",
"-q",
"/home/sjyong/turtlebot3_sounds/effects/00010.mp3"
])
WAV 파일은 다음처럼 재생합니다.
import subprocess
subprocess.run([
"aplay",
"-q",
"/home/ubuntu/turtlebot3_sounds/effects/start.wav"
])
TTS 파일을 생성하고 재생하는 예시는 다음과 같습니다.
import subprocess
from gtts import gTTS
text = "터틀봇이 출발합니다."
tts_path = "/tmp/turtlebot3_tts.mp3"
tts = gTTS(text=text, lang="ko")
tts.save(tts_path)
subprocess.run([
"mpg123",
"-q",
tts_path
])
17. 최종 확인 명령어 모음
전체 설정 후 아래 명령어로 확인할 수 있습니다.
pactl list short sinks
pactl info | grep "Default Sink"
speaker-test -c 2 -t wav
aplay /usr/share/sounds/alsa/Front_Center.wav
mpg123 /tmp/tts_test.mp3
systemctl --user status usb-speaker-default.service
journalctl --user -u usb-speaker-default.service
18. 정리
Ubuntu 22.04 Server에서 USB 스피커를 사용하는 경우, 단순히 ~/.asoundrc만 설정해도 동작할 수 있습니다. 하지만 TurtleBot3처럼 ROS 2, TTS, 효과음 출력을 함께 사용하는 로봇 환경에서는 PulseAudio 기본 sink를 명확하게 설정하는 방식이 더 안정적입니다.
이번 설정의 핵심은 다음과 같습니다.
1. USB 스피커 sink 이름 확인
2. pactl set-default-sink 명령어로 기본 출력 설정
3. 설정 스크립트 작성
4. user systemd 서비스로 자동 실행
5. loginctl enable-linger로 부팅 후 자동 적용
이번 환경에서 사용한 핵심 명령어는 다음입니다.
pactl set-default-sink alsa_output.usb-Jieli_Technology_UACDemoV1.0_4150353131373114-00.analog-stereo
재부팅 후에도 이 설정이 유지되도록 만든 자동 실행 스크립트는 다음입니다.
~/bin/set_usb_speaker.sh
그리고 이를 실행하는 user systemd 서비스는 다음입니다.
~/.config/systemd/user/usb-speaker-default.service
이 구성을 사용하면 TurtleBot3 Ubuntu 22.04 Server 환경에서도 TTS 음성 출력과 효과음 출력을 안정적으로 사용할 수 있습니다.