File size: 2,819 Bytes
7eb17c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# Welcome to Cloud Functions for Firebase for Python!
# To get started, simply uncomment the below code or create your own.
# Deploy with `firebase deploy`

from firebase_functions import https_fn
from firebase_admin import initialize_app
import io  # Ensure this import is added to handle BytesIO
import tempfile
import os

from backend.ai_processing.gpt import ai_language_detector
from backend.ai_processing.transcription import transcribe_audio_file_with_language


initialize_app()

@https_fn.on_request()
def detect_language(req: https_fn.Request) -> https_fn.Response:
    """
    Cloud Function to detect language from an uploaded audio file.
    
    - Accepts POST requests with an audio file.
    - Validates the file format (assumes WAV for this example).
    - Reads the audio file content.
    - Transcribes the audio content and detects the language.
    - Returns the detected language as JSON.
    """
    if req.method != 'POST':
        return https_fn.Response("Method Not Allowed", status=405)
    
    # Check if there is a file in the request
    if 'file' not in req.files:
        return https_fn.Response("No file part in the request", status=400)
    
    file = req.files['file']
    
    # Enforce a specific file format here, e.g., WAV
    if not file or not file.filename or not file.filename.endswith(('.mp3', '.mp4', '.mpeg', '.mpga', '.m4a', '.wav', '.webm')):
        return https_fn.Response("File format not supported.", status=400)
    
    try:
        # Save the file to a temporary file
        with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(file.filename)[1]) as tmp_file:
            file_content = file.read()  # Read file content
            tmp_file.write(file_content)  # Write content to temporary file
            tmp_file_path = tmp_file.name  # Get the path of the temporary file
        
        # Process the audio file and detect language
        transcription = transcribe_audio_file_with_language(tmp_file_path)
        
        # Clean up the temporary file
        os.remove(tmp_file_path)
        
        # Detect the language from the transcription
        predicted_language = ai_language_detector(transcription)
        
        if predicted_language is None:
            raise ValueError("Language could not be detected.")
        
        # Return the detected language as JSON
        return https_fn.Response(f"{predicted_language}", status=200, mimetype='application/json')
    except ValueError as e:
        # Handle specific errors, e.g., language not detected
        return https_fn.Response(f"Error: {str(e)}", status=400)
    except Exception as e:
        # Handle errors (e.g., transcription failure, unsupported audio format)
        return https_fn.Response(f"Error processing the audio file: {str(e)}", status=500)