🎙️🎯 זיהוי דיבור בעברית – חינם, איכותי, מדויק!!
-
כמה מחשבות על מודל זיהוי דיבור...
הרבה פעמים בכל מיני מערכות - רוצים לשלב זיהוי דיבור, דהיינו שמשתמש יוכל לשלוח הקלטה לשרת והשרת יתמלל את ההקלטה.
ימות המשיח מציעים מודל כזה, והאמת שאף פעם לא ניסיתי אותו, כך שאני לא יודע מה רמת האיכות שלו...
אבל זה בעלות יחידות, ולהרבה משתמשים זה מספיק סיבה כדי לנסות למצוא אלטרנטיבה,
(וממילא הטקסט נשלח לשרת - אז למה שהשרת לא יבצע גם את התמלול בעצמו?!)יש שתי ספריות מוכרות וטובות לתמלול שמתאים לעברית,
אחד של גוגל - הספרייה
SpeechRecognition
ואחד של מייקרוסופט - הספרייהWhisper
ל Whisper יש ייתרון משמעותי - שאפשר להוריד למחשב ללא צורך בחיבור לאינטרנט, אבל בגלל שממילא רוב השימוש ממילא נעשה בדרך כלל בשרת וכדו' אז הייתרון לא כל כך משמעותי...
אמנם לאחר בדיקות ותעיות... הגעתי למסקנה שהמודל של גוגל, לא רואה את ההוא של מייקרוסופט...
חשוב לזכור שההקלטה בסוף מגיעה באיכות של טלפון... ולא של קונדנסר אולפני... ולכן חשוב שהמודל יידע לזהות את הדיבור גם בתנאים קשים כמו רעשי רקע, איכות ירודה, וכו'...
אני חושב שהמודל של גוגל הוא מדוייק ואיכותי כמעט ללא טעויות... והייתי ממליץ לכל מי שרוצה מערכת איכותית, להשתמש בו...
לא צריך מפתח API !
אני רוצה להוסיף המלצה מנסיון הרבה זמן השתמשתי עם זה ומשום מה ההתחלה והסוף של ההקלטה לא זוהה... למשל במקום "אחד שתיים שלוש ארבע" הוא זיהה "ד שתיים שלוש אר"- עד שהבנתי שהמודל אמנם הוא טוב אבל לפעמים התחלת ההקלטה וסוף ההקלטה נחתך (ממש במימדים של שנייה) ולכן אם רוצים לשלוח הקלטה ארוכה לשרת, למשל משפט שלם וכו' אז זה בדרך כלל לא כל כך בעיה...
אבל אם רוצים לשלוח מילה אחת וכדו' אז זה יכול להיות מאוד משמעותי.... לכן מומלץ (מנסיון! זה פותר את הבעייה!) להוסיף שנייה שקט בתחילת וסוף ההקלטה כלומר אחרי שהיא נשלחת לשרת, לפני שגוגל מעבד את ההקלטה ומחלץ את התמלול... - להשתמש עם הספרייהpydub
כדי להוסיף שנייה שקט תחילה וסוף...
(צריך לבדוק ש-FFmpeg
מותקן בסביבה, אחרת הספרייה לא תעבוד)עוד משהו...
לפעמים אנחנו יודעים מראש מה האפשרויות שהמשתמש יכול לומר –
למשל שמות של ערים:בני ברק, ירושלים, תל אביב, חיפה, אשדוד, וכו'...
אפשר לעשות שהקוד יזהה את הדיבור ויבצע התאמה
למשל אם המודל זיהה "ירושמים" אז הוא יתאים לירושלים...אני מצרף פה קוד פייתון לדוגמא:
אולי צריך עוד כמה שינויים כדי שיתאים לימות המשיח...import os import tempfile import logging import requests from flask import Flask, request, jsonify from pydub import AudioSegment import speech_recognition as sr from rapidfuzz import process, fuzz # ------------------ Logging Configuration ------------------ logging.basicConfig( level=logging.INFO, format="%(asctime)s | %(levelname)s | %(message)s", datefmt="%H:%M:%S" ) app = Flask(__name__) # List of possible keywords to match KEYWORDS = ["בני ברק", "ירושלים", "תל אביב", "חיפה", "אשדוד"] # ------------------ Helper Functions ------------------ def add_silence(input_path: str) -> AudioSegment: """ Add one second of silence at the beginning and end of the audio file. This improves speech recognition accuracy, especially for short recordings. """ logging.info("Adding one second of silence to audio file...") audio = AudioSegment.from_file(input_path, format="wav") silence = AudioSegment.silent(duration=1000) # 1000ms = 1 second return silence + audio + silence def recognize_speech(audio_segment: AudioSegment) -> str: """ Perform speech recognition using Google SpeechRecognition API. """ recognizer = sr.Recognizer() try: # Use a temporary file for SpeechRecognition to read with tempfile.NamedTemporaryFile(suffix=".wav", delete=True) as temp_wav: audio_segment.export(temp_wav.name, format="wav") with sr.AudioFile(temp_wav.name) as source: data = recognizer.record(source) text = recognizer.recognize_google(data, language="he-IL") logging.info(f"Recognized text: {text}") return text except sr.UnknownValueError: logging.warning("Speech not detected or unclear.") return "" except Exception as e: logging.error(f"Error during speech recognition: {e}") return "" def find_best_match(text: str) -> str | None: """ Find the closest matching word from the predefined KEYWORDS list. """ if not text: return None result = process.extractOne(text, KEYWORDS, scorer=fuzz.ratio) if result and result[1] >= 80: logging.info(f"Best match found: {result[0]} (confidence: {result[1]}%)") return result[0] logging.info("No sufficient match found.") return None # ------------------ API Endpoint ------------------ @app.route("/upload_audio", methods=["GET"]) def upload_audio(): """ Endpoint to receive an audio file via GET parameter, download it, process it, and return the recognized text with the best match. Example usage: /upload_audio?file_url=https://example.com/audio.wav """ file_url = request.args.get("file_url") if not file_url: logging.error("Missing 'file_url' parameter.") return jsonify({"error": "Missing 'file_url' parameter"}), 400 logging.info(f"Received file URL: {file_url}") try: # Step 1: Download the audio file response = requests.get(file_url, timeout=15) if response.status_code != 200: logging.error(f"Failed to download audio file. Status code: {response.status_code}") return jsonify({"error": "Failed to download audio file"}), 400 with tempfile.NamedTemporaryFile(suffix=".wav", delete=True) as temp_input: temp_input.write(response.content) temp_input.flush() logging.info(f"Audio downloaded and saved temporarily: {temp_input.name}") # Step 2: Add silence processed_audio = add_silence(temp_input.name) # Step 3: Speech recognition recognized_text = recognize_speech(processed_audio) # Step 4: Matching against predefined keywords matched_word = find_best_match(recognized_text) if matched_word: logging.info(f"Final matched keyword: {matched_word}") else: logging.info("No keyword match found.") except Exception as e: logging.error(f"Processing error: {e}") return jsonify({"error": "Error processing the audio file"}), 500 return jsonify({ "recognized_text": recognized_text, "matched_word": matched_word if matched_word else "No match found" }) # ------------------ Run Server ------------------ if __name__ == "__main__": port = int(os.environ.get("PORT", 5000)) logging.info(f"Server running on port {port}") app.run(host="0.0.0.0", port=port)
מקווה שהייתי ברור...
בכל מקרה גם מי שלא הבין שלפחות יידע שיש אופציה כזו, כדאי לנסות!
בהצלחה! -
@y6714453 כתב ב
️
זיהוי דיבור בעברית – חינם, איכותי, מדויק!!:
לא צריך מפתח API !
יותר נכון, צריך מפתח, אבל יש מפתח שמסתובב בעולם (היה במקור לדעתי בגוגל כרום, יש אחד דומה לפיירפוקס), והוא מוטמע בספריה
-
@MGM-IVR ובכל זאת הכוונה הייתה שלא צריך להכניס ידנית
-
@y6714453
איך מקבלים את ההקלטה בקלות לשרת? -
@לעזור-לכולם הורדת קובץ..
-
@CUBASE
אז זה תהליך קצת
לקבל מימות המשיח את שם ההקלטה ואז להוריד ולשלוח לגוגל ואז לקבל חזרה