Spaces:
Sleeping
Sleeping
Commit
·
ee669e6
1
Parent(s):
f965a3b
Upload app.py with huggingface_hub
Browse files
app.py
ADDED
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import re
|
3 |
+
import requests
|
4 |
+
import json
|
5 |
+
import gradio as gr
|
6 |
+
from langchain.chat_models import ChatOpenAI
|
7 |
+
from langchain import LLMChain, PromptTemplate
|
8 |
+
from langchain.memory import ConversationBufferMemory
|
9 |
+
|
10 |
+
OPENAI_API_KEY=os.getenv('OPENAI_API_KEY')
|
11 |
+
PLAY_HT_API_KEY=os.getenv('PLAY_HT_API_KEY')
|
12 |
+
PLAY_HT_USER_ID=os.getenv('PLAY_HT_USER_ID')
|
13 |
+
|
14 |
+
PLAY_HT_VOICE_ID=os.getenv('PLAY_HT_VOICE_ID')
|
15 |
+
play_ht_api_get_audio_url = "https://play.ht/api/v2/tts"
|
16 |
+
|
17 |
+
|
18 |
+
template = """As a text generator, your main focus is to provide valuable information about mining acts, laws, and regulations specifically in India. Your responses should be restricted to queries regarding mining regulations and should avoid addressing unrelated topics such as general knowledge, full forms, celebrities, math problems, or programming. Ensure that your answers are accurate, concise, and helpful in guiding users through the complexities of mining legislation in India. Start by asking me any mining-related question you have, and I'll provide you with the information you need.
|
19 |
+
{chat_history}
|
20 |
+
User: {user_message}
|
21 |
+
Chatbot:"""
|
22 |
+
|
23 |
+
prompt = PromptTemplate(
|
24 |
+
input_variables=["chat_history", "user_message"], template=template
|
25 |
+
)
|
26 |
+
|
27 |
+
memory = ConversationBufferMemory(memory_key="chat_history")
|
28 |
+
|
29 |
+
llm_chain = LLMChain(
|
30 |
+
llm=ChatOpenAI(temperature='0.5', model_name="gpt-3.5-turbo"),
|
31 |
+
prompt=prompt,
|
32 |
+
verbose=True,
|
33 |
+
memory=memory,
|
34 |
+
)
|
35 |
+
|
36 |
+
headers = {
|
37 |
+
"accept": "text/event-stream",
|
38 |
+
"content-type": "application/json",
|
39 |
+
"AUTHORIZATION": "Bearer "+ PLAY_HT_API_KEY,
|
40 |
+
"X-USER-ID": PLAY_HT_USER_ID
|
41 |
+
}
|
42 |
+
|
43 |
+
|
44 |
+
def get_payload(text):
|
45 |
+
return {
|
46 |
+
"text": text,
|
47 |
+
"voice": PLAY_HT_VOICE_ID,
|
48 |
+
"quality": "medium",
|
49 |
+
"output_format": "mp3",
|
50 |
+
"speed": 1,
|
51 |
+
"sample_rate": 24000,
|
52 |
+
"seed": None,
|
53 |
+
"temperature": None
|
54 |
+
}
|
55 |
+
|
56 |
+
def get_generated_audio(text):
|
57 |
+
payload = get_payload(text)
|
58 |
+
generated_response = {}
|
59 |
+
try:
|
60 |
+
response = requests.post(play_ht_api_get_audio_url, json=payload, headers=headers)
|
61 |
+
response.raise_for_status()
|
62 |
+
generated_response["type"]= 'SUCCESS'
|
63 |
+
generated_response["response"] = response.text
|
64 |
+
except requests.exceptions.RequestException as e:
|
65 |
+
generated_response["type"]= 'ERROR'
|
66 |
+
try:
|
67 |
+
response_text = json.loads(response.text)
|
68 |
+
if response_text['error_message']:
|
69 |
+
generated_response["response"] = response_text['error_message']
|
70 |
+
else:
|
71 |
+
generated_response["response"] = response.text
|
72 |
+
except Exception as e:
|
73 |
+
generated_response["response"] = response.text
|
74 |
+
except Exception as e:
|
75 |
+
generated_response["type"]= 'ERROR'
|
76 |
+
generated_response["response"] = response.text
|
77 |
+
return generated_response
|
78 |
+
|
79 |
+
def extract_urls(text):
|
80 |
+
# Define the regex pattern for URLs
|
81 |
+
url_pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+[/\w\.-]*'
|
82 |
+
|
83 |
+
# Find all occurrences of URLs in the text
|
84 |
+
urls = re.findall(url_pattern, text)
|
85 |
+
|
86 |
+
return urls
|
87 |
+
|
88 |
+
def get_audio_reply_for_question(text):
|
89 |
+
generated_audio_event = get_generated_audio(text)
|
90 |
+
#From get_generated_audio, you will get events in a string format, from that we need to extract the url
|
91 |
+
final_response = {
|
92 |
+
"audio_url": '',
|
93 |
+
"message": ''
|
94 |
+
}
|
95 |
+
if generated_audio_event["type"] == 'SUCCESS':
|
96 |
+
audio_urls = extract_urls(generated_audio_event["response"])
|
97 |
+
if len(audio_urls) == 0:
|
98 |
+
final_response['message'] = "No audio file link found in generated event"
|
99 |
+
else:
|
100 |
+
final_response['audio_url'] = audio_urls[-1]
|
101 |
+
else:
|
102 |
+
final_response['message'] = generated_audio_event['response']
|
103 |
+
return final_response
|
104 |
+
|
105 |
+
def download_url(url):
|
106 |
+
try:
|
107 |
+
# Send a GET request to the URL to fetch the content
|
108 |
+
final_response = {
|
109 |
+
'content':'',
|
110 |
+
'error':''
|
111 |
+
}
|
112 |
+
response = requests.get(url)
|
113 |
+
# Check if the request was successful (status code 200)
|
114 |
+
if response.status_code == 200:
|
115 |
+
final_response['content'] = response.content
|
116 |
+
else:
|
117 |
+
final_response['error'] = f"Failed to download the URL. Status code: {response.status_code}"
|
118 |
+
except Exception as e:
|
119 |
+
final_response['error'] = f"Failed to download the URL. Error: {e}"
|
120 |
+
return final_response
|
121 |
+
|
122 |
+
def get_filename_from_url(url):
|
123 |
+
# Use os.path.basename() to extract the file name from the URL
|
124 |
+
file_name = os.path.basename(url)
|
125 |
+
return file_name
|
126 |
+
|
127 |
+
def get_text_response(user_message):
|
128 |
+
response = llm_chain.predict(user_message = user_message)
|
129 |
+
return response
|
130 |
+
|
131 |
+
def get_text_response_and_audio_response(user_message):
|
132 |
+
response = get_text_response(user_message) # Getting the reply from Open AI
|
133 |
+
audio_reply_for_question_response = get_audio_reply_for_question(response)
|
134 |
+
final_response = {
|
135 |
+
'output_file_path': '',
|
136 |
+
'message':''
|
137 |
+
}
|
138 |
+
audio_url = audio_reply_for_question_response['audio_url']
|
139 |
+
if audio_url:
|
140 |
+
output_file_path=get_filename_from_url(audio_url)
|
141 |
+
download_url_response = download_url(audio_url)
|
142 |
+
audio_content = download_url_response['content']
|
143 |
+
if audio_content:
|
144 |
+
with open(output_file_path, "wb") as audio_file:
|
145 |
+
audio_file.write(audio_content)
|
146 |
+
final_response['output_file_path'] = output_file_path
|
147 |
+
else:
|
148 |
+
final_response['message'] = download_url_response['error']
|
149 |
+
else:
|
150 |
+
final_response['message'] = audio_reply_for_question_response['message']
|
151 |
+
return final_response
|
152 |
+
|
153 |
+
def chat_bot_response(message, history):
|
154 |
+
text_and_audio_response = get_text_response_and_audio_response(message)
|
155 |
+
output_file_path = text_and_audio_response['output_file_path']
|
156 |
+
if output_file_path:
|
157 |
+
return (text_and_audio_response['output_file_path'],)
|
158 |
+
else:
|
159 |
+
return text_and_audio_response['message']
|
160 |
+
|
161 |
+
demo = gr.ChatInterface(chat_bot_response,examples=["How are you doing?","What are your interests?","Which places do you like to visit?"])
|
162 |
+
|
163 |
+
if __name__ == "__main__":
|
164 |
+
demo.launch() #To create a public link, set `share=True` in `launch()`. To enable errors and logs, set `debug=True` in `launch()`.
|