perplexity-hackathon-LawMitra / perplexity_hackathon / src / routes / voiceRoutes.ts
voiceRoutes.ts
Raw
import { Router, Request, Response } from 'express';
import multer from 'multer';
import path from 'path';
import { z } from 'zod';
import config from '../config';
import { transcriptionService } from '../services/transcriptionService';
import { languageService } from '../services/languageService';

const router = Router();

// Configure multer for file uploads
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'tmp/uploads/');
  },
  filename: (req, file, cb) => {
    const uniqueSuffix = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
    cb(null, `${uniqueSuffix}${path.extname(file.originalname)}`);
  },
});

const fileFilter = (req: Request, file: Express.Multer.File, cb: multer.FileFilterCallback) => {
  const allowedFormats = config.upload.allowedAudioFormats;
  const fileExtension = path.extname(file.originalname).toLowerCase().substring(1);
  
  if (allowedFormats.includes(fileExtension)) {
    cb(null, true);
  } else {
    cb(new Error(`Invalid file format. Allowed formats: ${allowedFormats.join(', ')}`));
  }
};

const upload = multer({
  storage,
  fileFilter,
  limits: {
    fileSize: config.upload.maxFileSizeMB * 1024 * 1024, // Convert MB to bytes
  },
});

// Schema for query parameters
const uploadSchema = z.object({
  language: z.string().min(2).max(10).optional(),
});

router.post('/upload-voice', upload.single('audio'), async (req: Request, res: Response) => {
  try {
    if (!req.file) {
      return res.status(400).json({
        success: false,
        error: 'No audio file provided',
      });
    }

    // Detect language from audio
    const detectedLanguage = await languageService.detectFromAudio(
      req.file.path,
      req.sessionId || 'default'
    );

    // Transcribe the audio file using detected language
    const result = await transcriptionService.transcribeAudio(
      req.file.path,
      detectedLanguage.code
    );

    res.json({
      success: true,
      ...result,
      detectedLanguage,
    });
  } catch (error) {
    if (error instanceof multer.MulterError) {
      return res.status(400).json({
        success: false,
        error: 'File upload error',
        details: error.message,
      });
    }

    console.error('Error processing voice upload:', error);
    res.status(500).json({
      success: false,
      error: 'Failed to process voice upload',
    });
  }
});

export default router;