ACS Call Automation playToAll silent in Teams Online Meeting (CallConnected + PlayCompleted, list_participants=0)
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 20/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Necesita aclaración
- Estado de actividad
- Tranquilo
- Stack tecnológico
- azure, fastapi, python
- Área
- audio-video-rtc, backend, cloud
Línea de trabajo
Comience con el endpoint de callback de ACS documentado /api/teams/copilot-acs-media/events y la evidencia de reproducción de CallConnected, PlayCompleted y list_participants=0. Revise MICROSOFT_SUPPORT_TICKET_PORTAL_WALKTHROUGH_2026-06-30.md y el resumen del ADR de arquitectura referenciado. Se considera terminado cuando exista un acuerdo sobre una arquitectura de producción compatible para audio bidireccional de Teams y, posteriormente, vídeo, no cuando se realice un cambio de código en el repositorio.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Microsoft Azure Support Ticket — Teams Bidirectional Media (Voice + Live Avatar)
Stand: 2026-06-30
Sprache Ticket: Englisch (Copy-Paste unten)
Portal: Azure Portal → Help + support → Create a support request
Schritt-für-Schritt (Deutsch): MICROSOFT_SUPPORT_TICKET_PORTAL_WALKTHROUGH_2026-06-30.md
Issue type: Technical → Azure Communication Services (primary) + cross-reference Microsoft Teams / Graph Cloud Communications
Kurz (Deutsch, intern)
Wir bauen STELLA — einen KI-Copilot für Teams-Meetings mit bidirektionaler Kommunikation:
| Phase | Ziel |
|---|---|
| 1 — Voice only | STELLA spricht hörbar in der Meeting-Leitung (TTS), hört Teilnehmer (STT), antwortet intelligent |
| 2 — Voice + Video | Live-Avatar (Runway) als sichtbare Kachel im Meeting-Grid, synchron zu Audio |
Blocker: ACS Call Automation (playToAll) meldet CallConnected + PlayCompleted, aber list_participants=0 → kein hörbares Audio (Ghost Leg). Das bleibt bestehen auch nach native onlineMeetings-Erstellung + Application Access Policy.
Bitte an Microsoft: Empfohlener Architekturpfad für produktionsreife Bot-Media in Teams (Audio rein/raus, später Video) — ACS vs Application-hosted Media vs andere.
Copy-Paste: Support Request (English)
Title
ACS Call Automation playToAll silent in Teams Online Meeting (PlayCompleted, participants=0) — guidance for bidirectional voice + live avatar video
Problem description
We are building STELLA, a multi-tenant AI meeting copilot integrated with Microsoft Teams. Our production stack uses:
- Azure Communication Services (ACS) resource:
cdtech-communication(region: Europe) - Microsoft 365 tenant:
fe87c2f4-700c-4a68-9bd7-218fde87a857(C&D Technologies GmbH) - Organizer UPN:
[email protected](also[email protected]) - Backend: Python/FastAPI on Azure Railway (
https://api.cdtechnologies.de) - Teams Graph App (application permissions): Client ID
4b1d32ba-6c39-4a0b-b320-31981ce0654b(GRAPH_CLIENT_ID_TEAMS)
We need guidance on the correct Microsoft-recommended architecture for:
- Outbound audio (Phase 1): Bot TTS audible to all meeting participants (not operator-only Sidecar/browser audio).
- Inbound audio (Phase 1): Bot receives participant speech for STT / conversational AI (bidirectional voice).
- Outbound video (Phase 2): Live AI avatar (H.264) as a visible participant tile in the Teams meeting grid, lip-synced to TTS.
- Scalable multi-tenant SaaS: Each customer uses their own M365 tenant; we orchestrate via delegated/app permissions and tenant-specific organizer mailboxes.
Current architecture (what we built)
┌─────────────────────────────────────────────────────────────────────────────┐
│ STELLA Backend (Railway, Linux, Python) │
│ • Meeting create: Graph POST /users/{org}/onlineMeetings (native) │
│ • Copilot session, TTS (Azure Speech de-DE-KatjaNeural → WAV) │
│ • ACS Call Automation: connect_call(groupCallId) + playToAll(audioUrl) │
│ • Callbacks: POST /api/teams/copilot-acs-media/events │
│ • Bot Framework: meeting chat text (works) │
│ • Sidecar UI: browser STT chunks → backend (works, not meeting-wide) │
└───────────────┬───────────────────────────────┬─────────────────────────────┘
│ HTTPS │ Graph / Bot Framework
▼ ▼
┌───────────────────────────┐ ┌────────────────────────────────────────────┐
│ ACS (cdtech-communication)│ │ Teams Online Meeting │
│ Call Automation API │───▶│ groupCall / thread v2 │
│ (invisible bot leg) │ │ Human participants + meeting chat │
└───────────────────────────┘ └────────────────────────────────────────────┘
Optional (scaffold, Windows VM — not production-ready):
┌─────────────────────────────────────────────────────────────────────────────┐
│ teams-media-bot (.NET 8, Azure Windows VM) │
│ • Target: Microsoft.Graph.Communications.Calls.Media (Application-hosted) │
│ • StellaBridge HTTP: push PCM + H.264 frames │
│ • Today: ACS relay fallback only; GraphCommunicationsService = deferred │
│ • URL: https://teams-media-bot.cdtechnologies.de (health often timeout) │
└─────────────────────────────────────────────────────────────────────────────┘
Live avatar source (Phase 2):
┌─────────────────────────────────────────────────────────────────────────────┐
│ Runway Live API → WebRTC/video frames → transcode → Media Bot VideoSocket │
│ (Sidecar bridge today: operator-only video; not in Teams grid) │
└─────────────────────────────────────────────────────────────────────────────┘
Separate channels (important):
| Channel | Technology | Status |
|---|---|---|
| Meeting chat (text, @mentions) | Bot Framework + Graph | ✅ Works |
| Meeting audio broadcast (TTS to all) | ACS playToAll |
❌ Ghost Leg — silent |
| Operator Sidecar TTS | Browser audio | ✅ Operator hears only |
| Transcript post-meeting | Graph onlineMeeting transcript | ✅ (after meeting ends) |
| Live STT from all participants | Not implemented | ❌ Need inbound media path |
| Visible avatar tile | Graph Application-hosted media (planned) | ❌ Not wired |
Symptom (Ghost Leg)
When joining a native Teams online meeting (created via Graph onlineMeetings, not calendar fallback):
- ACS
connect_callsucceeds; webhookCallConnectedreceived. - ACS
playToAllwith publicly reachable HTTPS WAV URL succeeds; webhookPlayCompletedreceived. - ACS
list_participantsreturnscount=0consistently after connect. - No audible media in Teams client for human participants.
- Sidecar/browser TTS works for operator only (not acceptable for product).
Application Access Policy (Teams PowerShell) already applied:
- Policy:
Tag:STELLA-Graph-OnlineMeetings→ AppId4b1d32ba-6c39-4a0b-b320-31981ce0654b - Granted to:
[email protected],[email protected],[email protected] - Meeting create returns
_source: onlineMeetings(MS… meeting ID) — Ghost Leg persists.
Reproduction evidence (2026-06-30, Policy Test)
| Field | Value |
|---|---|
| Meeting subject | STELLA onlineMeetings Policy Test 2026-06-30 |
| onlineMeeting ID | MSplYzJiODRlNy01MTJlLTQyMzUtOTYzYi01YjJlOTA0MjNhNmMqMCoqMTk6bWVldGluZ19OalpqTkdVek5HVXROVEkxT1MwMFlXRTVMVGt3Wm1FdE1HSTFNbUZpWlRZek1HRTFAdGhyZWFkLnYy |
| groupCallId (thread) | 66c4e34e-5259-4aa9-90fa-0b52abe630a5 |
| ACS call_connection_id | 6d003a80-a129-48b2-a1ec-22e979b71feb |
| Join URL thread | 19:meeting_NjZjNGUzNGUtNTI1OS00YWE5LTkwZmEtMGI1MmFiZTYzMGE1@thread.v2 |
| Callback URL | https://api.cdtechnologies.de/api/teams/copilot-acs-media/events |
| Backend flags | TEAMS_COPILOT_AUDIO_PREFER_RAILWAY_ACS=true, Runway broadcast off |
| Human in call | Yes (Teams desktop, mic bar active, second machine) |
| Result | PlayCompleted, no audible output in meeting |
Earlier retest (calendar fallback, same symptom):
- groupCallId:
e6613890-2b4e-4b2d-80b9-1b716e146e36 - ACS call:
1e003a80-2f9a-4348-a143-3b8206013c61
Graph / Entra permissions (Teams app 4b1d32ba…)
Application permissions (admin consented), including:
Calls.JoinGroupCall.All,Calls.InitiateGroupCall.AllOnlineMeetings.ReadWrite.All,OnlineMeetings.Read.AllCalendars.ReadWrite,Calendars.ReadChat.ReadWrite.All,TeamsAppInstallation.ReadWriteForChat.All(auto-install still 403 without Consent variant)User.Read.All,CallRecords.Read.All, etc.
Bot Framework app (separate registration) handles /api/teams/bot/messages — chat works; does not provide meeting media.
What we need from Microsoft
Please advise on the recommended production path for our goals:
A) Outbound meeting audio (Phase 1 — voice only)
- Is ACS Call Automation
playToAllinto Teams native online meetings a supported scenario? If yes, why wouldlist_participants=0+ silent audio occur despiteCallConnected/PlayCompleted? - Should we use Graph Cloud Communications / Application-hosted media bot instead (Windows VM +
Calls.AccessMedia.All+ media platform certificate)? - Is there a service-hosted media bot or Teams Real-time API path that avoids Windows VM ops but still delivers audible mixed audio?
- Any tenant-level enablement required beyond Application Access Policy (e.g. Cloud Communications error 7504, policy flags)?
B) Inbound audio — bidirectional voice (Phase 1)
- How should a bot receive participant audio for STT in a Teams meeting?
- Graph
AudioSocket/ subscribed media? - ACS receive path?
- Teams transcription API (too high latency for live dialog)?
- Graph
- Minimum architecture for full-duplex voice (human speaks → bot hears → bot responds with TTS in meeting)?
C) Outbound video — live avatar (Phase 2)
- Recommended approach to inject live H.264 video (AI avatar, ~25 fps) as a visible meeting participant:
- Application-hosted media only?
- Can ACS carry video into Teams grid or audio-only?
- Can audio and video use the same Graph call leg, or must they be separate?
- Licensing / SKU requirements (Teams Premium, Copilot, etc.)?
D) Multi-tenant SaaS
- For customer tenants (not our own): recommended onboarding — Application Access Policy per tenant, consent model, hosted vs customer-deployed media bot?
- Any certification or Teams store requirements for a copilot with media injection?
Alternatives we are evaluating (please comment)
| Option | Our understanding | Question for Microsoft |
|---|---|---|
| ACS Call Automation | Simple HTTP, Linux-friendly; current Ghost Leg | Supported for Teams meetings? Fix for participants=0? |
| Application-hosted Media Bot | Windows VM, Graph Communications SDK, AudioSocket/VideoSocket | Is this the only supported path for grid video + reliable audio? |
| Service-hosted media bot | Microsoft hosts media stack | Available for our scenario / tenant size? |
| Teams RTMP / live events | Not interactive meeting | Not suitable — need 2-way |
| Screen share / computer sound | Operator workaround only | Not productizable |
| Azure OpenAI Realtime + ACS | Voice AI patterns | Overlap with Teams meeting join? |
Business context
- Product: STELLA — AI copilot for regulated industries (energy consulting, sales meetings).
- Use case: AI assistant joins customer Teams meetings, introduces itself (ISB compliance script), answers questions audibly, later with live avatar.
- Requirement: Bidirectional communication; voice-first MVP, video avatar second phase.
- Scale: Multi-tenant; each customer brings their own M365 tenant.
Severity / impact
- Severity: High — blocks core product capability (audible AI in Teams meetings).
- Workaround: Operator shares "computer sound" from browser Sidecar — not acceptable for customers.
Attachments / logs we can provide on request
- ACS webhook event sequence (CallConnected, PlayCompleted timestamps)
- Redacted Railway logs for call_connection_id above
- Graph meeting create response (
onlineMeetings) - Architecture ADR:
docs/architecture/TEAMS_LIVE_AVATAR_MEDIA_BOT_DECISION_2026-06.md(private repo — summary included above)
Contact
- Primary: Markus Jaszczyk —
[email protected]/[email protected] - Organization: C&D Technologies GmbH
- Tenant ID:
fe87c2f4-700c-4a68-9bd7-218fde87a857
Nach dem Absenden
- Correlation IDs aus Azure Portal notieren und in
docs/ops/TEAMS_ACS_GHOST_LEG_INCIDENT_2026-06-30.mdergänzen. - Antwort mit Architektur-Empfehlung → ADR aktualisieren + P1 Media Bot Scope anpassen.
- Falls 7504 / tenant enablement nötig: separates Enablement-Ticket referenzieren.
Verwandte interne Docs
- Lenguaje dominante
- Sin datos de lenguaje
- Estrellas
- 339
- Forks
- 113
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de Azure/Communication
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 20/100
Azure/Communication#600 ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
Azure/Communication#599 · 4 comentarios · 1 reacción ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
Azure/Communication#543 ·
-
Needs: triage :mag:
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
Azure/Communication#447 ·
-
Needs: triage :mag:
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
Azure/Communication#440 · 4 comentarios ·
Todos los issues de Azure/Communication
Issues similares
-
[Bug]: VAD fails on every card when Condense Audio is on ('Future' object has no attribute 'join')Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
bpwhelan/GameSentenceMiner#585 ·
Los mantenedores suelen responder en 2 días
-
Report: USA Network EastAbiertocheck:passed streams:remove
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
gradio-app/gradio#13898 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
78/xiaozhi-esp32#2279 · 1 comentario ·
Los mantenedores suelen responder en 2 días
-
read_jpeg()/get_frame_jpeg() encodes RGB JPEGs (components R,G,B) → green/magenta in browsersAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
pollen-robotics/reachy_mini#1433 ·
Los mantenedores suelen responder en 1 día