Jelajahi Sumber

fix: safari audio issue

Timothy J. Baek 11 bulan lalu
induk
melakukan
5cbb79fa6e
2 mengubah file dengan 47 tambahan dan 4 penghapusan
  1. 46 4
      backend/apps/audio/main.py
  2. 1 0
      backend/requirements.txt

+ 46 - 4
backend/apps/audio/main.py

@@ -23,7 +23,6 @@ import hashlib
 from pathlib import Path
 from pathlib import Path
 import json
 import json
 
 
-
 from constants import ERROR_MESSAGES
 from constants import ERROR_MESSAGES
 from utils.utils import (
 from utils.utils import (
     decode_token,
     decode_token,
@@ -106,6 +105,33 @@ class AudioConfigUpdateForm(BaseModel):
     stt: STTConfigForm
     stt: STTConfigForm
 
 
 
 
+from pydub import AudioSegment
+from pydub.utils import mediainfo
+
+
+def is_mp4_audio(file_path):
+    """Check if the given file is an MP4 audio file."""
+    if not os.path.isfile(file_path):
+        print(f"File not found: {file_path}")
+        return False
+
+    info = mediainfo(file_path)
+    if (
+        info.get("codec_name") == "aac"
+        and info.get("codec_type") == "audio"
+        and info.get("codec_tag_string") == "mp4a"
+    ):
+        return True
+    return False
+
+
+def convert_mp4_to_wav(file_path, output_path):
+    """Convert MP4 audio file to WAV format."""
+    audio = AudioSegment.from_file(file_path, format="mp4")
+    audio.export(output_path, format="wav")
+    print(f"Converted {file_path} to {output_path}")
+
+
 @app.get("/config")
 @app.get("/config")
 async def get_audio_config(user=Depends(get_admin_user)):
 async def get_audio_config(user=Depends(get_admin_user)):
     return {
     return {
@@ -235,6 +261,8 @@ def transcribe(
         os.makedirs(file_dir, exist_ok=True)
         os.makedirs(file_dir, exist_ok=True)
         file_path = f"{file_dir}/{filename}"
         file_path = f"{file_dir}/{filename}"
 
 
+        print(filename)
+
         contents = file.file.read()
         contents = file.file.read()
         with open(file_path, "wb") as f:
         with open(file_path, "wb") as f:
             f.write(contents)
             f.write(contents)
@@ -268,23 +296,31 @@ def transcribe(
 
 
             transcript = "".join([segment.text for segment in list(segments)])
             transcript = "".join([segment.text for segment in list(segments)])
 
 
+            data = {"text": transcript.strip()}
+
             # save the transcript to a json file
             # save the transcript to a json file
             transcript_file = f"{file_dir}/{id}.json"
             transcript_file = f"{file_dir}/{id}.json"
             with open(transcript_file, "w") as f:
             with open(transcript_file, "w") as f:
-                json.dump({"transcript": transcript}, f)
-
-            data = {"text": transcript.strip()}
+                json.dump(data, f)
 
 
             print(data)
             print(data)
 
 
             return data
             return data
 
 
         elif app.state.config.STT_ENGINE == "openai":
         elif app.state.config.STT_ENGINE == "openai":
+            if is_mp4_audio(file_path):
+                print("is_mp4_audio")
+                os.rename(file_path, file_path.replace(".wav", ".mp4"))
+                # Convert MP4 audio file to WAV format
+                convert_mp4_to_wav(file_path.replace(".wav", ".mp4"), file_path)
+
             headers = {"Authorization": f"Bearer {app.state.config.STT_OPENAI_API_KEY}"}
             headers = {"Authorization": f"Bearer {app.state.config.STT_OPENAI_API_KEY}"}
 
 
             files = {"file": (filename, open(file_path, "rb"))}
             files = {"file": (filename, open(file_path, "rb"))}
             data = {"model": "whisper-1"}
             data = {"model": "whisper-1"}
 
 
+            print(files, data)
+
             r = None
             r = None
             try:
             try:
                 r = requests.post(
                 r = requests.post(
@@ -297,6 +333,12 @@ def transcribe(
                 r.raise_for_status()
                 r.raise_for_status()
 
 
                 data = r.json()
                 data = r.json()
+
+                # save the transcript to a json file
+                transcript_file = f"{file_dir}/{id}.json"
+                with open(transcript_file, "w") as f:
+                    json.dump(data, f)
+
                 print(data)
                 print(data)
                 return data
                 return data
             except Exception as e:
             except Exception as e:

+ 1 - 0
backend/requirements.txt

@@ -59,3 +59,4 @@ youtube-transcript-api==0.6.2
 pytube==15.0.0
 pytube==15.0.0
 
 
 extract_msg
 extract_msg
+pydub