# Azure TTS + Unified Audio Player Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Replace the dual TTS owners in `DialogueChatView` with a single view-level `useAudioPlayer` composable backed by Azure Speech REST, enforce single-channel + recording-interrupt rules structurally, and surface playback errors per message with one-click retry. **Architecture:** A new `useAudioPlayer` composable owns the only `HTMLAudioElement` and the only synthesis `AbortController`, exposing `play(id, source)` / `stop()` / three reactive ids (`playingId`, `loadingId`, `errorId`). A new stateless `speechService.synthesize()` calls Azure Speech REST and returns an MP3 blob. `useDialogueEngine` is stripped of all `speechSynthesis` references and gains `attachStudentBlob()` so the WebSocket path can attach the recorded blob to the student message it created. `DialogueChatView` watches for AI messages reaching `done` and triggers auto-play; recording start calls `player.stop()`; the play button on every voice-bar renders one of four states (idle/loading/playing/error) directly from the player refs. **Tech Stack:** Vue 3 `