我如何接收用户发送给 Bot 的音频附件?
How do i receive audio attachment sent by user to Bot?
我在 Waterfall 中添加了一个步骤来获取用户的附件。
当使用 BotFramework Emulator 进行测试时,我能够将音频文件发送到机器人并再次回显相同的文件到 User.Below 是瀑布步骤和代码
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 编码发送吗 string.If 是的,我需要在 Bot 端进行哪些更改。
我到处都能找到要发送的文件内容 URL,其中包含文件托管位置 URL。
我无法接收从用户应用程序发送到机器人的文件。
我附上对话流程的屏幕截图以供参考。
编辑:- 之前的问题已解决。我能够接收音频文件作为 Base64 编码 string.The 问题是 JSON 是 sent.In contentUrl 它应该是 attachments.My 坏
的数组
Edit1:- 尝试将音频文件作为 base64 编码字符串发送时,某些文件出现错误:
{
"error": {
"code": "MessageSizeTooBig",
"message": "Activity body too large for storage. Try using attachments to reduce the activity size."
}
}
这到底是什么意思?
从这个 link 可以看出 activity 大小有上限。
有人可以建议将音频文件发送到 bot 的最可行方法吗?
当您收到一条错误消息 "message size too big," 时,这就是它所说的意思。当它建议您使用附件时,这意味着附件 link 到远程 HTTP/HTTPS 位置而不是嵌入数据。您应该尝试上传文件或使用适合传输音频的服务,例如 Direct Line Speech channel.
我在 Waterfall 中添加了一个步骤来获取用户的附件。 当使用 BotFramework Emulator 进行测试时,我能够将音频文件发送到机器人并再次回显相同的文件到 User.Below 是瀑布步骤和代码
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 编码发送吗 string.If 是的,我需要在 Bot 端进行哪些更改。
我到处都能找到要发送的文件内容 URL,其中包含文件托管位置 URL。 我无法接收从用户应用程序发送到机器人的文件。
我附上对话流程的屏幕截图以供参考。
编辑:- 之前的问题已解决。我能够接收音频文件作为 Base64 编码 string.The 问题是 JSON 是 sent.In contentUrl 它应该是 attachments.My 坏
的数组Edit1:- 尝试将音频文件作为 base64 编码字符串发送时,某些文件出现错误:
{
"error": {
"code": "MessageSizeTooBig",
"message": "Activity body too large for storage. Try using attachments to reduce the activity size."
}
}
这到底是什么意思?
从这个 link 可以看出 activity 大小有上限。 有人可以建议将音频文件发送到 bot 的最可行方法吗?
当您收到一条错误消息 "message size too big," 时,这就是它所说的意思。当它建议您使用附件时,这意味着附件 link 到远程 HTTP/HTTPS 位置而不是嵌入数据。您应该尝试上传文件或使用适合传输音频的服务,例如 Direct Line Speech channel.