Advertisement
Salamino99

Untitled

Sep 30th, 2024
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.53 KB | None | 0 0
  1. import os
  2. import subprocess
  3. import speech_recognition as sr
  4. import yt_dlp
  5. import time
  6. import shutil
  7. import warnings
  8. import telebot
  9. from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton
  10. from concurrent.futures import ThreadPoolExecutor, as_completed
  11. import asyncio
  12. from sydney import SydneyClient
  13.  
  14. os.environ["BING_COOKIES"] = "_C_Auth=; MC1=GUID=c8331a83fd344f7b8dee6c5b3bb8f147&HASH=c833&LV=202409&V=4&LU=1726853449610; MUID=0ADAFB5A97046B5C0A4DEE5A965F6AF8; MUIDB=0ADAFB5A97046B5C0A4DEE5A965F6AF8; _EDGE_V=1; USRLOC=HS=1; SRCHD=AF=NOFORM; SRCHUID=V=2&GUID=AE2758600506429D9162A3CF33877FCD&dmnchg=1; ANON=A=5A0C98388DBE329696C501A5FFFFFFFF; BCP=AD=1&AL=1&SM=1; _clck=1i9ct1n%7C2%7Cfpi%7C0%7C1730; MMCASM=ID=478C6A66B10447BBB9DB9441B077DBBA; _EDGE_S=SID=2E01B3535C3266563BC9A65B5D4567A4; WLS=C=6ff6ce41208a14ff&N=KD; ak_bmsc=5CA616E12878397CF3ACA070E1953D36~000000000000000000000000000000~YAAQ7YcQAgDUEC2SAQAAHjvRPBlgG1TInZQKNpb4Udwqvxpm1wEhNRTp22M2ZYAJiQ9Kji87mL2zw/O/NlgD9YtYh9e92WMX1/lmrTHIeEVp5cfo1KrC/4UIE1UuwDnpse8tZ9tU29OqGZUxzayKXv+yxRwGXaMSNNWMZ1nwPytndPChhApzaHpazj5/Yf+BE3wH6ATUDmrsxEpGGQ26KgVBLgv99oRZm4PR9TA/3HAon35HdK9YM9XEgEp4iLCME+xpybdlQCyjJ6VxZiDxvfNzwI0zgMmsJImrkWcyOisuR2zrHWkhZ1CBpjsayWK94thTF98F/eiA3dIRwqwbmO9ziQjvL+6KkQ3/jiaJHP4VxLHHEvAsbJDGcAio392XxJfJGRCT8l4qseWjWONa3H5L+VLihggi/7fAzRnycGRX; _U=1AMN8l8uCwW-sPazykPUn-HhmUuV9PO7V4oq0h_rqgU0U1PJ3FqT9aPlTY6TbeEJSE6wvXpHywocm2xRWyC9QFCa7lZAXaBDmWMTfPhvCoe6siJtx-P9mlWx3PthmdZB7T6Ss2JdUdXDvDBn2iUidRNIabtUERZ0UjSDFj7_yxHR1ToHmXS5vjNrlFtgolLYq8w6ZP-7UkhnMzmHFLjzbZg; _C_Auth=; _Rwho=u=d&ts=2024-09-29; SRCHUSR=DOB=20240920&T=1727602485000; _RwBf=mta=0&rc=6325&rb=6325&gb=0&rg=0&pc=6325&mtu=0&rbb=0&g=0&cid=&clo=0&v=2&l=2024-09-29T07:00:00.0000000Z&lft=0001-01-01T00:00:00.0000000&aof=0&ard=0001-01-01T00:00:00.0000000&rwdbt=1678472607&rwflt=-62135539200&rwaul2=0&o=16&p=sapphire&c=true&t=1690&s=2023-02-22T23:08:41.4316065+00:00&ts=2024-09-29T09:37:14.7144188+00:00&rwred=0&wls=2&wlb=0&wle=0&ccp=2&cpt=0&lka=0&lkt=0&aad=0&TH=&e=tS8HRGG92wRVJ4Fdva95-IwGrhxpsqsvTLEbfJ4qn-UJKG_5nq6N6lMEWWhFMgyzrM62lXr595-wHHoow-Q7qA&A=; _SS=SID=2E01B3535C3266563BC9A65B5D4567A4&R=6325&RB=6325&GB=0&RG=0&RP=6325; _uetsid=056df1b07d9211efacd1c18054710b1e; _uetvid=1eb5a650777611efa43ab5b2dfd038e0; _C_ETH=1; bm_sv=6A1FD46C006E8DAB1473AEEB66A02340~YAAQFmURAuKz9DCSAQAA6jIkPRmuQlK5Wzygi/36VSj1aa0S1+9397npkgiEP+Zq7d/0ibVL3aJFbfe4GfwwxuKhwSCzoGlPhZ8GdO1ni+7onFMWBi9eKwjQATnXGkrLP98Izaz3i8zFuVwAiskYuK29ZzmufjXq2APoERkHhJW3J6tSX+6xta8WQ5+jTVaqY3O7wZZC9HiCWjAlIKG2HKgGLAVNhuiraKJkZtN7OwPHnjscxRJtaPKPcDtM6LK4QAuk~1; SRCHHPGUSR=SRCHLANG=it&PV=6.10.9&DM=0&BRW=M&BRH=M&CW=1307&CH=948&SCW=1307&SCH=796&DPR=1.0&UTC=120&CIBV=1.1814.0&THEME=0&WEBTHEME=0&HV=1727602636&cdxtone=Creative&cdxtoneopts=h3imaginative,clgalileo,citrigger3&PRVCW=1862&PRVCH=948"
  15.  
  16. warnings.filterwarnings("ignore", message="FP16 is not supported on CPU; using FP32 instead")
  17.  
  18. bot = telebot.TeleBot('7654711231:AAF0nEj2qYyw7WiQaSTx3THBJxz9P500vgc', parse_mode='HTML')
  19.  
  20. user_settings = {}
  21.  
  22. def scarica_audio(url, percorso_output):
  23. try:
  24. opzioni_ydl = {
  25. 'format': 'bestaudio/best',
  26. 'postprocessors': [{
  27. 'key': 'FFmpegExtractAudio',
  28. 'preferredcodec': 'wav',
  29. }],
  30. 'outtmpl': percorso_output
  31. }
  32. with yt_dlp.YoutubeDL(opzioni_ydl) as ydl:
  33. info = ydl.extract_info(url, download=False)
  34. durata = info['duration']
  35. if durata > 3600:
  36. return False, "๐Ÿšซ Il video รจ troppo lungo. Per favore, scegli un video piรน breve (massimo 1 ora)."
  37. ydl.download([url])
  38. return True, durata
  39. except Exception as e:
  40. return False, f"โŒ Errore durante il download dell'audio: {str(e)}"
  41.  
  42. def tronca_testo(testo, lunghezza_massima=4000):
  43. if len(testo) <= lunghezza_massima:
  44. return testo
  45. return testo[:lunghezza_massima] + "... [testo troncato]"
  46.  
  47. def riconosci_audio(audio, chunk_index, chunks_totali):
  48. recognizer = sr.Recognizer()
  49. try:
  50. testo = recognizer.recognize_google(audio, language="it-IT")
  51. return testo, chunk_index
  52. except sr.UnknownValueError:
  53. return "[Non รจ stato possibile riconoscere l'audio]", chunk_index
  54. except sr.RequestError as e:
  55. return f"Errore nella richiesta: {e}", chunk_index
  56.  
  57. def aggiorna_progresso(chat_id, message_id, chunks_completati, chunks_totali, fase):
  58. progress = (chunks_completati / chunks_totali) * 100
  59. if fase == "elaborazione":
  60. loading_text = (
  61. f"๐ŸŽตโžก๐Ÿ“ <b>Conversione audio in testo in corso...</b>\n\n"
  62. f"๐Ÿ”Š <i>Elaborazione segmento audio {chunks_completati} di {chunks_totali}</i>\n"
  63. f"<code>{'โ–ˆ' * int(chunks_completati * 20 / chunks_totali)}{'โ–‘' * (20 - int(chunks_completati * 20 / chunks_totali))}</code> {progress:.1f}%\n\n"
  64. f"โณ <i>Il bot sta ascoltando e trascrivendo l'audio. Questo processo richiede tempo, grazie per la pazienza!</i>"
  65. )
  66. elif fase == "completamento":
  67. loading_text = (
  68. f"โœ… <b>Elaborazione audio completata!</b>\n\n"
  69. f"๐Ÿ”Šโžก๐Ÿ“ Tutti i {chunks_totali} segmenti audio sono stati convertiti in testo.\n"
  70. f"<code>{'โ–ˆ' * 20}</code> 100%\n\n"
  71. f"๐Ÿค– <i>Il bot sta ora preparando il testo per il riassunto...</i>"
  72. )
  73. bot.edit_message_text(loading_text, chat_id=chat_id, message_id=message_id, parse_mode='HTML')
  74.  
  75. def audio_in_testo(file_audio, durata_totale, chat_id, message_id):
  76. recognizer = sr.Recognizer()
  77. audio_file = sr.AudioFile(file_audio)
  78. testo_completo = ""
  79. chunk_length = 30
  80. chunks_totali = int(durata_totale / chunk_length) + 1
  81. chunks_completati = 0
  82.  
  83. with audio_file as source:
  84. audio_duration = source.DURATION
  85. chunks = []
  86.  
  87. for i in range(0, int(audio_duration), chunk_length):
  88. source.DURATION = min(chunk_length, audio_duration - i)
  89. audio = recognizer.record(source, duration=source.DURATION)
  90. chunks.append((audio, chunks_completati))
  91. chunks_completati += 1
  92.  
  93. with ThreadPoolExecutor() as executor:
  94. future_to_chunk = {executor.submit(riconosci_audio, chunk[0], chunk[1], chunks_totali): chunk for chunk in chunks}
  95. for future in as_completed(future_to_chunk):
  96. risultato, chunk_index = future.result()
  97. testo_completo += risultato + " "
  98. aggiorna_progresso(chat_id, message_id, chunk_index + 1, chunks_totali, "elaborazione")
  99.  
  100. aggiorna_progresso(chat_id, message_id, chunks_totali, chunks_totali, "completamento")
  101. return True, tronca_testo(testo_completo)
  102.  
  103. async def riassumi_testo(testo, lingua_target, lunghezza_riassunto):
  104. tentativi_massimi = 3
  105. for tentativo in range(tentativi_massimi):
  106. try:
  107. async with SydneyClient() as sydney:
  108. prompt = f"Riassumi il seguente testo in circa {lunghezza_riassunto} parole e traducilo in {lingua_target}:\n\n{testo}"
  109. risposta = ""
  110. async for response in sydney.ask_stream(prompt):
  111. risposta += response
  112. return True, tronca_testo(risposta, 3800)
  113. except Exception as e:
  114. if tentativo == tentativi_massimi - 1:
  115. return False, f"โŒ Errore durante la generazione del riassunto: {str(e)}"
  116. time.sleep(5)
  117.  
  118. def invia_messaggio_lungo(chat_id, testo, message_id=None):
  119. lunghezza_massima = 4000
  120. parti = [testo[i:i+lunghezza_massima] for i in range(0, len(testo), lunghezza_massima)]
  121. for i, parte in enumerate(parti):
  122. if message_id and i == 0:
  123. bot.edit_message_text(chat_id=chat_id, message_id=message_id, text=parte, parse_mode='HTML')
  124. else:
  125. bot.send_message(chat_id, parte, parse_mode='HTML')
  126.  
  127. @bot.message_handler(commands=['start', 'aiuto'])
  128. def invia_benvenuto(messaggio):
  129. markup = InlineKeyboardMarkup()
  130. markup.row_width = 2
  131. markup.add(
  132. InlineKeyboardButton("๐ŸŽฅ Riassumi Video", callback_data="riassumi"),
  133. InlineKeyboardButton("โ„น Come Funziona", callback_data="come_funziona"),
  134. InlineKeyboardButton("๐Ÿ“Š Statistiche", callback_data="statistiche"),
  135. InlineKeyboardButton("๐Ÿ›  Impostazioni", callback_data="impostazioni")
  136. )
  137. testo_benvenuto = (
  138. "๐Ÿš€ <b>Benvenuto nel tuo Assistente Personale per Riassunti Video!</b>\n\n"
  139. "Trasforma ore di contenuti in riassunti concisi e informativi in pochi secondi.\n\n"
  140. "๐Ÿ”ฅ <b>Caratteristiche Principali:</b>\n"
  141. "โ€ข Riassunti intelligenti di video YouTube\n"
  142. "โ€ข Supporto multilingua\n"
  143. "โ€ข Analisi dei punti chiave\n"
  144. "โ€ข Estrazione di citazioni importanti\n\n"
  145. "๐ŸŒŸ <b>Inizia subito:</b>\n"
  146. "1. Invia l'URL del video YouTube\n"
  147. "2. Ricevi un riassunto dettagliato\n\n"
  148. "<i>Esplora le opzioni sottostanti per iniziare la tua esperienza!</i>"
  149. )
  150. bot.send_message(messaggio.chat.id, testo_benvenuto, reply_markup=markup)
  151.  
  152. @bot.callback_query_handler(func=lambda call: True)
  153. def gestisci_query_callback(call):
  154. if call.data == "riassumi":
  155. bot.answer_callback_query(call.id)
  156. bot.edit_message_text(
  157. chat_id=call.message.chat.id,
  158. message_id=call.message.message_id,
  159. text="๐Ÿ“Ž <b>Per favore, inviami l'URL del video YouTube che vuoi riassumere.</b>"
  160. )
  161. elif call.data == "come_funziona":
  162. bot.answer_callback_query(call.id)
  163. testo_come_funziona = (
  164. "๐Ÿ” <b>Come funziona il bot:</b>\n\n"
  165. "1. Invii l'URL di un video YouTube\n"
  166. "2. Il bot scarica l'audio del video\n"
  167. "3. Converte l'audio in testo\n"
  168. "4. Analizza il testo e crea un riassunto\n"
  169. "5. Traduce il riassunto nella lingua scelta\n"
  170. "6. Ti invia il riassunto finale\n\n"
  171. "<i>Tutto questo processo avviene in modo automatico e rapido!</i>"
  172. )
  173. bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=testo_come_funziona)
  174. elif call.data == "statistiche":
  175. bot.answer_callback_query(call.id)
  176. testo_statistiche = (
  177. "๐Ÿ“Š <b>Statistiche del bot:</b>\n\n"
  178. "โ€ข Video elaborati: X\n"
  179. "โ€ข Utenti attivi: Y\n"
  180. "โ€ข Tempo medio di elaborazione: Z secondi\n\n"
  181. "<i>Le statistiche vengono aggiornate periodicamente.</i>"
  182. )
  183. bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=testo_statistiche)
  184. elif call.data == "impostazioni":
  185. mostra_impostazioni(call.message)
  186. elif call.data.startswith('set_'):
  187. gestisci_impostazioni(call)
  188. elif call.data == "menu_principale":
  189. invia_benvenuto(call.message)
  190.  
  191. @bot.message_handler(func=lambda messaggio: True)
  192. def gestisci_messaggio(messaggio):
  193. if messaggio.text.startswith('http'):
  194. elabora_video(messaggio, messaggio.text)
  195. else:
  196. bot.reply_to(messaggio, "โš  Per favore, invia un URL YouTube valido.")
  197.  
  198. def elabora_video(messaggio, url_video):
  199. user_id = messaggio.chat.id
  200. if user_id not in user_settings:
  201. user_settings[user_id] = {'lunghezza_riassunto': 300, 'lingua_default': 'it'}
  202.  
  203. current_settings = user_settings[user_id]
  204. lingua = current_settings['lingua_default']
  205. lunghezza_riassunto = current_settings['lunghezza_riassunto']
  206.  
  207. msg = bot.reply_to(messaggio, "๐Ÿ”„ <b>Inizializzazione del processo...</b>")
  208. percorso_output = f"audio_temp_{messaggio.chat.id}"
  209.  
  210. bot.edit_message_text("โฌ <b>Download dell'audio in corso...</b>\n\n<i>Estrazione dell'audio dal video YouTube...</i>", chat_id=messaggio.chat.id, message_id=msg.message_id)
  211. successo, risultato = scarica_audio(url_video, percorso_output)
  212. if not successo:
  213. bot.edit_message_text(f"โŒ {risultato}", chat_id=messaggio.chat.id, message_id=msg.message_id)
  214. return
  215.  
  216. durata_totale = risultato
  217. file_audio = f"{percorso_output}.wav"
  218. bot.edit_message_text("๐Ÿ”Š <b>Preparazione per la conversione audio-testo...</b>\n\n<i>Il bot si prepara ad ascoltare e trascrivere l'audio.</i>", chat_id=messaggio.chat.id, message_id=msg.message_id)
  219. successo, testo = audio_in_testo(file_audio, durata_totale, messaggio.chat.id, msg.message_id)
  220. if not successo:
  221. bot.edit_message_text(f"โŒ {testo}", chat_id=messaggio.chat.id, message_id=msg.message_id)
  222. pulisci(file_audio, percorso_output)
  223. return
  224.  
  225. bot.edit_message_text("๐Ÿง  <b>Generazione del riassunto in corso...</b>\n\n<i>Il bot sta analizzando il testo e creando un riassunto conciso.</i>", chat_id=messaggio.chat.id, message_id=msg.message_id)
  226.  
  227. successo, riassunto = asyncio.run(riassumi_testo(testo, lingua, lunghezza_riassunto))
  228. if successo:
  229. invia_messaggio_lungo(messaggio.chat.id, f"๐Ÿ“Š <b>Riassunto in {lingua}:</b>\n\n<i>{riassunto}</i>", msg.message_id)
  230. else:
  231. bot.edit_message_text(f"โŒ {riassunto}", chat_id=messaggio.chat.id, message_id=msg.message_id)
  232.  
  233. pulisci(file_audio, percorso_output)
  234. bot.send_message(messaggio.chat.id, "โœ… <b>Processo completato!</b>\n\n<i>Grazie per aver utilizzato il nostro servizio di riassunto video.</i>")
  235.  
  236. def pulisci(file_audio, percorso_output):
  237. try:
  238. if os.path.exists(file_audio):
  239. os.remove(file_audio)
  240. if os.path.exists(percorso_output):
  241. os.rmdir(percorso_output)
  242. except Exception as e:
  243. print(f"Errore durante la pulizia dei file: {e}")
  244.  
  245. def mostra_impostazioni(messaggio):
  246. user_id = messaggio.chat.id
  247. if user_id not in user_settings:
  248. user_settings[user_id] = {'lunghezza_riassunto': 300, 'lingua_default': 'it'}
  249. current_settings = user_settings[user_id]
  250.  
  251. markup = InlineKeyboardMarkup()
  252. markup.row_width = 2
  253. markup.add(
  254. InlineKeyboardButton("Lunghezza Riassunto", callback_data="set_lunghezza"),
  255. InlineKeyboardButton("Lingua Default", callback_data="set_lingua"),
  256. InlineKeyboardButton("Torna al Menu", callback_data="menu_principale")
  257. )
  258.  
  259. testo_impostazioni = (
  260. "๐Ÿ›  <b>Impostazioni Attuali:</b>\n\n"
  261. f"๐Ÿ“ Lunghezza Riassunto: {current_settings['lunghezza_riassunto']} parole\n"
  262. f"๐ŸŒ Lingua Default: {current_settings['lingua_default']}\n\n"
  263. "<i>Seleziona un'opzione da modificare:</i>"
  264. )
  265.  
  266. bot.edit_message_text(chat_id=messaggio.chat.id, message_id=messaggio.message_id, text=testo_impostazioni, reply_markup=markup)
  267.  
  268. def gestisci_impostazioni(call):
  269. user_id = call.message.chat.id
  270. if user_id not in user_settings:
  271. user_settings[user_id] = {'lunghezza_riassunto': 300, 'lingua_default': 'it'}
  272.  
  273. if call.data == "set_lunghezza":
  274. markup = InlineKeyboardMarkup()
  275. markup.row_width = 3
  276. markup.add(
  277. InlineKeyboardButton("150", callback_data="set_lunghezza_150"),
  278. InlineKeyboardButton("300", callback_data="set_lunghezza_300"),
  279. InlineKeyboardButton("500", callback_data="set_lunghezza_500")
  280. )
  281. bot.edit_message_text("๐Ÿ“ <b>Scegli la lunghezza del riassunto:</b>", chat_id=call.message.chat.id, message_id=call.message.message_id, reply_markup=markup)
  282.  
  283. elif call.data == "set_lingua":
  284. markup = InlineKeyboardMarkup()
  285. markup.row_width = 2
  286. markup.add(
  287. InlineKeyboardButton("๐Ÿ‡ฎ๐Ÿ‡น Italiano", callback_data="set_lingua_it"),
  288. InlineKeyboardButton("๐Ÿ‡ฌ๐Ÿ‡ง Inglese", callback_data="set_lingua_en"),
  289. InlineKeyboardButton("๐Ÿ‡ซ๐Ÿ‡ท Francese", callback_data="set_lingua_fr"),
  290. InlineKeyboardButton("๐Ÿ‡ช๐Ÿ‡ธ Spagnolo", callback_data="set_lingua_es")
  291. )
  292. bot.edit_message_text("๐ŸŒ <b>Scegli la lingua default:</b>", chat_id=call.message.chat.id, message_id=call.message.message_id, reply_markup=markup)
  293.  
  294. elif call.data.startswith("set_lunghezza_"):
  295. lunghezza = int(call.data.split("_")[-1])
  296. user_settings[user_id]['lunghezza_riassunto'] = lunghezza
  297. bot.answer_callback_query(call.id, text=f"Lunghezza riassunto impostata a {lunghezza} parole")
  298. mostra_impostazioni(call.message)
  299.  
  300. elif call.data.startswith("set_lingua_"):
  301. lingua = call.data.split("_")[-1]
  302. user_settings[user_id]['lingua_default'] = lingua
  303. bot.answer_callback_query(call.id, text=f"Lingua default impostata a {lingua}")
  304. mostra_impostazioni(call.message)
  305.  
  306. bot.polling(none_stop=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement