Arabic-Chatbot / app.py
2506minecraft's picture
Create app.py
7621729 verified
raw
history blame
2.74 kB
import os
import logging
from telegram import Update
from telegram.ext import Application, MessageHandler, filters
from transformers import pipeline, AutoTokenizer, VitsModel
import torchaudio
import librosa
import soundfile as sf
# تهيئة النظام
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)
# تهيئة النماذج
asr_pipeline = pipeline(
"automatic-speech-recognition",
model="facebook/wav2vec2-large-xlsr-53-arabic"
)
tts_tokenizer = AutoTokenizer.from_pretrained("facebook/mms-tts-ara")
tts_model = VitsModel.from_pretrained("facebook/mms-tts-ara")
# معالجة الصوت الوارد
async def process_voice(update: Update, context):
try:
# تحميل الملف الصوتي
voice_file = await update.message.voice.get_file()
await voice_file.download_to_drive("user_voice.ogg")
# تحويل الصوت إلى نص
text = await speech_to_text("user_voice.ogg")
# توليد الرد
response = await generate_response(text)
# تحويل النص إلى صوت
await text_to_speech(response)
# إرسال الرد
await update.message.reply_voice("bot_response.wav")
except Exception as e:
logger.error(f"Error: {str(e)}")
await update.message.reply_text("عذراً، حدث خطأ ما. يرجى المحاولة لاحقاً.")
# تحويل الصوت إلى نص
async def speech_to_text(audio_path):
# تحويل الصيغة من ogg إلى wav
audio, sr = librosa.load(audio_path, sr=16000)
sf.write("temp.wav", audio, sr)
# التعرف على الكلام
result = asr_pipeline("temp.wav")
return result["text"]
# توليد الردود
async def generate_response(text):
chatbot = pipeline("text-generation", model="aubmindlab/aragpt2-base")
response = chatbot(
text,
max_length=100,
num_return_sequences=1,
pad_token_id=50256
)
return response[0]['generated_text']
# تحويل النص إلى صوت
async def text_to_speech(text):
inputs = tts_tokenizer(text, return_tensors="pt")
with torch.no_grad():
output = tts_model(**inputs)
waveform = output.waveform[0].numpy()
torchaudio.save("bot_response.wav", torch.Tensor(waveform), tts_model.config.sampling_rate)
# تهيئة التطبيق
if __name__ == "__main__":
TOKEN = os.getenv("TELEGRAM_TOKEN")
application = Application.builder().token(TOKEN).build()
application.add_handler(MessageHandler(filters.VOICE, process_voice))
application.run_polling()