Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -1,132 +1,109 @@
|
|
1 |
import requests
|
2 |
-
import json
|
3 |
-
import os
|
4 |
|
5 |
-
|
6 |
-
TTS_API_BASE_URL = "https://talkbot.ir/TTS-tkun"
|
7 |
-
TTS_API_FORMAT = "?text="
|
8 |
-
|
9 |
-
# اطلاعات API OpenAI (برای Talkbot.ir)
|
10 |
-
OPENAI_API_BASE_URL = "https://talkbot.ir/api/v1/chat/completions"
|
11 |
-
OPENAI_API_KEY = "sk-4fb61f56acfcc731e801b904cd89f5" # دقت کنید که این کلید API از Talkbot.ir است و ممکن است با OpenAI اصلی متفاوت باشد.
|
12 |
-
OPENAI_MODEL = "deepseek-v3-0324"
|
13 |
-
|
14 |
-
def get_text_from_ai(prompt_text):
|
15 |
"""
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
"Content-Type": "application/json"
|
21 |
-
}
|
22 |
-
|
23 |
-
payload = {
|
24 |
-
"model": OPENAI_MODEL,
|
25 |
-
"messages": [
|
26 |
-
{"role": "system", "content": "You are a helpful assistant that generates podcast scripts."},
|
27 |
-
{"role": "user", "content": f"Generate a short podcast script about: {prompt_text}"}
|
28 |
-
],
|
29 |
-
"max_tokens": 500,
|
30 |
-
"temperature": 0.7
|
31 |
-
}
|
32 |
|
|
|
|
|
|
|
|
|
33 |
try:
|
34 |
-
response = requests.
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
|
|
|
|
39 |
else:
|
40 |
-
print("
|
41 |
return None
|
42 |
except requests.exceptions.RequestException as e:
|
43 |
-
print(f"
|
44 |
-
return None
|
45 |
-
except json.JSONDecodeError:
|
46 |
-
print("Error decoding JSON response from AI API.")
|
47 |
return None
|
48 |
|
49 |
-
def
|
50 |
-
"""
|
51 |
-
دریافت لینک فایل WAV از API تبدیل متن به گفتار.
|
52 |
"""
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
try:
|
57 |
-
# برای این API، فقط ساختار URL مهم است، نیازی به درخواست مستقیم برای دریافت لینک نیست.
|
58 |
-
# فرض میشود که API بلافاصله لینک wav را به عنوان پاسخ GET برمیگرداند.
|
59 |
-
# اما طبق توضیحات شما، خروجی به صورت لینک wav است.
|
60 |
-
# این یعنی درخواست GET به آن URL، مستقیماً لینک را برمیگرداند.
|
61 |
-
# اگر API مستقیماً لینک WAV را در بدنه پاسخ برمیگرداند، میتوان از request.text استفاده کرد.
|
62 |
-
# در غیر این صورت، شاید باید یک درخواست واقعی انجام داد.
|
63 |
-
# با توجه به "خروجی صوت به صورت لینک wav است"، فرض میشود که خود URL ورودی، لینک WAV خروجی است.
|
64 |
-
# اگر API یک JSON با لینک wav برمیگرداند، باید کد را تغییر داد.
|
65 |
-
return tts_url
|
66 |
-
|
67 |
-
except requests.exceptions.RequestException as e:
|
68 |
-
print(f"Error generating TTS link: {e}")
|
69 |
-
return None
|
70 |
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
print("--------------------------------------------------")
|
78 |
-
|
79 |
-
while True:
|
80 |
-
topic = input("\nموضوع پادکست را وارد کنید (یا 'exit' برای خروج): ")
|
81 |
-
if topic.lower() == 'exit':
|
82 |
-
break
|
83 |
|
84 |
-
|
85 |
-
|
|
|
|
|
86 |
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
|
|
|
|
|
|
91 |
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
elif len(sentences) == 1:
|
100 |
-
speaker1_text = sentences[0]
|
101 |
-
speaker2_text = "" # یا بخشی از جمله اول
|
102 |
else:
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
|
112 |
-
|
113 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
114 |
else:
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
|
|
|
|
121 |
else:
|
122 |
-
|
123 |
|
124 |
-
|
125 |
-
|
126 |
-
print("متن پادکست از هوش مصنوعی دریافت نشد.")
|
127 |
-
print("لطفاً اتصال به اینترنت و کلید API را بررسی کنید.")
|
128 |
-
|
129 |
-
print("\nخروج از برنامه. موفق باشید!")
|
130 |
|
131 |
-
if __name__ == "__main__":
|
132 |
-
main()
|
|
|
1 |
import requests
|
|
|
|
|
2 |
|
3 |
+
def get_tts_link(text, voice_id):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
"""
|
5 |
+
از API Talkbot.ir برای تبدیل متن به صوت با صدای مشخص استفاده می کند.
|
6 |
+
Args:
|
7 |
+
text: متن ورودی برای تبدیل به صوت.
|
8 |
+
voice_id: شناسه صدا (مثلا 1 یا 2).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
10 |
+
Returns:
|
11 |
+
لینک فایل صوتی WAV در صورت موفقیت، در غیر این صورت None.
|
12 |
+
"""
|
13 |
+
url = f"https://talkbot.ir/TTS-tkun?text={requests.utils.quote(text)}&voice={voice_id}"
|
14 |
try:
|
15 |
+
response = requests.get(url)
|
16 |
+
# فرض می کنیم API در صورت موفقیت لینک مستقیم wav برمی گرداند
|
17 |
+
# نیاز به بررسی دقیق پاسخ واقعی API Talkbot.ir است.
|
18 |
+
# اگر پاسخ JSON است، نیاز به پارس کردن آن است.
|
19 |
+
# اگر پاسخ تنها لینک است، این کد کار می کند.
|
20 |
+
if response.status_code == 200:
|
21 |
+
return response.text.strip() # فرض می کنیم پاسخ مستقیم لینک است
|
22 |
else:
|
23 |
+
print(f"خطا در دریافت صوت: {response.status_code}")
|
24 |
return None
|
25 |
except requests.exceptions.RequestException as e:
|
26 |
+
print(f"خطا در ارسال درخواست: {e}")
|
|
|
|
|
|
|
27 |
return None
|
28 |
|
29 |
+
def generate_podcast_script(prompt):
|
|
|
|
|
30 |
"""
|
31 |
+
با استفاده از API هوش مصنوعی متن پادکست را تولید می کند.
|
32 |
+
Args:
|
33 |
+
prompt: دستور برای تولید متن پادکست.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
|
35 |
+
Returns:
|
36 |
+
متن تولید شده برای پادکست.
|
37 |
+
"""
|
38 |
+
# کلید API هوش مصنوعی شما
|
39 |
+
api_key = "sk-4fb613f56acfccf731e801b904cd89f5" # لطفاً این کلید را در محیط امن نگهداری کنید و به این شکل در کد قرار ندهید در محیط واقعی
|
40 |
+
api_url = "https://talkbot.ir/api/v1/chat/completions"
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
|
42 |
+
headers = {
|
43 |
+
"Authorization": f"Bearer {api_key}",
|
44 |
+
"Content-Type": "application/json"
|
45 |
+
}
|
46 |
|
47 |
+
data = {
|
48 |
+
"model": "deepseek-v3-0324",
|
49 |
+
"messages": [
|
50 |
+
{"role": "system", "content": "شما یک دستیار برای تولید متن پادکست هستید."},
|
51 |
+
{"role": "user", "content": prompt}
|
52 |
+
]
|
53 |
+
}
|
54 |
|
55 |
+
try:
|
56 |
+
response = requests.post(api_url, headers=headers, json=data)
|
57 |
+
if response.status_code == 200:
|
58 |
+
result = response.json()
|
59 |
+
# نیاز به بررسی ساختار پاسخ API هوش مصنوعی شما
|
60 |
+
if result and 'choices' in result and result['choices']:
|
61 |
+
return result['choices'][0]['message']['content'].strip() if 'message' in result['choices'][0] and 'content' in result['choices'][0]['message'] else "متن پادکست تولید نشد."
|
|
|
|
|
|
|
62 |
else:
|
63 |
+
print(f"پاسخ هوش مصنوعی نامعتبر است: {result}")
|
64 |
+
return "خطا در تولید متن پادکست: پاسخ نامعتبر هوش مصنوعی"
|
65 |
+
else:
|
66 |
+
print(f"خطا در درخواست به API هوش مصنوعی: {response.status_code}, پاسخ: {response.text}")
|
67 |
+
return f"خطا در تولید متن پادکست: {response.status_code}"
|
68 |
+
except requests.exceptions.RequestException as e:
|
69 |
+
print(f"خطا در ارسال درخواست به API هوش مصنوعی: {e}")
|
70 |
+
return f"خطا در ارسال درخواست به API هوش مصنوعی: {e}"
|
71 |
|
72 |
+
# مثال استفاده از توابع (بدون واسط کاربری)
|
73 |
+
if __name__ == "__main__":
|
74 |
+
# مرحله 1: تولید متن پادکست
|
75 |
+
podcast_prompt = "متنی کوتاه و جالب در مورد معرفی یک کتاب جدید بنویسید."
|
76 |
+
podcast_text = generate_podcast_script(podcast_prompt)
|
77 |
+
print("متن پادکست تولید شده:")
|
78 |
+
print(podcast_text)
|
79 |
+
|
80 |
+
if podcast_text and podcast_text != "خطا در تولید متن پادکست: پاسخ نامعتبر هوش مصنوعی" and not podcast_text.startswith("خطا"):
|
81 |
+
# برای سادگی، فرض می کنیم متن تولید شده بین دو گوینده تقسیم می شود.
|
82 |
+
# در واقعیت، نیاز به منطق پیچیده تری برای تقسیم متن برای دو گوینده است.
|
83 |
+
parts = podcast_text.split('.') # تقسیم ساده بر اساس نقطه به عنوان مثال
|
84 |
+
half_length = len(parts) // 2
|
85 |
+
text_part1 = '.'.join(parts[:half_length]) + '.' if half_length > 0 else ""
|
86 |
+
text_part2 = '.'.join(parts[half_length:]) if half_length < len(parts) else ""
|
87 |
+
|
88 |
+
|
89 |
+
# مرحله 2: دریافت صوت برای صدای اول
|
90 |
+
if text_part1:
|
91 |
+
print("\nدریافت صوت برای صدای اول...")
|
92 |
+
voice1_link = get_tts_link(text_part1, 1)
|
93 |
+
if voice1_link:
|
94 |
+
print(f"لینک صوت صدای اول: {voice1_link}")
|
95 |
else:
|
96 |
+
print("موفق به دریافت صوت برای صدای اول نشد.")
|
97 |
+
|
98 |
+
# مرحله 3: دریافت صوت برای صدای دوم
|
99 |
+
if text_part2:
|
100 |
+
print("\nدریافت صوت برای صدای دوم...")
|
101 |
+
voice2_link = get_tts_link(text_part2, 2)
|
102 |
+
if voice2_link:
|
103 |
+
print(f"لینک صوت صدای دوم: {voice2_link}")
|
104 |
else:
|
105 |
+
print("موفق به دریافت صوت برای صدای دوم نشد.")
|
106 |
|
107 |
+
else:
|
108 |
+
print("\nبه دلیل خطای تولید متن پادکست، فرآیند تولید صوت انجام نشد.")
|
|
|
|
|
|
|
|
|
109 |
|
|
|
|