Skip to main content

Recording Audio

The MicdropRecorder class enables recording of audio messages during voice calls, capturing both user and assistant audio with their corresponding conversation messages.

Basic Usage

import { MicdropServer, MicdropRecorder, Logger } from '@micdrop/server'

const server = new MicdropServer(socket, { agent, stt, tts })

// Create recorder
const recorder = new MicdropRecorder(server)
recorder.logger = new Logger('MicdropRecorder')

// Listen for audio messages
recorder.on('AudioMessage', (audioMessage) => {
console.log('Audio recorded:', {
role: audioMessage.role,
messageIndex: audioMessage.messageIndex,
bufferSize: audioMessage.buffer.length,
})
})

// Get all recordings when call ends
recorder.on('Complete', (audioMessages) => {
console.log(`Call complete with ${audioMessages.length} audio messages`)
})

AudioMessage Structure

Each AudioMessage contains:

interface AudioMessage {
buffer: Buffer // Raw audio data
messageIndex: number // Index in agent.conversation
message: string // The message content
role: 'user' | 'assistant' // Speaker role
}

Saving to File

Save audio messages incrementally as they arrive:

import { writeFileSync } from 'fs'

const audioMessages: object[] = []

recorder.on('AudioMessage', (audioMessage) => {
const data = {
messageIndex: audioMessage.messageIndex,
message: audioMessage.message,
role: audioMessage.role,
buffer: audioMessage.buffer.toString('base64'),
timestamp: new Date().toISOString(),
}
audioMessages.push(data)
writeFileSync('recording.json', JSON.stringify(audioMessages, null, 2))
})

Recorder Events

The recorder emits the following events:

EventPayloadDescription
AudioMessageAudioMessageEmitted when an audio message is complete
CompleteAudioMessage[]Emitted when the call ends with all recordings

Server Events

MicdropRecorder relies on events from MicdropServer:

EventPayloadDescription
UserAudioBufferRaw audio chunk from user
AssistantAudioBufferRaw audio chunk from TTS
EndMicdropCallSummaryCall ended

You can also listen to these events directly on MicdropServer:

server.on('UserAudio', (chunk) => {
console.log('User audio chunk:', chunk.length, 'bytes')
})

server.on('AssistantAudio', (chunk) => {
console.log('Assistant audio chunk:', chunk.length, 'bytes')
})

server.on('End', (summary) => {
console.log('Call ended:', summary)
})

Cleanup

Call destroy() to clean up listeners when done:

recorder.destroy()

Technical Notes

  • User audio chunks arrive before the user message is added to the conversation
  • The recorder buffers chunks and associates them with messages when available
  • Assistant audio is finalized when the next user speech begins or when the call ends
  • Audio is stored as raw PCM buffers (16kHz, 16-bit, mono)