CoolFace
Apppublic

rishithM/voicecloneBot

sourceHugging Faceupdated 3y agoView on Hugging Face
0likes
app.py165 linesDownload Raw Back to root
1import os2import re3import requests4import json5import gradio as gr6from langchain.chat_models import ChatOpenAI7from langchain import LLMChain, PromptTemplate8from langchain.memory import ConversationBufferMemory9 10OPENAI_API_KEY=os.getenv('OPENAI_API_KEY')11PLAY_HT_API_KEY=os.getenv('PLAY_HT_API_KEY')12PLAY_HT_USER_ID=os.getenv('PLAY_HT_USER_ID')13 14PLAY_HT_VOICE_ID=os.getenv('PLAY_HT_VOICE_ID')15play_ht_api_get_audio_url = "https://play.ht/api/v2/tts"16 17 18template = """You are a helpful assistant to answer user queries.19{chat_history}20User: {user_message}21Chatbot:"""22 23prompt = PromptTemplate(24    input_variables=["chat_history", "user_message"], template=template25)26 27memory = ConversationBufferMemory(memory_key="chat_history")28 29llm_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 36headers = {37      "accept": "text/event-stream",38      "content-type": "application/json",39      "AUTHORIZATION": "Bearer "+ PLAY_HT_API_KEY,40      "X-USER-ID": PLAY_HT_USER_ID41}42 43 44def 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": None54  }55 56def 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.text64  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.text72      except Exception as e:73        generated_response["response"] = response.text74  except Exception as e:75    generated_response["type"]= 'ERROR'76    generated_response["response"] = response.text77  return generated_response78 79def extract_urls(text):80    # Define the regex pattern for URLs81    url_pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+[/\w\.-]*'82 83    # Find all occurrences of URLs in the text84    urls = re.findall(url_pattern, text)85 86    return urls87 88def 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 url91  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_response104 105def download_url(url):106    try:107        # Send a GET request to the URL to fetch the content108        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.content116        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_response121 122def get_filename_from_url(url):123    # Use os.path.basename() to extract the file name from the URL124    file_name = os.path.basename(url)125    return file_name126 127def get_text_response(user_message):128    response = llm_chain.predict(user_message = user_message)129    return response130 131def get_text_response_and_audio_response(user_message):132    response = get_text_response(user_message) # Getting the reply from Open AI133    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_path147      else:148          final_response['message'] = download_url_response['error']149    else:150      final_response['message'] = audio_reply_for_question_response['message']151    return final_response152 153def 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 161demo = gr.ChatInterface(chat_bot_response,examples=["How are you doing?","What are your interests?","Which places do you like to visit?"])162 163if __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()`.165