Migration guide: legacy audio service → ovos-media

July 31, 2026 · View on GitHub

This guide covers moving media playback from the legacy audio service (the ovos-ocp-audio-plugin hosted inside ovos-audio) to the ovos-media daemon: what to turn off, what to install, and how the configuration and bus messages map across.

ovos-media handles audio, video, and web playback. ovos-audio keeps handling TTS. The two run side by side.


At a glance

ConcernLegacy audio serviceovos-media
Where it runsInside ovos-audio as a special audio backendA separate ovos-media daemon
Config locationAudio.backends.OCPtop-level media block
Search/catalog layerOCP search skills (@ocp_search)MediaProvider plugins (in-process)
Playback backendsOPM audio pluginsopm.media.audio / .video / .web plugins
Bus namespacemixed ocp.audio.* / mycroft.audio.service.*unified ovos.common_play.*
MPRISbolted onbuilt in (Roles A and B)
Web/webview playbacknot supportedsupported
Remote backendsnot supportedsupported

Step 1, disable the legacy audio service

Turn off the in-process audio service so it does not contend with ovos-media:

{
  "enable_old_audioservice": false
}

Place this in ~/.config/mycroft/mycroft.conf (or ~/.config/ovos/ovos.conf). ovos-audio keeps running for TTS.

Step 2, install ovos-media and a backend

pip install ovos-media
pip install ovos-media-plugin-vlc        # at least one audio backend

Step 3, configure ovos-media

{
  "media": {
    "audio_players": {
      "vlc": { "module": "ovos-media-audio-plugin-vlc", "aliases": ["VLC"], "active": true }
    },
    "preferred_audio_services": ["vlc"],
    "enable_mpris": true
  }
}

See configuration.md for every key.

Step 4, install media providers (catalogs)

The OCP pipeline finds media through MediaProvider plugins. Install the catalogs you want and, if needed, configure them under media_providers:

pip install ovos-media-provider-youtube ovos-media-provider-bandcamp

Step 5, run and test

ovos-media

Then exercise it by voice or over the bus:

"play jazz" · "next track" · "pause" · "resume" · "what song is this?"

If MPRIS is enabled:

playerctl --player=OCP status
playerctl --player=OCP play-pause
playerctl --player=OCP next

Configuration mapping

Legacy (inside ovos-audio):

{
  "Audio": {
    "backends": { "OCP": { "enable_mpris": true } },
    "default-backend": "vlc"
  }
}

ovos-media:

{
  "media": {
    "enable_mpris": true,
    "audio_players": {
      "vlc": { "module": "ovos-media-audio-plugin-vlc", "active": true }
    },
    "preferred_audio_services": ["vlc"]
  }
}

Key differences:

  • Settings move from Audio.backends.OCP to the top-level media block.
  • Backends are declared in audio_players / video_players / web_players and preferred order is set with preferred_audio_services (and the video/web equivalents) instead of a single default-backend.

Bus message mapping

All media control uses the ovos.common_play.* namespace.

Playback control

ActionLegacyovos-media
Start play(OCP was special)ovos.common_play.play
Pauseocp.audio.pauseovos.common_play.pause
Resumeocp.audio.resumeovos.common_play.resume
Stopocp.audio.stopovos.common_play.stop
Nextocp.audio.nextovos.common_play.next
Previousocp.audio.prevovos.common_play.previous

Playlist control

Actionovos-media
Queue trackovos.common_play.playlist.queue
Set playlistovos.common_play.playlist.set
Clear playlistovos.common_play.playlist.clear
Shuffle toggleovos.common_play.shuffle.toggle
Repeat toggleovos.common_play.repeat.toggle

Volume and ducking

ActionLegacyovos-media
Duck (TTS speaking)recognizer_loop:audio_output_startovos.common_play.duck (legacy alias kept)
Unduckrecognizer_loop:audio_output_endovos.common_play.unduck (legacy alias kept)
Cork (mic open)recognizer_loop:record_beginovos.common_play.cork (legacy alias kept)
Uncork(implicit in record_end)ovos.common_play.uncork + auto-uncork on record_end

The legacy recognizer_loop:* messages remain wired as aliases, so existing callers keep working.

Status and info

ActionLegacyovos-media
Player stateocp.player.stateovos.common_play.player.state
Media stateocp.media.stateovos.common_play.media.state
Track infoocp.audio.track_infoovos.common_play.track_info
Backend discoveryopm.audio.queryopm.audio.query (unchanged)
Full status snapshot,ovos.common_play.status
Like / unlike track,ovos.common_play.like / ovos.common_play.unlike
Reflect external MPRIS player,ovos.common_play.mpris.now_playing (see mpris.md)
Supported stream extractors,ovos.common_play.SEI.get

See architecture.md for the complete handler and emitted-event tables.


Search skills → media providers

The catalog/search layer changes from OCP skills to providers:

  • OCP search skills subclass OVOSCommonPlaybackSkill and answer ovos.common_play.query over the bus with MediaEntry results.
  • MediaProviders subclass MediaProvider, are loaded in-process, and return typed mediavocab.Release results.

Skills still work during the transition. New catalog integrations should be written as providers, see media-providers.md for the contract, a worked example, and the list of existing providers.


Troubleshooting

No audio backends loaded. Install one and declare it:

pip install ovos-media-plugin-vlc
{ "media": { "audio_players": {
  "vlc": { "module": "ovos-media-audio-plugin-vlc", "active": true }
} } }

Audio doesn't play. Watch the daemon log and confirm the backend reacts:

journalctl -u ovos-media -f
playerctl --player=OCP play-pause

MPRIS not visible. Enable it and check:

{ "media": { "enable_mpris": true } }
playerctl --player=OCP status

See also


← MPRIS · Home · OCP skills →