Audio Moderation
Stream's audio moderation engine transcribes uploads and classifies the transcript. Voice messages, voice notes, and other audio attachments are processed asynchronously so the upload is not held back.
Transcription covers the languages listed below. Classification uses the text engine you attach: the NLP engine's languages, or the LLM engine, which has no fixed language list.
Language Support
Audio moderation supports the languages that the transcription service recognizes. The system automatically identifies the spoken language and transcribes accordingly. The following languages are officially supported:
Languages outside this list may still transcribe, but with reduced accuracy. If audio in a specific language is important to your use case, we recommend validating quality on a sample before rolling out.
- Afrikaans
- Arabic
- Armenian
- Azerbaijani
- Belarusian
- Bosnian
- Bulgarian
- Catalan
- Chinese
- Croatian
- Czech
- Danish
- Dutch
- English
- Estonian
- Finnish
- French
- Galician
- German
- Greek
- Hebrew
- Hindi
- Hungarian
- Icelandic
- Indonesian
- Italian
- Japanese
- Kannada
- Kazakh
- Korean
- Latvian
- Lithuanian
- Macedonian
- Malay
- Marathi
- Maori
- Nepali
- Norwegian
- Persian
- Polish
- Portuguese
- Romanian
- Russian
- Serbian
- Slovak
- Slovenian
- Spanish
- Swahili
- Swedish
- Tagalog
- Tamil
- Thai
- Turkish
- Ukrainian
- Urdu
- Vietnamese
- Welsh
Supported Formats
Audio moderation accepts the following file extensions:
.mp3.mpga.mpeg.mp4.m4a.wav.webm
The following MIME types are accepted:
audio/mpeg,audio/mp3audio/mp4,audio/x-m4aaudio/wav,audio/wave,audio/x-wav,audio/vnd.waveaudio/webmvideo/mp4(for MP4 containers that carry audio)application/octet-stream(the default for many CDNs and S3 buckets)
Uploads with a MIME type outside this allowlist are skipped without moderating. To keep unsupported uploads out entirely in Stream Chat, configure the app's file upload allowlist or blocklist from the dashboard. This is a Stream Chat upload setting, not part of the Moderation API; for standalone moderation, filter file types in your own upload flow.
Limitations
- Each request can include a maximum of 10 audio attachments. Requests with more attachments are rejected before transcription.
- Audio files must be no larger than 25 MB. Larger files are skipped without moderating.
- Audio moderation runs asynchronously, so audio is accepted immediately without any latency. It will take a few seconds or minutes for moderation to complete. Once the moderation is complete, the audio will be either blocked or flagged depending on the configured rules.
- Only spoken content is analyzed. Music, ambient noise, and other non-speech audio are moderated only to the extent that the transcription model surfaces recognizable words.
Configuration
Audio has its own configuration. Text policy rules do not apply to transcripts until you put them on ai_audio_config. Put NLP rules in ai_text_config or LLM rules in llm_config. The top-level rules array is the legacy fallback, used only when the matching engine config is empty. Audio moderation stays off until at least one rule with an action is set on ai_audio_config.
await client.moderation.upsertConfig({
key: "chat:messaging",
ai_audio_config: {
ai_text_config: {
rules: [{ label: "HATRED", action: "flag" }],
},
},
});See AI Text (NLP) or AI Text (LLM) for labels and actions.
Send audio
Send audio files, not transcripts. Put up to 10 audio URLs in moderation_payload.audios on a Check call; Stream downloads, transcribes, and classifies each one. Stream Chat voice messages and Feeds audio attachments are sent for you.
const response = await client.moderation.check({
entity_type: "voice_note",
entity_id: "voice-note-123",
entity_creator_id: "user-42",
config_key: "chat:messaging",
moderation_payload: {
audios: ["https://cdn.example.com/voice/123.m4a"],
},
});
// response.status is "pending" until transcription and classification finishThe audio URL must be downloadable with a plain GET. The result arrives with the moderation_check.completed and review_queue_item.new webhooks. Like video, audio is always asynchronous, and force_sync on Check skips it.
If you already have your own transcript, send it in moderation_payload.texts instead. It is moderated by your text rules, not your audio rules.
How It Works
When an audio file is uploaded:
- The audio is accepted immediately to maintain low latency.
- Transcription begins asynchronously in the background.
- The resulting transcript is evaluated against the harm categories configured on the audio configuration.
- If a rule matches, its action is applied.
- The message or post is updated based on moderation results.
- Flagged audio appears in the Review Queue with the audio URL and transcript attached, so moderators can read what was said before deciding.