suprimedev commited on
Commit
f452c79
·
verified ·
1 Parent(s): f80610e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +88 -111
app.py CHANGED
@@ -1,132 +1,109 @@
1
  import requests
2
- import json
3
- import os
4
 
5
- # اطلاعات API TTS
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
- تولید متن پادکست با استفاده از API هوش مصنوعی.
17
- """
18
- headers = {
19
- "Authorization": f"Bearer {OPENAI_API_KEY}",
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.post(OPENAI_API_BASE_URL, headers=headers, json=payload)
35
- response.raise_for_status() # Raises an HTTPError for bad responses (4xx or 5xx)
36
- data = response.json()
37
- if data and data.get("choices"):
38
- return data["choices"][0]["message"]["content"].strip()
 
 
39
  else:
40
- print("AI response did not contain expected data.")
41
  return None
42
  except requests.exceptions.RequestException as e:
43
- print(f"Error connecting to AI API: {e}")
44
- return None
45
- except json.JSONDecodeError:
46
- print("Error decoding JSON response from AI API.")
47
  return None
48
 
49
- def get_audio_wav_link(text):
50
- """
51
- دریافت لینک فایل WAV از API تبدیل متن به گفتار.
52
  """
53
- encoded_text = requests.utils.quote(text) # Encode URL-unsafe characters
54
- tts_url = f"{TTS_API_BASE_URL}{TTS_API_FORMAT}{encoded_text}"
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
- def main():
72
- print("--------------------------------------------------")
73
- print(" Talkbot Podcast Generator ")
74
- print("--------------------------------------------------")
75
- print("این اسکریپت یک متن پادکست تولید و لینک‌های صوتی را فراهم می‌کند.")
76
- print(" برای خروج، 'exit' را تایپ کنید.")
77
- print("--------------------------------------------------")
78
-
79
- while True:
80
- topic = input("\nموضوع پادکست را وارد کنید (یا 'exit' برای خروج): ")
81
- if topic.lower() == 'exit':
82
- break
83
 
84
- print(f"\nدر حال تولید اسکریپت پادکست برای '{topic}' با هوش مصنوعی...")
85
- podcast_script = get_text_from_ai(topic)
 
 
86
 
87
- if podcast_script:
88
- print("\n------------------- اسکریپت پادکست -------------------")
89
- print(podcast_script)
90
- print("------------------------------------------------------")
 
 
 
91
 
92
- # تقسیم متن به دو بخش برای صدای اول و صدای دوم
93
- # این یک تقسیم‌بندی ساده است. ممکن است نیاز به منطق دقیق‌تری داشته باشید.
94
- sentences = [s.strip() for s in podcast_script.split('.') if s.strip()]
95
-
96
- if len(sentences) >= 2:
97
- speaker1_text = sentences[0]
98
- speaker2_text = sentences[1]
99
- elif len(sentences) == 1:
100
- speaker1_text = sentences[0]
101
- speaker2_text = "" # یا بخشی از جمله اول
102
  else:
103
- print("متن کافی برای تقسیم بین دو گوینده وجود ندارد.")
104
- speaker1_text = podcast_script
105
- speaker2_text = ""
106
-
107
- print("\nدر حال ساخت لینک‌های صوتی...")
108
-
109
- audio_link_speaker1 = get_audio_wav_link(speaker1_text)
110
- audio_link_speaker2 = get_audio_wav_link(speaker2_text) # اگر speaker2_text خالی باشد، لینک معناداری تولید نمی‌شود.
111
 
112
- if audio_link_speaker1:
113
- print(f"لینک صدای اول (Speaker 1): {audio_link_speaker1}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  else:
115
- print("خطا در تولید لینک صدای اول.")
116
-
117
- if audio_link_speaker2 and speaker2_text: # فقط اگر متن برای گوینده دوم وجود داشته باشد
118
- print(f"لینک صدای دوم (Speaker 2): {audio_link_speaker2}")
119
- elif speaker2_text: # اگر speaker2_text داشتیم و لینکی تولید نشد
120
- print("خطا در تولید لینک صدای دوم.")
 
 
121
  else:
122
- print("متن کافی برای تولید صدای دوم وجود نداشت.")
123
 
124
- print("\n------------------------------------------------------")
125
- else:
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