Multimodal AI in Production: Beyond Text
Back to all articles
AI Engineering
20 min read10 min read

Multimodal AI in Production: Beyond Text

Building applications with vision, audio, and video models. Covers architecture patterns, latency optimization, cost management, and real-world use cases.

Debasish Maji
Debasish Maji
AI Engineering Lead
April 30, 2026
MultimodalVisionAudioVideoProduction

The Multimodal Revolution

Text was just the beginning. Modern AI understands images, audio, video, and combinations of all modalities.

Multimodal AI unlocks use cases impossible with text alone: visual search, document understanding, video analysis, voice assistants, and more. This guide covers what you need to know to build multimodal applications in production.

•••

Understanding Multimodal Models

Model Categories

CategoryInputOutputExamples
Vision-LanguageImage + TextTextGPT-4V, Claude 3, Gemini
Text-to-ImageTextImageDALL-E 3, Midjourney, Stable Diffusion
Speech-to-TextAudioTextWhisper, Deepgram
Text-to-SpeechTextAudioElevenLabs, OpenAI TTS
Video UnderstandingVideoTextGemini 1.5, GPT-4V (frames)
Any-to-AnyMultipleMultipleGemini, GPT-4o

Capability Comparison

ModelVisionAudio InAudio OutVideoCost
GPT-4oExcellentGoodGoodFrames$$$$
Gemini 1.5 ProExcellentGoodNoNative$$$
Claude 3 OpusExcellentNoNoNo$$$
Llama 3.2 VisionGoodNoNoNoFree
•••

Vision Applications

Use Cases

Use CaseInputOutputComplexity
Image captioningImageDescriptionLow
Visual Q&AImage + QuestionAnswerMedium
Document OCRDocument imageStructured textMedium
Object detectionImageBounding boxesMedium
Visual searchImageSimilar itemsHigh
Chart understandingChart imageData extractionHigh

Vision Model Selection

RequirementRecommended ModelWhy
Highest accuracyGPT-4VBest reasoning
Long documentsGemini 1.5Large context
Cost efficiencyLlama VisionFree, decent quality
Real-timeCustom fine-tunedOptimized latency

Image Processing Pipeline

StageActionLatency
UploadReceive image50-200ms
PreprocessingResize, compress20-50ms
EncodingConvert to base64 or URL10ms
API callSend to model500-3000ms
Post-processingParse response10ms
TotalEnd-to-end590-3270ms
Diagram
flowchart LR A[Image Upload] --> B[Validate Format] B --> C[Resize if Needed] C --> D[Compress] D --> E{Size OK?} E -->|Yes| F[Encode Base64] E -->|No| G[Tile Image] G --> F F --> H[Vision API Call] H --> I[Parse Response] I --> J[Return Result] style A fill:#14b8a6,color:#fff style H fill:#f59e0b,color:#fff style J fill:#22c55e,color:#fff
Typescript
import sharp from 'sharp';

interface ImageProcessingOptions {
  maxWidth: number;
  maxHeight: number;
  quality: number;
  format: 'jpeg' | 'webp' | 'png';
}

class ImageProcessor {
  private defaults: ImageProcessingOptions = {
    maxWidth: 2048,
    maxHeight: 2048,
    quality: 85,
    format: 'jpeg'
  };
  
  async prepareForVision(
    imageBuffer: Buffer,
    options: Partial<ImageProcessingOptions> = {}
  ): Promise<{ base64: string; metadata: any }> {
    const opts = { ...this.defaults, ...options };
    
    // Get original metadata
    const metadata = await sharp(imageBuffer).metadata();
    
    // Process image
    let pipeline = sharp(imageBuffer);
    
    // Resize if too large
    if (metadata.width! > opts.maxWidth || metadata.height! > opts.maxHeight) {
      pipeline = pipeline.resize(opts.maxWidth, opts.maxHeight, {
        fit: 'inside',
        withoutEnlargement: true
      });
    }
    
    // Compress and convert
    const processed = await pipeline
      .jpeg({ quality: opts.quality })
      .toBuffer();
    
    // Convert to base64
    const base64 = processed.toString('base64');
    
    return {
      base64: `data:image/jpeg;base64,${base64}`,
      metadata: {
        originalSize: imageBuffer.length,
        processedSize: processed.length,
        compression: 1 - (processed.length / imageBuffer.length),
        dimensions: {
          original: { width: metadata.width, height: metadata.height },
          processed: await sharp(processed).metadata()
        }
      }
    };
  }
  
  async tileForLargeImage(
    imageBuffer: Buffer,
    tileSize: number = 1024
  ): Promise<string[]> {
    const metadata = await sharp(imageBuffer).metadata();
    const tiles: string[] = [];
    
    const cols = Math.ceil(metadata.width! / tileSize);
    const rows = Math.ceil(metadata.height! / tileSize);
    
    for (let row = 0; row < rows; row++) {
      for (let col = 0; col < cols; col++) {
        const tile = await sharp(imageBuffer)
          .extract({
            left: col * tileSize,
            top: row * tileSize,
            width: Math.min(tileSize, metadata.width! - col * tileSize),
            height: Math.min(tileSize, metadata.height! - row * tileSize)
          })
          .jpeg({ quality: 85 })
          .toBuffer();
        
        tiles.push(`data:image/jpeg;base64,${tile.toString('base64')}`);
      }
    }
    
    return tiles;
  }
}

