Local-Voice/deploy-service.sh
2025-09-26 13:11:14 +08:00

78 lines
2.6 KiB
Bash
Executable File

#!/bin/bash
# Local Voice 服务部署脚本
# 用于解决systemd环境下的音频设备访问问题
echo "🔧 Local Voice 服务部署脚本"
echo "=================================="
# 获取用户ID
USER_ID=$(id -u)
USERNAME=$(whoami)
echo "👤 当前用户: $USERNAME (UID: $USER_ID)"
# 备份原有服务文件
echo "💾 备份原有服务文件..."
if systemctl list-unit-files | grep -q "local-voice.service"; then
sudo systemctl stop local-voice.service 2>/dev/null
sudo systemctl disable local-voice.service 2>/dev/null
sudo cp /etc/systemd/system/local-voice.service /etc/systemd/system/local-voice.service.backup 2>/dev/null || true
echo "✅ 原有服务已备份"
fi
# 安装systemd服务
echo "📦 安装systemd服务..."
sudo cp local-voice.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable local-voice.service
echo "✅ 系统级服务已安装"
# 安装用户级服务
echo "🏠 安装用户级服务..."
mkdir -p ~/.config/systemd/user/
cp local-voice-user.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable local-voice-user.service
echo "✅ 用户级服务已安装"
# 确保pipewire-pulse运行
echo "🎵 检查音频服务..."
if ! systemctl --user is-active --quiet pipewire-pulse; then
echo "🔧 启动pipewire-pulse服务..."
systemctl --user start pipewire-pulse
systemctl --user enable pipewire-pulse
echo "✅ pipewire-pulse已启动"
else
echo "✅ pipewire-pulse正在运行"
fi
# 启用用户服务 lingering (允许用户服务在登出后继续运行)
echo "🔄 启用用户服务lingering..."
sudo loginctl enable-linger $USERNAME
echo "✅ 用户服务lingering已启用"
# 测试建议
echo ""
echo "🎯 测试建议:"
echo "1. 先测试用户级服务: systemctl --user start local-voice-user.service"
echo "2. 查看用户服务日志: journalctl --user -u local-voice-user.service -f"
echo "3. 如果用户级服务正常,再考虑使用系统级服务"
echo ""
echo "🔍 故障排除:"
echo "- 如果用户级服务正常: 建议使用 systemctl --user start local-voice-user.service"
echo "- 如果系统级服务正常: 使用 sudo systemctl start local-voice.service"
echo ""
echo "📊 当前音频设备状态:"
python3 -c "
import pyaudio
p = pyaudio.PyAudio()
print('可用音频设备:')
for i in range(p.get_device_count()):
info = p.get_device_info_by_index(i)
if info['maxInputChannels'] > 0:
print(f' 设备 {i}: {info[\"name\"]} (默认采样率: {info[\"defaultSampleRate\"]}Hz)')
p.terminate()
"
echo ""
echo "✅ 部署完成!"