Subhrajeet Ghosh
Restructure
9a6e69b
from flask import Flask, request, jsonify
import whisper
import os
import tempfile
import logging
import subprocess
app = Flask(__name__)
# Configure logging
logging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)
# Load the Whisper model (you can choose different sizes: tiny, base, small, medium, large)
model = whisper.load_model("base")
def check_ffmpeg():
try:
subprocess.run(['ffmpeg', '-version'], capture_output=True, check=True)
logger.info("FFmpeg is installed and working")
return True
except (subprocess.SubprocessError, FileNotFoundError) as e:
logger.error(f"FFmpeg check failed: {str(e)}")
return False
@app.route('/transcribe', methods=['POST'])
def transcribe_audio():
temp_file_path = None
try:
# Check if FFmpeg is installed
if not check_ffmpeg():
return jsonify({"error": "FFmpeg is not installed. Please install FFmpeg to process audio files."}), 500
# Check if file is in the request
if 'file' not in request.files:
return jsonify({"error": "No file provided"}), 400
file = request.files['file']
if file.filename == '':
return jsonify({"error": "No file selected"}), 400
# Get the file extension
file_ext = os.path.splitext(file.filename)[1]
if not file_ext:
file_ext = '.mp3' # default extension
# Create a temporary file with the correct extension
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=file_ext)
temp_file_path = temp_file.name
temp_file.close()
# Save the uploaded file
file.save(temp_file_path)
logger.debug(f"File saved to: {temp_file_path}")
# Verify the file exists and has content
if not os.path.exists(temp_file_path):
return jsonify({"error": "Failed to save temporary file"}), 500
file_size = os.path.getsize(temp_file_path)
if file_size == 0:
return jsonify({"error": "Uploaded file is empty"}), 400
logger.debug(f"File size: {file_size} bytes")
# Transcribe the audio
result = model.transcribe(temp_file_path)
logger.debug("Transcription completed successfully")
return jsonify({
"text": result["text"],
"segments": result["segments"]
})
except Exception as e:
logger.error(f"Error during transcription: {str(e)}", exc_info=True)
return jsonify({"error": str(e)}), 500
finally:
# Clean up the temporary file
if temp_file_path and os.path.exists(temp_file_path):
try:
os.unlink(temp_file_path)
logger.debug(f"Temporary file deleted: {temp_file_path}")
except Exception as e:
logger.error(f"Error deleting temporary file: {str(e)}")
if __name__ == '__main__':
port = int(os.environ.get('PORT', 7860))
app.run(host='0.0.0.0', port=port)