פתיחת שלוחות מרובות עם קבצי שמע / טקסט
-
@y6714453
תודה רבה
נעזרתי בזה וזה מצוין
אציין שהיה לי 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())
-
@NA73438
שמח לשמוע שזה עזר...
קיבלתי את ההערות- אני אבדוק למה באמת זה לא מוריד
- באמת צריך לשנות את זה תודה.
אגב אם אתה רוצה לעשות טקסט שיופיע כמו קוד אתה צריך להוריד שורה לפני ואחרי - (אני רואה שבחלק הצלחת ובחלק לא...) -
פוסט זה נמחק! -
@y6714453
תוכל לעזור לי להריץ את הקוד? -
@אA עכשיו תצטרך בטח לעשות את כל האימות החדש
-
@עידו
דהיינו?
איפה אני יכול לעדכן?
אין פה שלוחה. -
@אA https://f2.freeivr.co.il/topic/18488/אבטחה-באימות-דו-שלבי-דעתכם/347
ברגע שאתה ניגש לAPI תצטרך לעבור אימות דו שלבי (אם הופעל אצלך במערכת)
-
@עידו
הבנתי.
אני רק שואל במקרה דנן איפה אני מעדכן את הטוקן? -
@אA טוקן לא יועיל, צריך את המהלך של הlogin
-
@עידו
אוקי.
תודה. -
-
@y6714453
תודה רבה.