Я добавил шаг в Waterfall, чтобы получить вложение от пользователя. При тестировании с помощью эмулятора BotFramework я могу отправить аудиофайл боту и вернуть тот же файл обратно пользователю. Ниже приведены шаги водопада и код
self.add_dialog(
WaterfallDialog(
WaterfallDialog.__name__,
[
self.project_step,
self.name_step,
self.description_step,
**self.attachment_step**,
self.confirm_step,
self.final_step,
],
)
)
Ниже приведен код для шага прикрепления :
async def attachment_step(self, step_context: WaterfallStepContext) -> DialogTurnResult:
confluence_details = step_context.options
# Capture the results of the previous step
confluence_details.description = step_context.result
message_text = "please add an attachment"
prompt_options = PromptOptions(
prompt=MessageFactory.text(
"add an attachment"
),
retry_prompt=MessageFactory.text(
"The attachment must be a mp4/wav audio file."
),
)
return await step_context.prompt(AttachmentPrompt.__name__, prompt_options)
async def confirm_step(
self, step_context: WaterfallStepContext
) -> DialogTurnResult:
confluence_details = step_context.options
confluence_details.audioFile = (
None if not step_context.result else step_context.result[0]
)
if confluence_details.audioFile:
await step_context.context.send_activity(
MessageFactory.attachment(
confluence_details.audioFile, "This is your audio file."
)
)
@staticmethod
async def file_prompt_validator(prompt_context: PromptValidatorContext) -> bool:
if not prompt_context.recognized.succeeded:
await prompt_context.context.send_activity(
"No attachments received. Proceeding without attachment..."
)
# We can return true from a validator function even if recognized.succeeded is false.
return True
attachments = prompt_context.recognized.value
valid_file = [
attachment
for attachment in attachments
if attachment.content_type in ["audio/mp3", "audio/mp4","audio/wav"]
]
prompt_context.recognized.value = valid_file
# If none of the attachments are valid images, the retry prompt should be sent.
return len(valid_file) > 0
Код отлично работает в эмуляторе.
Я не понимаю, как отправить аудиофайл из пользовательского приложения боту? Могу ли я отправить аудиофайл в виде строки в кодировке base64. Если да, какие изменения мне нужно внести в конце бота.
Я мог бы найти везде, где этот файл должен быть отправлен в URL-адресе содержимого, содержащем URL-адрес местоположения где размещен файл. Я не могу получить файл, отправленный из пользовательского приложения боту.
Я прилагаю для справки снимок экрана с цепочкой беседы. ![converstaion flow](https://i.stack.imgur.com/uNAJb.png)
![enter image description here](https://i.stack.imgur.com/zXZnF.png)
Изменить : - Предыдущая проблема была решена. Мне удалось получить аудиофайл в виде строки в кодировке Base64. Проблема заключалась в отправке JSON. В contentUrl это должен быть массив вложений. Мое плохое
Edit1 : - При попытке отправить аудиофайл в виде строки в кодировке base64 выдает ошибку для некоторых файлов:
{
"error": {
"code": "MessageSizeTooBig",
"message": "Activity body too large for storage. Try using attachments to reduce the activity size."
}
}
Что это на самом деле означает?
Как я мог видеть из этого ссылка есть верхний предел размера активности. Может ли кто-нибудь предложить наиболее реальный способ отправки аудиофайлов боту?