• הרשמה
    • התחברות
    • חיפוש
    • דף הבית
    • אינדקס קישורים
    • פוסטים אחרונים
    • קבלת התראות מהדפדפן
    • משתמשים
    • חיפוש בהגדרות המתקדמות
    • חיפוש גוגל בפורום
    • ניהול המערכת
    • ניהול המערכת - שרת private

    🎙️🎯 זיהוי דיבור בעברית – חינם, איכותי, מדויק!!

    עזרה הדדית למשתמשים מתקדמים
    8
    32
    488
    טוען פוסטים נוספים
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
    תגובה
    • הגיבו כנושא
    התחברו בכדי לפרסם תגובה
    נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
    • Y
      y6714453 נערך לאחרונה על ידי y6714453

      כמה מחשבות על מודל זיהוי דיבור...

      הרבה פעמים בכל מיני מערכות - רוצים לשלב זיהוי דיבור, דהיינו שמשתמש יוכל לשלוח הקלטה לשרת והשרת יתמלל את ההקלטה.
      ימות המשיח מציעים מודל כזה, והאמת שאף פעם לא ניסיתי אותו, כך שאני לא יודע מה רמת האיכות שלו...
      אבל זה בעלות יחידות, ולהרבה משתמשים זה מספיק סיבה כדי לנסות למצוא אלטרנטיבה,
      (וממילא הטקסט נשלח לשרת - אז למה שהשרת לא יבצע גם את התמלול בעצמו?!)

      יש שתי ספריות מוכרות וטובות לתמלול שמתאים לעברית,

      אחד של גוגל - הספרייה 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)
      

      מקווה שהייתי ברור...
      בכל מקרה גם מי שלא הבין שלפחות יידע שיש אופציה כזו, כדאי לנסות! 😛
      בהצלחה!

      M ל 2 תגובות תגובה אחרונה תגובה ציטוט 11
      • M
        MGM IVR @y6714453 נערך לאחרונה על ידי

        @y6714453 כתב ב🎙️🎯 זיהוי דיבור בעברית – חינם, איכותי, מדויק!!:

        לא צריך מפתח API !

        יותר נכון, צריך מפתח, אבל יש מפתח שמסתובב בעולם (היה במקור לדעתי בגוגל כרום, יש אחד דומה לפיירפוקס), והוא מוטמע בספריה

        Y תגובה 1 תגובה אחרונה תגובה ציטוט 0
        • Y
          y6714453 @MGM IVR נערך לאחרונה על ידי y6714453

          @MGM-IVR ובכל זאת הכוונה הייתה שלא צריך להכניס ידנית

          תגובה 1 תגובה אחרונה תגובה ציטוט 2
          • ל
            לעזור לכולם @y6714453 נערך לאחרונה על ידי

            @y6714453
            איך מקבלים את ההקלטה בקלות לשרת?

            C תגובה 1 תגובה אחרונה תגובה ציטוט 0
            • C
              CUBASE @לעזור לכולם נערך לאחרונה על ידי

              @לעזור-לכולם הורדת קובץ..

              ל תגובה 1 תגובה אחרונה תגובה ציטוט 0
              • ל
                לעזור לכולם @CUBASE נערך לאחרונה על ידי

                @CUBASE
                אז זה תהליך קצת
                לקבל מימות המשיח את שם ההקלטה ואז להוריד ולשלוח לגוגל ואז לקבל חזרה

                Y תגובה 1 תגובה אחרונה תגובה ציטוט 0
                • Y
                  y6714453 @לעזור לכולם נערך לאחרונה על ידי

                  @לעזור-לכולם

                  איך מקבלים את ההקלטה בקלות לשרת?

                  שלוחת API עם הגדרות משהו כמו זה:

                  type=api
                  api_link=https://
                  api_000=stockname,no,record,/9,,no,yes
                  
                  פ תגובה 1 תגובה אחרונה תגובה ציטוט 1
                  • פ
                    פלוס @y6714453 נערך לאחרונה על ידי

                    @y6714453
                    אשמח ליצור איתך קשר בנושא!

                    Y תגובה 1 תגובה אחרונה תגובה ציטוט 0
                    • Y
                      y6714453 @פלוס נערך לאחרונה על ידי

                      @פלוס כתב ב🎙️🎯 זיהוי דיבור בעברית – חינם, איכותי, מדויק!!:

                      @y6714453
                      אשמח ליצור איתך קשר בנושא!

                      y6714453@gmail.com

                      תגובה 1 תגובה אחרונה תגובה ציטוט 1
                      • הוזכר על-ידי  Y y6714453 
                      • י
                        יעקב 1 נערך לאחרונה על ידי

                        אשמח לעזרה. עשיתי את הקוד הזה ברנדר.
                        מה אמור להיות מוגדר בשלוחה של הזיהוי דיבור? (זה קוד שאמור לשלוח אלי את המרת הדיבור של המאזין

                        import os
                        import tempfile
                        import logging
                        import requests
                        from flask import Flask, request, jsonify
                        from pydub import AudioSegment
                        import speech_recognition as sr
                        
                        # ------------------ Logging ------------------
                        logging.basicConfig(
                            level=logging.INFO,
                            format="%(asctime)s | %(levelname)s | %(message)s",
                            datefmt="%H:%M:%S"
                        )
                        
                        app = Flask(__name__)
                        
                        # ------------------ Telegram Config ------------------
                        
                        TELEGRAM_BOT_TOKEN = "***"
                        TELEGRAM_CHAT_ID = "***"
                        
                        # ------------------ Helper Functions ------------------
                        
                        def add_silence(input_path: str) -> AudioSegment:
                            audio = AudioSegment.from_file(input_path, format="wav")
                            silence = AudioSegment.silent(duration=1000)
                            return silence + audio + silence
                        
                        def recognize_speech(audio_segment: AudioSegment) -> str:
                            recognizer = sr.Recognizer()
                            try:
                                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:
                                return ""
                            except Exception as e:
                                logging.error(f"Speech recognition error: {e}")
                                return ""
                        
                        def send_to_telegram(text: str, file_url: str):
                            message = f"🎙️ הודעה חדשה מהמערכת:\n\n{text}\n\n🔗 קובץ ההקלטה:\n{file_url}"
                            url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
                            requests.post(url, data={"chat_id": TELEGRAM_CHAT_ID, "text": message})
                        
                        # ------------------ API Endpoint ------------------
                        
                        @app.route("/upload_audio", methods=["GET"])
                        def upload_audio():
                            file_url = request.args.get("file_url")
                            if not file_url:
                                return jsonify({"error": "Missing 'file_url' parameter"}), 400
                        
                            logging.info(f"Downloading audio from: {file_url}")
                            try:
                                response = requests.get(file_url, timeout=15)
                                if response.status_code != 200:
                                    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()
                        
                                    processed_audio = add_silence(temp_input.name)
                                    recognized_text = recognize_speech(processed_audio)
                        
                                    if recognized_text:
                                        send_to_telegram(recognized_text, file_url)
                                        return jsonify({"recognized_text": recognized_text})
                                    else:
                                        send_to_telegram(" לא זוהה דיבור.", file_url)
                                        return jsonify({"recognized_text": ""})
                        
                            except Exception as e:
                                logging.error(f"Error: {e}")
                                return jsonify({"error": str(e)}), 500
                        
                        # ------------------ Run ------------------
                        if __name__ == "__main__":
                            port = int(os.environ.get("PORT", 5000))
                            app.run(host="0.0.0.0", port=port)
                        
                        Y תגובה 1 תגובה אחרונה תגובה ציטוט 0
                        • Y
                          y6714453 @יעקב 1 נערך לאחרונה על ידי

                          @יעקב-1
                          בשלוחה אתה צריך להגדיר שישלח את ההקלטה לשרת
                          לכן תגדיר כך

                          type=api
                          api_link=שים את הלינק של השרת
                          
                          api_000=stockname,no,record,/9,,no,yes
                          
                          ביטול השליחה בניתוק (מומלץ)
                          api_hangup_send=no
                          
                          מעבר בסיום
                          api_end_goto=/שים את הנתיב למעבר
                          

                          ואל תשכח להעלות קובץ שמע בשם 000 לשלוחה שאומר משהו כמו "אנא הקלט את הודעתך, ובסיום הקש סולמית"

                          י תגובה 1 תגובה אחרונה תגובה ציטוט 0
                          • י
                            יעקב 1 @y6714453 נערך לאחרונה על ידי יעקב 1

                            @y6714453 תודה!

                            Y C 2 תגובות תגובה אחרונה תגובה ציטוט 0
                            • Y
                              y6714453 @יעקב 1 נערך לאחרונה על ידי y6714453

                              @יעקב-1
                              בשביל למנוע שגיאה - תחליף בהגדרות השלוחה במקום

                              api_000=stockname,no,record,/9,,no,yes
                              

                              את זה:

                              api_000=file_url,no,record,/9,,no,yes
                              

                              בגלל שבקוד - הוא מחפש פרמטר בשם file_url

                              לפי השורה הזאת בקוד

                                  file_url = request.args.get("file_url")
                              

                              י תגובה 1 תגובה אחרונה תגובה ציטוט 0
                              • C
                                CUBASE @יעקב 1 נערך לאחרונה על ידי

                                @יעקב-1 הצלחת להתקין ffmpeg על Render בלי שהוא קרס בתהליך הבנייה??

                                י Y 2 תגובות תגובה אחרונה תגובה ציטוט 0
                                • י
                                  יעקב 1 @CUBASE נערך לאחרונה על ידי

                                  @CUBASE כתב ב🎙️🎯 זיהוי דיבור בעברית – חינם, איכותי, מדויק!!:

                                  ffmpeg

                                  לא קרס

                                  תגובה 1 תגובה אחרונה תגובה ציטוט 0
                                  • י
                                    יעקב 1 @y6714453 נערך לאחרונה על ידי

                                    @y6714453 יש לי באמת שגיאות בגלל נתיב שגוי
                                    מה זה ה9 בשורה הזאת?
                                    api_000=file_url,no,record,/9,,no,yes

                                    Y תגובה 1 תגובה אחרונה תגובה ציטוט 0
                                    • Y
                                      y6714453 @יעקב 1 נערך לאחרונה על ידי y6714453

                                      @יעקב-1
                                      איפה ההקלטה נשמרת
                                      ציטוט מהאשכול של המודול:

                                      הערך הרביעי (הקלטה)
                                      בערך זה ניתן להגדיר היכן תישמר ההקלטה במערכת
                                      ברירת מחדל זה נשמר בתיקייה שמוגדרת ב-api_dir
                                      ניתן להגדיר מיקום שונה
                                      לדוגמה
                                      /8 (סלש שמונה)
                                      במקרה כזה ההקלטה תישמר בשלוחה 8
                                      הערה: חובה לשים / בהתחלה. אסור לשים / בסוף

                                      י תגובה 1 תגובה אחרונה תגובה ציטוט 1
                                      • Y
                                        y6714453 @CUBASE נערך לאחרונה על ידי

                                        @CUBASE כתב ב🎙️🎯 זיהוי דיבור בעברית – חינם, איכותי, מדויק!!:

                                        @יעקב-1 הצלחת להתקין ffmpeg על Render בלי שהוא קרס בתהליך הבנייה??

                                        למה שיקרוס? זה נחשב ספריה כבדה, או לא נתמכת??

                                        C תגובה 1 תגובה אחרונה תגובה ציטוט 0
                                        • י
                                          יעקב 1 @y6714453 נערך לאחרונה על ידי

                                          @y6714453 אמורה להיות רשומה שם השלוחה שבה ההקלטה תישמר או שממנה יקח את ההקלטה להמרה? הוא כל הזמן מחזיר שגיאה שלא מוצא את הנתיב 6&file_url=/9/000.wav

                                          Y תגובה 1 תגובה אחרונה תגובה ציטוט 0
                                          • Y
                                            y6714453 @יעקב 1 נערך לאחרונה על ידי y6714453

                                            @יעקב-1 כתב ב🎙️🎯 זיהוי דיבור בעברית – חינם, איכותי, מדויק!!:

                                            @y6714453 אמורה להיות רשומה שם השלוחה שבה ההקלטה תישמר או שממנה יקח את ההקלטה להמרה? הוא כל הזמן מחזיר שגיאה שלא מוצא את הנתיב 6&file_url=/9/000.wav

                                            השלוחה שבה ההקלטה תישמר - בלי קשר למה שהשרת מקבל, (אתה יכול גם להשאיר את הערך ריק ואז ההקלטה תישמר בתיקייה api_dir).
                                            זה לא הסיבה לשגיאה.

                                            תעלה פה את השגיאה שאתה מקבל

                                            י תגובה 1 תגובה אחרונה תגובה ציטוט 0
                                            • פוסט ראשון
                                              פוסט אחרון