// Usage with OpenAI Vision
async function analyzeImage(imageBuffer: Buffer): Promise<string> {
  const processor = new ImageProcessor();
  const { base64, metadata } = await processor.prepareForVision(imageBuffer);
  
  console.log(`Compressed image by ${(metadata.compression * 100).toFixed(1)}%`);
  
  const response = await openai.chat.completions.create({
    model: 'gpt-4-vision-preview',
    messages: [
      {
        role: 'user',
        content: [
          { type: 'text', text: 'Describe this image in detail.' },
          { type: 'image_url', image_url: { url: base64, detail: 'high' } }
        ]
      }
    ],
    max_tokens: 1000
  });
  
  return response.choices[0].message.content!;
}

Optimization Techniques

TechniqueSavingsTrade-off
Image compression30-50% latencyQuality loss
Resolution reduction40-60% latencyDetail loss
Tiling for large imagesHandles any sizeMore API calls
Caching similar images90%+ for repeatsStorage cost
•••

Audio Applications

Speech-to-Text

ModelAccuracyLanguagesLatencyCost
Whisper Large95%+991x realtimeFree (self-hosted)
Deepgram94%30+0.3x realtime$$
Google Speech93%125+0.5x realtime$$
AssemblyAI94%20+0.4x realtime$$

Text-to-Speech

ModelQualityLatencyVoicesCost
ElevenLabsExcellent200ms TTFB100+$$$
OpenAI TTSVery good150ms TTFB6$$
Azure TTSGood100ms TTFB400+$$
Coqui (open)GoodVariableCustomFree

Audio Pipeline Architecture

ComponentPurposeLatency Target
Audio captureRecord inputReal-time
VAD (Voice Activity)Detect speechUnder 50ms
ChunkingSegment audioUnder 20ms
TranscriptionSpeech to textUnder 500ms
ProcessingLLM responseUnder 2s
SynthesisText to speechUnder 300ms TTFB

Streaming Audio

ApproachLatencyComplexity
Full audio then process5-10sLow
Chunked processing1-2sMedium
Real-time streaming200-500msHigh
•••

Video Applications

Video Processing Approaches

ApproachMethodUse Case
Frame samplingExtract key framesQuick understanding
Scene detectionSplit by scenesNarrative analysis
Full videoNative video inputDetailed analysis
Audio extractionTranscribe audio trackContent search

Frame Sampling Strategies

StrategyFramesCoverageCost
Uniform1 per 10sLowCheap
Scene-based1 per sceneMediumMedium
Motion-basedOn movementHighVariable
Dense1 per secondCompleteExpensive

Video Analysis Pipeline

StageActionCompute
IngestDownload/stream videoI/O bound
Frame extractionSample framesCPU
Audio extractionSeparate audio trackCPU
Visual analysisProcess frames with vision modelGPU/API
Audio analysisTranscribe audioGPU/API
FusionCombine insightsCPU

Cost Estimation

Video LengthFrames (1/10s)Vision API CostAudio CostTotal
1 minute6$0.05$0.01$0.06
10 minutes60$0.50$0.10$0.60
1 hour360$3.00$0.60$3.60
•••

Multimodal RAG

Architecture

ComponentModalityPurpose
Text embeddingsTextSemantic search
Image embeddingsImagesVisual similarity
Audio transcriptsAudioSpoken content
Fusion layerAllCombined retrieval

Embedding Models

ModelModalityDimensionsQuality
CLIPImage + Text512-768Good
ImageBind6 modalities1024Very good
SigLIPImage + Text384-1024Excellent
QueryRetrievesExample
TextImages"sunset over ocean" finds photos
ImageTextPhoto finds descriptions
TextAudioQuery finds podcast segments
ImageSimilar imagesVisual search
•••

Production Considerations

Latency Targets

ApplicationAcceptable LatencyOptimal
Real-time assistantUnder 2sUnder 1s
Document processingUnder 10sUnder 5s
Video analysisMinutesUnder 1 min
Batch processingHoursThroughput focus

Cost Management

StrategySavingsImplementation
Resolution optimization40-60%Resize before API
Model routing50-70%Simple tasks to cheap models
Caching30-50%Cache repeated content
Batch processing20-30%Aggregate requests

Error Handling

Error TypeCauseMitigation
TimeoutLarge mediaChunking, async
Rate limitHigh volumeQueuing, backoff
Format errorUnsupported mediaValidation, conversion
Content filterFlagged contentPre-screening
•••

Real-World Architectures

Visual Search System

ComponentTechnologyPurpose
Image uploadS3 + CDNStorage
EmbeddingCLIP/SigLIPVectorization
IndexPinecone/QdrantSimilarity search
RerankingVision LLMQuality filtering

Voice Assistant

ComponentTechnologyPurpose
Wake wordLocal modelActivation
STTWhisper/DeepgramTranscription
LLMGPT-4oUnderstanding
TTSElevenLabsResponse

Document Intelligence

ComponentTechnologyPurpose
OCRGPT-4V/GeminiText extraction
Layout analysisVision modelStructure
Entity extractionLLMKey information
EmbeddingText + visualSearch
•••

Key Takeaways

  1. 1Choose modality-appropriate models - GPT-4V for complex reasoning, Whisper for transcription, specialized models for specialized tasks.
  1. 2Optimize media before processing - Compression and resolution reduction dramatically reduce cost and latency.
  1. 3Video is expensive - Frame sampling strategies can reduce costs by 90% with minimal quality loss.
  1. 4Multimodal RAG is powerful - Cross-modal search enables use cases impossible with text alone.
  1. 5Latency compounds - Each modality adds latency. Design pipelines to parallelize where possible.
  1. 6Start with single modality - Master one modality before combining. Complexity increases non-linearly.

Multimodal AI is no longer experimental. The models are capable, the APIs are stable, and the use cases are proven. The question is not whether to go multimodal, but how.

Found this helpful?

Share it with others who might benefit

TweetShare

Related articles