🎤 Micdrop

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)