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

    פתיחת שלוחות מרובות עם קבצי שמע / טקסט

    טיפים עצות והדגמות מהמשתמשים
    5
    13
    232
    טוען פוסטים נוספים
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
    תגובה
    • הגיבו כנושא
    התחברו בכדי לפרסם תגובה
    נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
    • N
      NA73438 @y6714453 נערך לאחרונה על ידי NA73438

      @y6714453
      תודה רבה
      נעזרתי בזה וזה מצוין
      אציין שהיה לי 2 תקלות וסידרתי את זה (בעזרתו של ג'מיני)

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

      חוץ מזה שדרגתי את הסקריפט שיעלה קבצי סאונד מוכנים וגם יקבע מה יהיה השם שלהם במערכת
      מצרף

      
      import pandas as pd
      import requests
      from requests_toolbelt.multipart.encoder import MultipartEncoder
      import os
      import asyncio
      import edge_tts
      import subprocess
      import json
      import urllib.request
      import zipfile
      import shutil
      import warnings
      
      warnings.filterwarnings("ignore")
      
      DEFAULT_TTS_VOICE = "he-IL-AvriNeural"
      FFMPEG_EXECUTABLE = None
      
      def read_excel_data(excel_file_path):
          print(f"📖 קורא קובץ אקסל: {excel_file_path}")
          try:
              df = pd.read_excel(excel_file_path, header=None)
              username = str(df.iloc[0, 1]).strip()
              password = str(df.iloc[1, 1]).strip()
              
              if not username:
                  print("❌ שגיאה: אנא הכנס מספר מערכת (תא B1 באקסל).")
                  return None, None, None
              if not password:
                  print("❌ שגיאה: אנא הכנס סיסמא (תא B2 באקסל).")
                  return None, None, None
      
              extensions = df.iloc[5:, [0, 1, 2, 3, 4]].dropna(how='all')
              extensions.columns = ['נתיב', 'הגדרה', 'שם השלוחה', 'קובץ שמע להעלאה', 'קובץ טקסט להעלאה']
              
              extensions = extensions.apply(lambda x: x.astype(str).str.strip().replace('nan', '') if x.dtype == 'object' else x)
      
              print(f"✔️ נקראו בהצלחה: משתמש={username}, סיסמה={'*' * len(password)}")
              return username, password, extensions.to_dict('records')
          except FileNotFoundError:
              print(f"❌ שגיאה: קובץ האקסל '{excel_file_path}' לא נמצא. ודא שהוא באותה תיקייה כמו הסקריפט.")
              return None, None, None
          except Exception as e:
              print(f"❌ שגיאה בקריאת קובץ האקסל: {e}")
              return None, None, None
      
      def create_ext_ini_file(extension_type, extension_name, output_file_name, is_subpath=False, direct_ini_content=None):
          # פונקציה זו נשארת ללא שינוי
          content = ""
          if direct_ini_content:
              content = direct_ini_content.strip() + '\n'
          elif is_subpath:
              content = "type=menu\n"
          # ... (שאר הקוד של הפונקציה זהה)
          try:
              with open(output_file_name, 'w', encoding='utf-8') as f:
                  f.write(content)
              return True
          except Exception:
              return False
      
      
      async def create_and_convert_audio_file(text, output_wav_name):
          # פונקציה זו נשארת ללא שינוי
          output_mp3_temp = f"temp_{os.path.splitext(output_wav_name)[0]}.mp3"
          print(f"🔊 יוצר קובץ שמע {output_wav_name} מטקסט: '{text}'")
          global FFMPEG_EXECUTABLE
          if not FFMPEG_EXECUTABLE or not os.path.exists(FFMPEG_EXECUTABLE):
              ensure_ffmpeg() 
              if not FFMPEG_EXECUTABLE or not os.path.exists(FFMPEG_EXECUTABLE):
                  return False
          # ... (שאר הקוד של הפונקציה זהה)
          try:
              comm = edge_tts.Communicate(text, voice=DEFAULT_TTS_VOICE)
              await comm.save(output_mp3_temp)
              subprocess.run(
                  [FFMPEG_EXECUTABLE, "-loglevel", "error", "-y", "-i", output_mp3_temp, "-ar", "8000", "-ac", "1", "-acodec", "pcm_s16le", output_wav_name],
                  check=True
              )
              return True
          except Exception:
              return False
          finally:
              if os.path.exists(output_mp3_temp):
                  os.remove(output_mp3_temp)
      
      def upload_file_to_yemot(file_path, yemot_full_path, username, password):
          # פונקציה זו נשארת ללא שינוי
          token = f"{username}:{password}"
          content_type = 'application/octet-stream'
          if file_path.lower().endswith('.wav'): content_type = 'audio/wav'
          if file_path.lower().endswith('.ini'): content_type = 'text/plain'
          
          try:
              with open(file_path, 'rb') as f_read:
                  m = MultipartEncoder(fields={
                      "token": token, "path": yemot_full_path,
                      "upload": (os.path.basename(yemot_full_path), f_read, content_type) # שינוי קטן לשם הקובץ בשרת
                  })
                  print(f"⬆️ מעלה קובץ '{os.path.basename(file_path)}' לנתיב: '{yemot_full_path}'")
                  r = requests.post("https://www.call2all.co.il/ym/api/UploadFile", data=m, headers={'Content-Type': m.content_type})
                  r.raise_for_status()
                  print(f"✔️ הקובץ הועלה בהצלחה")
                  return True
          except Exception as e:
              print(f"❌ שגיאה בהעלאת קובץ {os.path.basename(file_path)}: {e}")
              return False
      
      def generate_subpaths(full_path):
          # פונקציה זו נשארת ללא שינוי
          parts = [p for p in full_path.split('/') if p]
          subpaths = []
          current_path_parts = []
          for part in parts[:-1]:
              current_path_parts.append(part)
              subpaths.append('/'.join(current_path_parts))
          return subpaths
      
      def ensure_ffmpeg():
          # פונקציה זו נשארת ללא שינוי
          global FFMPEG_EXECUTABLE
          local_ffmpeg_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "bin", "ffmpeg.exe")
          if os.path.exists(local_ffmpeg_path):
              FFMPEG_EXECUTABLE = local_ffmpeg_path
              return
          print("❌ FFmpeg לא נמצא בתיקיית 'bin'. יצירת שמע מטקסט לא תתאפשר.")
          FFMPEG_EXECUTABLE = None
          
      async def main():
          print("🚀 מתחיל תהליך יצירת והעלאת שלוחות...")
          script_dir = os.path.dirname(os.path.abspath(__file__))
          excel_file = os.path.join(script_dir, "משני.xlsx")
      
          if not os.path.exists(excel_file):
              print(f"❌ קובץ האקסל '{excel_file}' לא נמצא!")
              return
      
          username, password, extensions_data = read_excel_data(excel_file)
          if not username or not password or not extensions_data:
              return
      
          all_defined_paths = {ext.get('נתיב', '').strip() for ext in extensions_data if ext.get('נתיב')}
      
          for ext in extensions_data:
              path = ext.get('נתיב', '').strip()
              extension_type = ext.get('הגדרה', '').strip()
              audio_content = ext.get('קובץ שמע להעלאה', '').strip()
      
              if not path: continue
              
              print(f"\n📋 מעבד שלוחה: {ext.get('שם השלוחה', 'ללא שם')} ({path})")
      
              # לוגיקת יצירת תיקיות ביניים ו-ext.ini נשארת זהה...
              # ...
              if extension_type:
                  main_ini_file = "ext_temp_main.ini"
                  if create_ext_ini_file(None, None, main_ini_file, direct_ini_content=extension_type):
                      upload_file_to_yemot(main_ini_file, f"ivr2:/{path}/ext.ini", username, password)
                      os.remove(main_ini_file)
      
              # --- ⭐ התיקון המרכזי נמצא כאן ⭐ ---
              if audio_content:
                  source_filename = audio_content
                  dest_filename = ""
      
                  # בדיקה אם יש הגדרת שם מותאם
                  if '>' in audio_content:
                      parts = audio_content.split('>', 1)
                      source_filename = parts[0].strip()
                      dest_filename = parts[1].strip()
                  
                  local_audio_path = os.path.join(script_dir, source_filename)
      
                  # עדיפות 1: בדיקת קובץ מקומי
                  if os.path.exists(local_audio_path):
                      # אם לא הוגדר שם יעד, השתמש בשם המקורי
                      if not dest_filename:
                          dest_filename = os.path.basename(local_audio_path)
                      
                      audio_yemot_path = f"ivr2:/{path}/{dest_filename}"
                      upload_file_to_yemot(local_audio_path, audio_yemot_path, username, password)
                  
                  # עדיפות 2: יצירת שמע מטקסט
                  else:
                      print(f"📄 לא נמצא קובץ מקומי '{source_filename}'. מנסה ליצור שמע מהטקסט...")
                      # אם לא הוגדר שם יעד, השתמש בשם ברירת מחדל
                      if not dest_filename:
                          dest_filename = "000.wav"
      
                      temp_tts_wav_file = "temp_tts_generated.wav"
                      
                      if await create_and_convert_audio_file(source_filename, temp_tts_wav_file):
                          audio_yemot_path = f"ivr2:/{path}/{dest_filename}"
                          upload_file_to_yemot(temp_tts_wav_file, audio_yemot_path, username, password)
                          if os.path.exists(temp_tts_wav_file):
                              os.remove(temp_tts_wav_file)
                      else:
                          print(f"⚠️ דילוג על העלאת קובץ שמע עקב שגיאה ביצירה.")
              # --- ⭐ סוף התיקון ⭐ ---
      
          print("\n✅ סיום עיבוד כל השלוחות בהצלחה!")
      
      if __name__ == "__main__":
          asyncio.run(main())
      
      
      Y תגובה 1 תגובה אחרונה תגובה ציטוט 0
      • Y
        y6714453 @NA73438 נערך לאחרונה על ידי

        @NA73438
        שמח לשמוע שזה עזר...
        קיבלתי את ההערות

        1. אני אבדוק למה באמת זה לא מוריד
        2. באמת צריך לשנות את זה תודה.

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

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

          פוסט זה נמחק!
          תגובה 1 תגובה אחרונה תגובה ציטוט 0
          • א
            אA @y6714453 נערך לאחרונה על ידי אA

            @y6714453
            תוכל לעזור לי להריץ את הקוד?

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

              @אA עכשיו תצטרך בטח לעשות את כל האימות החדש

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

                @עידו
                דהיינו?
                איפה אני יכול לעדכן?
                אין פה שלוחה.

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

                  @אA https://f2.freeivr.co.il/topic/18488/אבטחה-באימות-דו-שלבי-דעתכם/347

                  ברגע שאתה ניגש לAPI תצטרך לעבור אימות דו שלבי (אם הופעל אצלך במערכת)

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

                    @עידו
                    הבנתי.
                    אני רק שואל במקרה דנן איפה אני מעדכן את הטוקן?

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

                      @אA טוקן לא יועיל, צריך את המהלך של הlogin

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

                        @עידו
                        אוקי.
                        תודה.

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

                          @אA @עידו
                          צריך לעדכן את הסקריפט כדי שיעבוד עם הצורת התחברות החדשה
                          אולי אספיק מתישהו

                          בינתיים הוא אמור לעבוד
                          @אA איפה הסתבכת?

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

                            @y6714453
                            תודה רבה.

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