9 Commits 58cc6cecf6 ... 6ae7ccd08e

Author SHA1 Message Date
  SherryLiu 6ae7ccd08e Rename READNE.md to README.md 4 months ago
  SherryLiu 4171ad03da Merge branch 'main' of http://git.choozmo.com:3000/sherry/ASR 4 months ago
  SherryLiu ce79ae2cd5 rename readme 4 months ago
  SherryLiu 63aacf68c9 update README 4 months ago
  SherryLiu 44f4860e9c update readme 4 months ago
  SherryLiu fed1681308 added tone 4 months ago
  SherryLiu 2daf12682d wip 4 months ago
  SherryLiu 50e3407e89 clean up requirements.txt 4 months ago
  SherryLiu 1022f3c5a8 finished 4 months ago
5 changed files with 122 additions and 0 deletions
  1. 22 0
      MYNOTE.md
  2. 0 0
      README.md
  3. 5 0
      environment.env
  4. 6 0
      error_correction.py
  5. 89 0
      whisper_simple.py

+ 22 - 0
MYNOTE.md

@@ -0,0 +1,22 @@
+## Whisper Official doc
+https://platform.openai.com/docs/guides/speech-to-text/prompting
+
+## 問題
+語音轉文字,諧音字詞判斷錯誤
+
+## 方法邏輯
+
+1. 用語意校正
+- prompt
+- gpt-4o (後處理)
+
+2. 用語音校正
+- 發音越相近,編碼約相近。計算相似度距離
+
+3. 其他後處理
+- 在jieba斷詞後以自定義字典抓出專有名詞。
+- hard code校正幾個比較困難的詞
+
+## 嘗試
+- 加上自定義字典(從knowledge graph提取出來的詞)做斷詞:沒有比較好,發現過度矯正的問題。output.txt 為jieba斷詞字典的結果,蠻正確的
+- 加上聲調:有改進

+ 0 - 0
READNE.md → README.md


+ 5 - 0
environment.env

@@ -0,0 +1,5 @@
+# Choozemo
+SUPABASE_URI = "postgresql://postgres:chuz8310xsystex@db.ptt.cx:5432/postgres"
+SUPABASE_URL = "http://db.ptt.cx:8000/"
+SUPABASE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q"
+OPENAI_API_KEY = "sk-proj-kGQPjKXup6g5QmjWvN3GT3BlbkFJDOYyhv8auoHBDIznmbgj"

+ 6 - 0
error_correction.py

@@ -0,0 +1,6 @@
+error_correction = {
+    "看拳": "碳權",
+    "看盤插": "碳盤查",
+    "盤插": "盤查",
+    "看":"碳"
+}

+ 89 - 0
whisper_simple.py

@@ -0,0 +1,89 @@
+# 供資策會課程使用
+import os
+import argparse
+from openai import OpenAI
+from dotenv import load_dotenv
+
+load_dotenv('environment.env')
+client = OpenAI()
+
+system_prompt = """你是一位專業的轉錄校對助理,專門處理有關溫室氣體、碳排放和碳管理的對話轉錄。
+你的任務是:
+1. 確保以下專業術語的準確性:溫室氣體、碳排放、碳管理、碳盤查、碳權交易、碳足跡、淨零排放、碳權。
+2. 在必要時添加適當的標點符號,如句號、逗號,並使用正確的大小寫。
+3. 使用台灣的繁體中文,確保語言表達符合台灣的用語習慣。
+4. 只更正明顯的錯誤或改善可讀性,不要改變原文的意思或結構。
+5. 不要回答問題、解釋概念或添加任何不在原文中的信息。
+6. 如果原文是一個問句,保持它的問句形式,不要提供答案。
+
+請只根據提供的原文進行必要的更正,不要添加或刪除任何實質性內容。"""
+
+def transcribe(audio_file):
+    try:
+        transcript = client.audio.transcriptions.create(
+            file=audio_file,
+            model="whisper-1",
+            response_format="text"
+        )
+        return transcript
+    except Exception as e:
+        print(f"轉錄時發生錯誤:{str(e)}")
+        return None
+
+def post_process_transcript(transcript):
+    messages = [
+        {"role": "system", "content": system_prompt},
+        {"role": "user", "content": f"請校對並修正以下轉錄文本,但不要改變其原意或回答問題:\n\n{transcript}"}
+    ]
+
+    response = client.chat.completions.create(
+        model="gpt-3.5-turbo",
+        temperature=0,
+        messages=messages
+    )
+
+    return response.choices[0].message.content
+
+def process_audio_file(file_path):
+    try:
+        with open(file_path, "rb") as audio_file:
+            print(f"\n處理文件:{os.path.basename(file_path)}")
+            
+            raw_transcript = transcribe(audio_file)
+            if raw_transcript is None:
+                return
+
+            print("\n原始轉錄:")
+            print(raw_transcript)
+
+            corrected_transcript = post_process_transcript(raw_transcript)
+            print("\n修正後的轉錄:")
+            print(corrected_transcript)
+
+    except Exception as e:
+        print(f"處理文件 {os.path.basename(file_path)} 時發生錯誤:{str(e)}")
+
+def process_folder(folder_path):
+    processed_files = 0
+
+    for filename in os.listdir(folder_path):
+        if filename.endswith((".mp3", ".wav", ".m4a")):  
+            file_path = os.path.join(folder_path, filename)
+            process_audio_file(file_path)
+            processed_files += 1
+
+    print("\n=== 總結 ===")
+    print(f"處理的文件數:{processed_files}")
+
+def main():
+    parser = argparse.ArgumentParser(description="處理音頻文件使用 Whisper 和 GPT-3.5-turbo")
+    parser.add_argument("--folder", default="data", help="包含音頻文件的文件夾路徑(默認:data)")
+    args = parser.parse_args()
+
+    if os.path.isdir(args.folder):
+        process_folder(args.folder)
+    else:
+        print(f"錯誤:文件夾 '{args.folder}' 不存在。")
+
+if __name__ == "__main__":
+    main()