← 返回
效率工具 中文

Sonos Announce

Play audio on Sonos with intelligent state restoration - pauses streaming, skips Line-In/TV/Bluetooth, resumes everything.
在Sonos上播放音频并智能恢复状态——暂停流媒体,跳过Line-In/TV/蓝牙,随后恢复所有播放。
clawdianova
效率工具 clawhub v1.0.4 1 版本 99794 Key: 无需
★ 0
Stars
📥 969
下载
💾 14
安装
1
版本
#latest

概述

Sonos Announce

Play audio files on Sonos speakers with intelligent state restoration.

When to use

  • User wants to play an announcement on Sonos
  • Soundboard effects (airhorn, rimshot, etc.)
  • Any audio playback that should resume previous state

This skill handles playback only - audio generation (TTS, ElevenLabs, etc.) is separate.

Quick Start

import sys
import os
sys.path.insert(0, '/path/to/sonos-announce')
from sonos_core import announce

# Play audio and restore previous state
# Assumes audio is in default media_dir (~/.local/share/openclaw/media/outbound)
result = announce('my_audio.mp3')

Installation

pip install soco

Requirements:

  • python3 - Python 3
  • ffprobe - Part of ffmpeg, for audio duration detection
  • soco - Python Sonos library

Core Function

announce(audio_file_path, wait_for_audio=True, media_dir=None)

Parameters

ParameterTypeDefaultDescription
---------------------------------------
audio_file_pathstrrequiredFilename (if using media_dir) or full path to audio file
wait_for_audioboolTrueWait for audio to finish playing before returning
media_dirstrNoneDirectory where audio file is located (HTTP server will serve from here)

Returns

{
  'coordinators': 2,
  'states': {
    '192.168.1.120': {
      'uri': 'x-sonos-spotify:spotify%3atrack%3a...',
      'position': '0:01:23',
      'queue_position': 5,
      'was_playing': True,
      'is_external': False,
      'transport_state': 'PLAYING',
      'speaker_name': 'Bedroom'
    }
  }
}

Usage Examples

Simple (file in default media directory)

from sonos_core import announce

# File served from default media_dir
result = announce('announcement.mp3')

With custom media directory

from sonos_core import announce

# Full path to audio file
result = announce(
    'my_audio.mp3', 
    media_dir='/home/user/audio/announcements'
)

Full path (no media_dir)

from sonos_core import announce

# Uses directory of file as media_dir
result = announce('/full/path/to/audio.mp3')

Environment Variables

Configure the HTTP server for streaming to Sonos:

VariableDefaultDescription
--------------------------------
SONOS_HTTP_HOSTauto-detectedLAN IP address (auto-detected)
SONOS_HTTP_PORT8888HTTP server port
# Set before running (optional)
export SONOS_HTTP_HOST=192.168.1.100  # Override auto-detected IP
export SONOS_HTTP_PORT=8888           # Override port

# Or set in code before importing
import os
os.environ['SONOS_HTTP_HOST'] = '192.168.1.100'

from sonos_core import announce
announce('audio.mp3')

Supported Platforms

PlatformStatusNotes
-------------------------
macOS✅ SupportedFull support
Linux✅ SupportedFull support
Windows✅ SupportedUses taskkill and start /b

The module automatically detects your platform and uses appropriate commands for:

  • Killing the HTTP server
  • Starting the HTTP server in background

State Restoration

The module intelligently restores previous playback state:

Source TypeBehavior
----------------------
Spotify TrackResumed at exact position (seek)
Spotify PlaylistResumed at exact position (seek)
Spotify RadioResumed from start (no seek)
Internet RadioResumed from start (no seek)
Line-InRe-connected to Line-In input
TV/HDMIRe-connected to TV audio
BluetoothRe-connected to Bluetooth
Paused contentLeft paused

Seeking Behavior

Some streaming services don't support seeking to a specific position:

  • Can seek: Spotify tracks, Spotify playlists, local files, queue items
  • Cannot seek: Spotify Radio, TuneIn radio, Pandora, Tidal radio

The module automatically detects these and handles accordingly.

External Input Detection

Automatically detects inputs that cannot be paused:

  • x-rincon:RINCON_* - Line-In
  • x-rincon-stream:RINCON_* - Line-In stream
  • x-sonos-htastream:* - TV/HDMI (Sonos Home Theater)
  • x-sonos-vanished:* - Vanished device
  • x-rincon-bt:* - Bluetooth

Soundboard Example

from sonos_core import announce

SOUNDS = {
    'airhorn': '/path/to/sounds/airhorn.mp3',
    'rimshot': '/path/to/sounds/rimshot.mp3',
    'victory': '/path/to/sounds/victory.mp3',
}

def play_sound(name):
    """Play a sound effect."""
    if name in SOUNDS:
        announce(SOUNDS[name])
    else:
        print(f"Unknown sound: {name}")

Troubleshooting

IssueSolution
-----------------
No speakers foundEnsure on same network as Sonos speakers
Resume not workingCheck speakers were playing (not paused) before announcement
HTTP server failedCheck port 8888 is available, or set SONOS_HTTP_PORT
Module import errorRun: pip install soco
Duration detection failsEnsure ffprobe is installed (part of ffmpeg)

Files

  • sonos_core.py - Main module with announce() function
  • SKILL.md - This documentation

版本历史

共 1 个版本

  • v1.0.4 当前
    2026-03-29 13:09 安全 安全

安全检测

腾讯云安全 (Keen)

安全,无风险
查看报告

腾讯云安全 (Sanbu)

安全,无风险
查看报告

🔗 相关推荐

productivity

Weather

steipete
获取当前天气和预报(无需API密钥)
★ 445 📥 226,243
productivity

Word / DOCX

ivangdavila
创建、检查和编辑 Microsoft Word 文档及 DOCX 文件,支持样式、编号、修订记录、表格、分节符及兼容性检查等功能。
★ 438 📥 147,525
productivity

Nano Pdf

steipete
使用nano-pdf CLI通过自然语言指令编辑PDF
★ 275 📥 114,811