Skip to main content

Call Recording

New in 3.19

Call recording is generally available in Rasa Pro 3.19.

Call recording captures the audio of a voice conversation between a caller and your Rasa assistant. Use it to review calls, debug voice behaviour, or keep an audio archive of production conversations.

This page describes how to enable recording, where files are stored, and how custom connectors can participate.

Supported channels

Call recording is available on all built-in voice stream channels:

It is not available on voice-ready connectors such as AudioCodes VoiceAI Connect, Jambonz, or Twilio Voice.

Custom voice stream connectors can record calls if they use RecordingSession as described in Custom connectors.

Enable call recording

Add a recordings block to endpoints.yml. Recording is configured once for the assistant and applies to every supported channel.

endpoints.yml
recordings:
enabled: true
provider: local
local:
path: ./recordings

The recordings configuration accepts the following properties:

General settings

  • enabled (optional): Turn call recording on or off. Defaults to false.
  • provider: Storage backend for saved recordings. One of local, s3, or azure.

Local storage

  • path: Directory on disk where recordings are written. Defaults to ./recordings.

Amazon S3

  • bucket: Name of the S3 bucket where recordings are saved.
  • region: AWS region of the bucket.
  • prefix: Key prefix (folder) inside the bucket.

Authenticate with AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY, or with an IAM role that can write to the bucket. See Amazon S3 Storage for the same credential pattern used elsewhere in Rasa.

Azure Blob Storage

  • container: Name of the Azure container where recordings are saved.
  • account_name: Storage account that owns the container.
  • prefix: Blob prefix (folder) inside the container.

Authenticate with AZURE_ACCOUNT_KEY (or another credential supported by the Azure SDK). See Azure Storage for the same credential pattern used elsewhere in Rasa.

How recordings work

When recording is enabled, Rasa attaches a RecordingSession to each voice call. User audio from the inbound stream and bot audio from text-to-speech are written into that session until the call ends. The finished file is then uploaded or written to the configured provider.

What is recorded

Rasa records both sides of the call:

  • Caller audio as it arrives on the voice stream.
  • Assistant audio as it is sent to the caller (TTS output).

Custom connectors must record bot audio explicitly; see Custom connectors. If they skip that step, the file contains only caller audio.

When recording starts and stops

Recording starts when the voice session is established and stops when the call ends (hang-up, disconnect, or channel error). There is no separate start or stop action: if recordings.enabled is true, every call on a supported channel is recorded.

File format and naming

Recordings use the same audio format as the channel. See Audio format.

Files are stored under the configured path or prefix. Each call produces one recording for that session.

Store and retrieve recordings

Rasa does not serve recordings over an HTTP endpoint. After the call ends, read the file from the storage you configured:

  • Local: files in path (default ./recordings). Ensure the process can write there. With more than one replica, use a shared volume or a cloud provider; local disk is not shared across instances.
  • S3: objects in s3://<bucket>/<prefix>.
  • Azure: blobs in the given container under prefix.

Rasa does not delete recordings. Set retention on the bucket, container, or disk according to your policy.

Custom connectors

If you implement a custom voice output channel and override send_audio_bytes, call record_bot_audio on RecordingSession before sending audio so bot turns are included in the recording. See Call recording on streaming channels in the custom connectors reference.

custom_output_channel.py
async def send_audio_bytes(self, recipient_id: str, audio_bytes: RasaAudioBytes) -> None:
if self.recording_session is not None:
self.recording_session.record_bot_audio(audio_bytes)
# send audio to the voice platform

User audio is recorded by the channel as frames arrive. You only need this hook when you replace the default bot-audio send path.

Limitations

  • Built-in voice stream channels record automatically when recordings.enabled is true. Custom connectors must use RecordingSession as described above.
  • Overriding send_audio_bytes without calling record_bot_audio omits assistant audio from the file.
  • Local storage is not suitable for horizontally scaled deployments unless every replica shares the same writable volume.
  • Cloud providers require network access and credentials with write permission. Failed uploads are not retried as a user-facing download API.
  • There is no built-in UI or webhook to play or list recordings.
Privacy and compliance

Call recordings may contain personal data and payment or health information spoken on the call. Confirm that you have a lawful basis to record (including caller notice or consent where required), restrict who can read the files, and set retention to match your organization's policy and local regulations.