Skip to main content
Glama

batch_process_audio

Process multiple audio files simultaneously by applying operations like normalization, compression, or format conversion to batches in specified directories.

Instructions

Apply audio processing operations to multiple files in a directory

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
inputDirectoryYesDirectory containing input files
outputDirectoryYesDirectory for processed files
filePatternNoGlob pattern for file matching*.{mp3,wav,ogg,flac,m4a,aac}
operationsYesAudio processing operations to apply (same as process_audio_file)
overwriteNoWhether to overwrite existing output files

Implementation Reference

  • MCP tool handler for 'batch_process_audio': parses input schema, delegates to AudioProcessor.batchProcessAudio (with fallback to advanced processor), returns JSON result.
    case 'batch_process_audio': { try { const input = BatchProcessAudioInputSchema.parse(args); const result = await audioProcessor.batchProcessAudio( { directory: input.inputDirectory, pattern: input.filePattern }, { directory: input.outputDirectory }, input.operations, (args as any).overwrite || false ); return { content: [ { type: 'text', text: JSON.stringify(result, null, 2) } ] }; } catch (validationError) { // If validation fails, try with the advanced processor const result = await advancedProcessor.batchProcessAudio( { directory: (args as any).inputDirectory, pattern: (args as any).filePattern }, { directory: (args as any).outputDirectory }, (args as any).operations, (args as any).overwrite || false ); return { content: [ { type: 'text', text: JSON.stringify(result, null, 2) } ] }; } }
  • Zod input schema for batch_process_audio tool defining inputDirectory, outputDirectory, filePattern, and operations with transformations.
    export const BatchProcessAudioInputSchema = z.object({ inputDirectory: z.string().min(1), outputDirectory: z.string().min(1), filePattern: z.string().default('*.{mp3,wav,ogg,flac,m4a,aac}').optional(), operations: AudioOperationsSchema }).transform((data) => { // Transform string values to numbers for format operations if (data.operations.format) { if (data.operations.format.sampleRate && typeof data.operations.format.sampleRate === 'string') { data.operations.format.sampleRate = parseInt(data.operations.format.sampleRate) as any; } if (data.operations.format.channels && typeof data.operations.format.channels === 'string') { data.operations.format.channels = parseInt(data.operations.format.channels) as any; } } return data; });
  • Tool registration object for 'batch_process_audio' exported and included in tools list for MCP ListToolsRequest.
    */ export const batchProcessAudioTool: Tool = { name: 'batch_process_audio', description: 'Apply audio processing operations to multiple files in a directory', inputSchema: { type: 'object', properties: { inputDirectory: { type: 'string', description: 'Directory containing input files' }, outputDirectory: { type: 'string', description: 'Directory for processed files' }, filePattern: { type: 'string', description: 'Glob pattern for file matching', default: '*.{mp3,wav,ogg,flac,m4a,aac}' }, operations: { type: 'object', description: 'Audio processing operations to apply (same as process_audio_file)' }, overwrite: { type: 'boolean', description: 'Whether to overwrite existing output files', default: false } }, required: ['inputDirectory', 'outputDirectory', 'operations'] } };
  • Tools array registration including batchProcessAudioTool for MCP server list tools handler.
    export const tools = [ processAudioFileTool, batchProcessAudioTool,
  • Core batchProcessAudio implementation in BaseAudioProcessor: discovers files, queues concurrent FFmpeg processing with operations, handles output paths and errors.
    async batchProcessAudio( input: ProcessingInput, output: ProcessingOutput, operations: AudioOperations, overwrite: boolean = false ): Promise<BatchProcessingResult> { const startTime = Date.now(); try { // Find input files const inputFiles = await this.findInputFiles(input); if (inputFiles.length === 0) { throw new FFmpegError('No audio files found matching the criteria'); } logger.info(`Found ${inputFiles.length} files to process`); // Process files with concurrency control via PQueue const processingPromises = inputFiles.map((inputFile) => this.queue.add(async () => { const outputFile = this.generateBatchOutputPath(inputFile, input, output); // Create a new command for each file const command = createFFmpegCommand(inputFile); // Apply operations this.applyOperationsToCommand(command, operations); // Execute command return this.processAudioFile(inputFile, outputFile, operations, overwrite); }) ); const allResults = await Promise.all(processingPromises); const results: ProcessingResult[] = allResults.filter((r): r is ProcessingResult => !!r); const totalProcessingTime = Date.now() - startTime; const successfulFiles = results.filter(r => r.success).length; const failedFiles = results.length - successfulFiles; return { totalFiles: results.length, successfulFiles, failedFiles, results, totalProcessingTime }; } catch (error) { throw new FFmpegError(`Batch processing failed: ${(error as Error).message}`); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DeveloperZo/mcp-audio-tweaker'

If you have feedback or need assistance with the MCP directory API, please join our Discord server