def response_audio_with_audio(name: str = Form(...), file: UploadFile = File(...)): """ Receive blob(wav) file, store it to disk :param name: Name field in formdata, refers to file name :param file: File field in formdata, refers to the blob file :return: responses in dict """ # file name of wav file received from network filename = f"./data/{name}.wav" # output full path of speech synthesis wav_output_dir = os.path.join(os.getcwd(), "data") # Save the wav file from network with open(filename, "wb") as f: f.write(file.file.read()) # Down sampling down_sample(filename, 16000) # convert wav to text, and get text response converted_str = wav_file_to_str(name) responses = get_rasa_response(converted_str) # for every returned response, if contains text, convert it into base64 encoded audio and add it for i, response in enumerate(responses): if "text" in response.keys(): str_to_wav_file(response['text'], wav_output_dir) with open(os.path.join(wav_output_dir, "out.wav"), "rb") as f: wav_encoded = base64.b64encode(f.read()) response["audio"] = wav_encoded return responses
def response_wav_with_wav_bin(wav_data: bytes = File(...)): converted_str = wav_bin_to_str(wav_data) responses = get_rasa_response(converted_str, "nano") zip_container = io.BytesIO() zf = zipfile.ZipFile(zip_container, "w") for response in responses: if "text" in response.keys(): text = response['text'] wav = str_to_wav_bin(text) zf.writestr(text, wav) zf.close() zip_container.seek(0) return StreamingResponse(zip_container, media_type="application/x-zip-compressed")
def response_message_with_audio(message: Message): """ Temp method, receive message, send audio response :param message: :return: """ wav_output_dir = os.path.join(os.getcwd(), "data") text = message.message responses = get_rasa_response(text) for index, response in enumerate(responses): if "text" in response.keys(): str_to_wav_file(response['text'], wav_output_dir) with open(os.path.join(wav_output_dir, "out.wav"), "rb") as f: wav_encoded = base64.b64encode(f.read()) response["audio"] = wav_encoded return responses
def response_message_with_message(message: Message): """ Receive text message, simply forward it to rasa server :return: Response from rasa """ return get_rasa_response(message.message, message.sender)