Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import subprocess
- import speech_recognition as sr
- import yt_dlp
- import time
- import shutil
- import warnings
- import telebot
- from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton
- from concurrent.futures import ThreadPoolExecutor, as_completed
- import asyncio
- from sydney import SydneyClient
- 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"
- warnings.filterwarnings("ignore", message="FP16 is not supported on CPU; using FP32 instead")
- bot = telebot.TeleBot('7654711231:AAF0nEj2qYyw7WiQaSTx3THBJxz9P500vgc', parse_mode='HTML')
- user_settings = {}
- def scarica_audio(url, percorso_output):
- try:
- opzioni_ydl = {
- 'format': 'bestaudio/best',
- 'postprocessors': [{
- 'key': 'FFmpegExtractAudio',
- 'preferredcodec': 'wav',
- }],
- 'outtmpl': percorso_output
- }
- with yt_dlp.YoutubeDL(opzioni_ydl) as ydl:
- info = ydl.extract_info(url, download=False)
- durata = info['duration']
- if durata > 3600:
- return False, "๐ซ Il video รจ troppo lungo. Per favore, scegli un video piรน breve (massimo 1 ora)."
- ydl.download([url])
- return True, durata
- except Exception as e:
- return False, f"โ Errore durante il download dell'audio: {str(e)}"
- def tronca_testo(testo, lunghezza_massima=4000):
- if len(testo) <= lunghezza_massima:
- return testo
- return testo[:lunghezza_massima] + "... [testo troncato]"
- def riconosci_audio(audio, chunk_index, chunks_totali):
- recognizer = sr.Recognizer()
- try:
- testo = recognizer.recognize_google(audio, language="it-IT")
- return testo, chunk_index
- except sr.UnknownValueError:
- return "[Non รจ stato possibile riconoscere l'audio]", chunk_index
- except sr.RequestError as e:
- return f"Errore nella richiesta: {e}", chunk_index
- def aggiorna_progresso(chat_id, message_id, chunks_completati, chunks_totali, fase):
- progress = (chunks_completati / chunks_totali) * 100
- if fase == "elaborazione":
- loading_text = (
- f"๐ตโก๐ <b>Conversione audio in testo in corso...</b>\n\n"
- f"๐ <i>Elaborazione segmento audio {chunks_completati} di {chunks_totali}</i>\n"
- f"<code>{'โ' * int(chunks_completati * 20 / chunks_totali)}{'โ' * (20 - int(chunks_completati * 20 / chunks_totali))}</code> {progress:.1f}%\n\n"
- f"โณ <i>Il bot sta ascoltando e trascrivendo l'audio. Questo processo richiede tempo, grazie per la pazienza!</i>"
- )
- elif fase == "completamento":
- loading_text = (
- f"โ <b>Elaborazione audio completata!</b>\n\n"
- f"๐โก๐ Tutti i {chunks_totali} segmenti audio sono stati convertiti in testo.\n"
- f"<code>{'โ' * 20}</code> 100%\n\n"
- f"๐ค <i>Il bot sta ora preparando il testo per il riassunto...</i>"
- )
- bot.edit_message_text(loading_text, chat_id=chat_id, message_id=message_id, parse_mode='HTML')
- def audio_in_testo(file_audio, durata_totale, chat_id, message_id):
- recognizer = sr.Recognizer()
- audio_file = sr.AudioFile(file_audio)
- testo_completo = ""
- chunk_length = 30
- chunks_totali = int(durata_totale / chunk_length) + 1
- chunks_completati = 0
- with audio_file as source:
- audio_duration = source.DURATION
- chunks = []
- for i in range(0, int(audio_duration), chunk_length):
- source.DURATION = min(chunk_length, audio_duration - i)
- audio = recognizer.record(source, duration=source.DURATION)
- chunks.append((audio, chunks_completati))
- chunks_completati += 1
- with ThreadPoolExecutor() as executor:
- future_to_chunk = {executor.submit(riconosci_audio, chunk[0], chunk[1], chunks_totali): chunk for chunk in chunks}
- for future in as_completed(future_to_chunk):
- risultato, chunk_index = future.result()
- testo_completo += risultato + " "
- aggiorna_progresso(chat_id, message_id, chunk_index + 1, chunks_totali, "elaborazione")
- aggiorna_progresso(chat_id, message_id, chunks_totali, chunks_totali, "completamento")
- return True, tronca_testo(testo_completo)
- async def riassumi_testo(testo, lingua_target, lunghezza_riassunto):
- tentativi_massimi = 3
- for tentativo in range(tentativi_massimi):
- try:
- async with SydneyClient() as sydney:
- prompt = f"Riassumi il seguente testo in circa {lunghezza_riassunto} parole e traducilo in {lingua_target}:\n\n{testo}"
- risposta = ""
- async for response in sydney.ask_stream(prompt):
- risposta += response
- return True, tronca_testo(risposta, 3800)
- except Exception as e:
- if tentativo == tentativi_massimi - 1:
- return False, f"โ Errore durante la generazione del riassunto: {str(e)}"
- time.sleep(5)
- def invia_messaggio_lungo(chat_id, testo, message_id=None):
- lunghezza_massima = 4000
- parti = [testo[i:i+lunghezza_massima] for i in range(0, len(testo), lunghezza_massima)]
- for i, parte in enumerate(parti):
- if message_id and i == 0:
- bot.edit_message_text(chat_id=chat_id, message_id=message_id, text=parte, parse_mode='HTML')
- else:
- bot.send_message(chat_id, parte, parse_mode='HTML')
- @bot.message_handler(commands=['start', 'aiuto'])
- def invia_benvenuto(messaggio):
- markup = InlineKeyboardMarkup()
- markup.row_width = 2
- markup.add(
- InlineKeyboardButton("๐ฅ Riassumi Video", callback_data="riassumi"),
- InlineKeyboardButton("โน Come Funziona", callback_data="come_funziona"),
- InlineKeyboardButton("๐ Statistiche", callback_data="statistiche"),
- InlineKeyboardButton("๐ Impostazioni", callback_data="impostazioni")
- )
- testo_benvenuto = (
- "๐ <b>Benvenuto nel tuo Assistente Personale per Riassunti Video!</b>\n\n"
- "Trasforma ore di contenuti in riassunti concisi e informativi in pochi secondi.\n\n"
- "๐ฅ <b>Caratteristiche Principali:</b>\n"
- "โข Riassunti intelligenti di video YouTube\n"
- "โข Supporto multilingua\n"
- "โข Analisi dei punti chiave\n"
- "โข Estrazione di citazioni importanti\n\n"
- "๐ <b>Inizia subito:</b>\n"
- "1. Invia l'URL del video YouTube\n"
- "2. Ricevi un riassunto dettagliato\n\n"
- "<i>Esplora le opzioni sottostanti per iniziare la tua esperienza!</i>"
- )
- bot.send_message(messaggio.chat.id, testo_benvenuto, reply_markup=markup)
- @bot.callback_query_handler(func=lambda call: True)
- def gestisci_query_callback(call):
- if call.data == "riassumi":
- bot.answer_callback_query(call.id)
- bot.edit_message_text(
- chat_id=call.message.chat.id,
- message_id=call.message.message_id,
- text="๐ <b>Per favore, inviami l'URL del video YouTube che vuoi riassumere.</b>"
- )
- elif call.data == "come_funziona":
- bot.answer_callback_query(call.id)
- testo_come_funziona = (
- "๐ <b>Come funziona il bot:</b>\n\n"
- "1. Invii l'URL di un video YouTube\n"
- "2. Il bot scarica l'audio del video\n"
- "3. Converte l'audio in testo\n"
- "4. Analizza il testo e crea un riassunto\n"
- "5. Traduce il riassunto nella lingua scelta\n"
- "6. Ti invia il riassunto finale\n\n"
- "<i>Tutto questo processo avviene in modo automatico e rapido!</i>"
- )
- bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=testo_come_funziona)
- elif call.data == "statistiche":
- bot.answer_callback_query(call.id)
- testo_statistiche = (
- "๐ <b>Statistiche del bot:</b>\n\n"
- "โข Video elaborati: X\n"
- "โข Utenti attivi: Y\n"
- "โข Tempo medio di elaborazione: Z secondi\n\n"
- "<i>Le statistiche vengono aggiornate periodicamente.</i>"
- )
- bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=testo_statistiche)
- elif call.data == "impostazioni":
- mostra_impostazioni(call.message)
- elif call.data.startswith('set_'):
- gestisci_impostazioni(call)
- elif call.data == "menu_principale":
- invia_benvenuto(call.message)
- @bot.message_handler(func=lambda messaggio: True)
- def gestisci_messaggio(messaggio):
- if messaggio.text.startswith('http'):
- elabora_video(messaggio, messaggio.text)
- else:
- bot.reply_to(messaggio, "โ Per favore, invia un URL YouTube valido.")
- def elabora_video(messaggio, url_video):
- user_id = messaggio.chat.id
- if user_id not in user_settings:
- user_settings[user_id] = {'lunghezza_riassunto': 300, 'lingua_default': 'it'}
- current_settings = user_settings[user_id]
- lingua = current_settings['lingua_default']
- lunghezza_riassunto = current_settings['lunghezza_riassunto']
- msg = bot.reply_to(messaggio, "๐ <b>Inizializzazione del processo...</b>")
- percorso_output = f"audio_temp_{messaggio.chat.id}"
- 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)
- successo, risultato = scarica_audio(url_video, percorso_output)
- if not successo:
- bot.edit_message_text(f"โ {risultato}", chat_id=messaggio.chat.id, message_id=msg.message_id)
- return
- durata_totale = risultato
- file_audio = f"{percorso_output}.wav"
- 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)
- successo, testo = audio_in_testo(file_audio, durata_totale, messaggio.chat.id, msg.message_id)
- if not successo:
- bot.edit_message_text(f"โ {testo}", chat_id=messaggio.chat.id, message_id=msg.message_id)
- pulisci(file_audio, percorso_output)
- return
- 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)
- successo, riassunto = asyncio.run(riassumi_testo(testo, lingua, lunghezza_riassunto))
- if successo:
- invia_messaggio_lungo(messaggio.chat.id, f"๐ <b>Riassunto in {lingua}:</b>\n\n<i>{riassunto}</i>", msg.message_id)
- else:
- bot.edit_message_text(f"โ {riassunto}", chat_id=messaggio.chat.id, message_id=msg.message_id)
- pulisci(file_audio, percorso_output)
- bot.send_message(messaggio.chat.id, "โ <b>Processo completato!</b>\n\n<i>Grazie per aver utilizzato il nostro servizio di riassunto video.</i>")
- def pulisci(file_audio, percorso_output):
- try:
- if os.path.exists(file_audio):
- os.remove(file_audio)
- if os.path.exists(percorso_output):
- os.rmdir(percorso_output)
- except Exception as e:
- print(f"Errore durante la pulizia dei file: {e}")
- def mostra_impostazioni(messaggio):
- user_id = messaggio.chat.id
- if user_id not in user_settings:
- user_settings[user_id] = {'lunghezza_riassunto': 300, 'lingua_default': 'it'}
- current_settings = user_settings[user_id]
- markup = InlineKeyboardMarkup()
- markup.row_width = 2
- markup.add(
- InlineKeyboardButton("Lunghezza Riassunto", callback_data="set_lunghezza"),
- InlineKeyboardButton("Lingua Default", callback_data="set_lingua"),
- InlineKeyboardButton("Torna al Menu", callback_data="menu_principale")
- )
- testo_impostazioni = (
- "๐ <b>Impostazioni Attuali:</b>\n\n"
- f"๐ Lunghezza Riassunto: {current_settings['lunghezza_riassunto']} parole\n"
- f"๐ Lingua Default: {current_settings['lingua_default']}\n\n"
- "<i>Seleziona un'opzione da modificare:</i>"
- )
- bot.edit_message_text(chat_id=messaggio.chat.id, message_id=messaggio.message_id, text=testo_impostazioni, reply_markup=markup)
- def gestisci_impostazioni(call):
- user_id = call.message.chat.id
- if user_id not in user_settings:
- user_settings[user_id] = {'lunghezza_riassunto': 300, 'lingua_default': 'it'}
- if call.data == "set_lunghezza":
- markup = InlineKeyboardMarkup()
- markup.row_width = 3
- markup.add(
- InlineKeyboardButton("150", callback_data="set_lunghezza_150"),
- InlineKeyboardButton("300", callback_data="set_lunghezza_300"),
- InlineKeyboardButton("500", callback_data="set_lunghezza_500")
- )
- 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)
- elif call.data == "set_lingua":
- markup = InlineKeyboardMarkup()
- markup.row_width = 2
- markup.add(
- InlineKeyboardButton("๐ฎ๐น Italiano", callback_data="set_lingua_it"),
- InlineKeyboardButton("๐ฌ๐ง Inglese", callback_data="set_lingua_en"),
- InlineKeyboardButton("๐ซ๐ท Francese", callback_data="set_lingua_fr"),
- InlineKeyboardButton("๐ช๐ธ Spagnolo", callback_data="set_lingua_es")
- )
- 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)
- elif call.data.startswith("set_lunghezza_"):
- lunghezza = int(call.data.split("_")[-1])
- user_settings[user_id]['lunghezza_riassunto'] = lunghezza
- bot.answer_callback_query(call.id, text=f"Lunghezza riassunto impostata a {lunghezza} parole")
- mostra_impostazioni(call.message)
- elif call.data.startswith("set_lingua_"):
- lingua = call.data.split("_")[-1]
- user_settings[user_id]['lingua_default'] = lingua
- bot.answer_callback_query(call.id, text=f"Lingua default impostata a {lingua}")
- mostra_impostazioni(call.message)
- bot.polling(none_stop=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement