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 recorderconst recorder = new MicdropRecorder(server)recorder.logger = new Logger('MicdropRecorder')
// Listen for audio messagesrecorder.on('AudioMessage', (audioMessage) => { console.log('Audio recorded:', { role: audioMessage.role, messageIndex: audioMessage.messageIndex, bufferSize: audioMessage.buffer.length, })})
// Get all recordings when call endsrecorder.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:
| Event | Payload | Description |
|---|---|---|
AudioMessage | AudioMessage | Emitted when an audio message is complete |
Complete | AudioMessage[] | Emitted when the call ends with all recordings |
Server Events
MicdropRecorder relies on events from MicdropServer:
| Event | Payload | Description |
|---|---|---|
UserAudio | Buffer | Raw audio chunk from user |
AssistantAudio | Buffer | Raw audio chunk from TTS |
End | MicdropCallSummary | Call 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)