תקחו בחשבון שזה לא גרוע כמו שזה נראה כי אז כל העברת שיחה מחוץ למערכת לא אמור לעלות יחידות
כך שמי שיש לו מערכת של מרכזיה בד"כ יהיה שווה לו לשלם סכום קבוע על הקו מאשר לפי דקות
הפוסטים הטובים ביותר שנוצרו על ידי NA73438
-
RE: האם הקוים נסגרים לאחר הורדת דמי הקישוריות?
-
שדור מענה למחייג רק כשהמוקדן עונה
האופציה של שדור מענה למחייג רק כשהמוקדן עונה במודול ראוטניג לא עובדת
-
RE: האם הקוים נסגרים לאחר הורדת דמי הקישוריות?
@פיסטוק-פרווה
אתה צודק שימות ימשיכו לגבות כסף
אבל מבחינתם לא תהיה את ההואאה הזאת כך שבמכלול הנתונים עדיין יהיה שווה להם להחזיק את המערכות
כי בכל זאת הם פיתחו מערכות חכמות להעברת שיחות שאנשים יצו להשתמש בהם ולהם לא יהיה כמעט הוצאות עליהם
מה שכם יכול להיות שתהיה תחרות בשוק הכללי של המרכזיות כי לא יהיה להם הוצאות על דקותוכמובן אי אפשר לשכוח את כל תעשיית המבזקים שרק תפרח ותשגשג למורת לב ההמונים....
-
RE: קבלת SMS למערכת במספר נייח , אפשרי?
@צדיק-תמים
אני מדבר על מספר נייח שכבר נמצא אצל ימות
האם אני יכול לראות אסמסים שנשלחו אליו
פוסטים אחרונים שנוצרו על ידי NA73438
-
RE: המרת טקסט לדיבור מטורפת!!!! ב ח י נ ם!!!!!
@CUBASE
ואז איך שולחים את זה?
באופציות של הפעלת קמפיין- הגדרות הTSS הם להשתמש בשרות של ימות אין שם מקום לשלב את הAPI של ג'מיני -
RE: המרת טקסט לדיבור מטורפת!!!! ב ח י נ ם!!!!!
מה הדרך לשלב את היכולת הזאת בתוך ימות עצמם לדוגמה
אני רוצה לשלוח קמפיין גדול שכל אחד מקבל הודעה אישית עבורו- הקמפיין מופעל בAPI
איך אפשר לעשות שהוא ישמיע את ההודעה מהקריינות המצוינת הזאת? -
RE: שליחת כמות גדולה של הודעות בAPI כשכל מספר צריך לקבל הודעה אחרת
@צדיק-תמים
מה זה אומר על בסיס תבנית קיימת?
אני לא מעוניין שיהיה תבנית כי כל אחד מקבל בצורה חד פעמית הודעה אישית מותאמת
עוד שאלה
איך השרת של ימות מתנהג כשהוא מקבל קריאה ענקית עם המון מספרים ותוכן
אם אחד מהם לדוגמה נתקע זה יתקע הכל או שהוא יכול לעבור את זה בלי בעיה -
שליחת כמות גדולה של הודעות בAPI כשכל מספר צריך לקבל הודעה אחרת
אני צריך לבצע שליחה של כמות גדולה של מספרים
יש לי שרת שנותן לי פלט של מספר טלפון והודעה
אני רוצה שכל אחד יקבל את הדעה שלו ויהיה קמפיין משולב SMS למי שמקבל והודעה קולית למספר כשר
מה הדרך הכי טובה לעשות את זה?
מהתיעוד שאני ראיתי זה רק הפעלת קמפיין קיים שיש בו הודעה קבועה אבל כאן כל אחד צריך לקבל הודעה מותאמת עבורו כמו שהשרת שולח
אשמח לעזרתכם -
RE: פתיחת שלוחות מרובות עם קבצי שמע / טקסט
@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())
-
RE: משחק קליקרים
עשיתי גם בחויה בקליק וגם בטריקס
נהנתי יותר מחויה בקליק
יש להם גם שירות מהמם במייל ובטלפון
מבחינת המחיר נראה לי שהם גם יותר זולים-אבל זה תלוי בעיקר במספר המשתתפים -
RE: האם הקוים נסגרים לאחר הורדת דמי הקישוריות?
@פיסטוק-פרווה
אתה צודק שימות ימשיכו לגבות כסף
אבל מבחינתם לא תהיה את ההואאה הזאת כך שבמכלול הנתונים עדיין יהיה שווה להם להחזיק את המערכות
כי בכל זאת הם פיתחו מערכות חכמות להעברת שיחות שאנשים יצו להשתמש בהם ולהם לא יהיה כמעט הוצאות עליהם
מה שכם יכול להיות שתהיה תחרות בשוק הכללי של המרכזיות כי לא יהיה להם הוצאות על דקותוכמובן אי אפשר לשכוח את כל תעשיית המבזקים שרק תפרח ותשגשג למורת לב ההמונים....
-
RE: האם הקוים נסגרים לאחר הורדת דמי הקישוריות?
תקחו בחשבון שזה לא גרוע כמו שזה נראה כי אז כל העברת שיחה מחוץ למערכת לא אמור לעלות יחידות
כך שמי שיש לו מערכת של מרכזיה בד"כ יהיה שווה לו לשלם סכום קבוע על הקו מאשר לפי דקות