对于“机器人句柄”,请输入“SpeechEchoBotTutorial-BotRegistration-####”。 将 #### 替换为所选编号。
机器人句柄必须全局唯一。 如果输入某个编号后收到错误消息“请求的机器人 ID 不可用”,请选择其他编号。 以下示例使用“8726”。
对于“订阅”,请选择“免费试用版”。
对于“资源组”,请选择“SpeechEchoBotTutorial-ResourceGroup”。
对于“位置”,请选择“美国西部”。
对于“定价层”,请选择“F0”。
忽略“自动创建应用 ID 和密码”。
- 在“Azure 机器人”窗格底部,选择“创建”。
- 创建资源后,在 Azure 门户中打开“SpeechEchoBotTutorial-BotRegistration-####”资源。
- 在“设置”区域中,选择“配置”。
- 对于“消息传送终结点”,请输入 Web 应用的 URL 并追加 “/api/messages” 路径。 例如:如果全局唯一的应用名称为 EchoBot20190805125647,则消息传送终结点将是:
https://EchoBot20190805125647.azurewebsites.net/api/messages/
。
此时,请在 Azure 门户中检查资源组(“SpeechEchoBotTutorial-ResourceGroup”)。 它现在应显示至少四个资源:
可选:网络聊天测试
“Azure 机器人”页的“设置”下提供“通过 Web 聊天执行测试”选项。 默认情况下,此功能不适用于你的机器人,因为 Web 聊天需要对机器人进行身份验证。
如果要使用文本输入测试已部署的机器人,请使用以下步骤。 请注意,这些步骤是可选的,不执行这些步骤也能继续完成本教程。
在“Azure 门户”中找到并打开“EchoBotTutorial-BotRegistration-####”资源。
在“设置”区域中,选择“配置”。 复制“Microsoft 应用 ID”下的值。
打开 Visual Studio EchoBot 解决方案。 在解决方案资源管理器中,找到并双击“appsettings.json”。
将 JSON 文件中“MicrosoftAppId”旁边的空字符串替换为复制的 ID 值。
返回到 Azure 门户。 在“设置”区域中,选择“配置”。 然后选择“Microsoft 应用 ID”旁边的“管理”。
选择“新建客户端机密”。 添加说明(例如 "Web 聊天")并选择“添加”。 复制新机密。
将 JSON 文件中“MicrosoftAppPassword”旁边的空字符串替换为复制的机密值。
保存 JSON 文件。 代码应该如下所示:
"MicrosoftAppId": "3be0abc2-ca07-475e-b6c3-90c4476c4370",
"MicrosoftAppPassword": "-zRhJZ~1cnc7ZIlj4Qozs_eKN.8Cq~U38G"
重新发布应用:在 Visual Studio 解决方案资源管理器中右键单击“EchoBot”项目,选择“发布”,然后选择“发布”按钮。
注册 Direct Line Speech 通道
现在是将机器人注册到 Direct Line Speech 通道的时候了。 此通道在机器人与使用语音 SDK 编译的客户端应用之间创建连接。
在 Azure 门户中找到并打开“SpeechEchoBotTutorial-BotRegistration-####”资源。
在“设置”区域中,选择“通道”,然后执行以下步骤:
- 在“更多通道”下,选择“Direct Line Speech”。
- 查看“配置 Direct Line Speech”页中的文本,然后展开“认知服务帐户”下拉菜单。
- 从菜单中选择前面创建的语音服务资源(例如“SpeechEchoBotTutorial-Speech”),将机器人关联到订阅密钥。
- 忽略余下的可选字段。
- 选择“保存”。
在“设置”区域中,选择“配置”,然后执行以下步骤:
- 选中“启用流式处理终结点”复选框。 要想在机器人与 Direct Line Speech 通道之间创建基于 Web 套接字的通信协议,此步骤是必需的。
- 选择“保存”。
若要了解详细信息,请参阅将机器人连接到 Direct Line Speech。
运行 Windows 语音助理客户端
Windows 语音助理客户端是以 C# 编写的一个 Windows Presentation Foundation (WPF) 应用,它使用语音 SDK 通过 Direct Line Speech 通道来管理与机器人的通信。 在编写自定义客户端应用之前,请使用语音助理客户端来与机器人交互并对其进行测试。 该客户端是开源的,因此你可以下载并运行可执行文件,或者自行生成。
Windows 语音助理客户端提供一个简单 UI,可让你配置与机器人的连接、查看文本对话、以 JSON 格式查看 Bot Framework 活动,以及显示自适应卡片。 它还支持使用自定义关键字。 你将使用此客户端来与机器人对话,并接收语音响应。
此时,请确认麦克风和扬声器已启用并可正常工作。
转到 Windows 语音助理客户端的 GitHub 存储库。
按照其中的说明执行以下操作:
- 下载要运行的预生成可执行文件 .zip 包
- 通过克隆存储库并生成项目来自行生成可执行文件
按照 GitHub 存储库中的说明,打开 VoiceAssistantClient.exe 客户端应用程序并将其配置为连接到你的机器人。
选择“重新连接”,确保看到消息“已启动新对话 - 请键入内容或按下麦克风按钮”。
让我们进行测试。选择麦克风按钮,并讲出几句英语。 当你讲话时,识别到的文本将会显示。 在你说完后,机器人将以自己的语音给出回复,它会说“复述”,然后讲出识别到的话语。
也可以使用文本来与机器人交谈。 只需在底部栏中键入文本即可。
排查 Windows 语音助理客户端中的错误
如果在主应用窗口中收到错误消息,请参考下表来确定并排查问题:
你应该如何操作?
错误(AuthenticationFailure): WebSocket 升级失败并出现身份验证错误(401)。 请检查资源密钥(或授权令牌)和区域名称是否正确
在应用的“设置”页中,请确保正确输入了密钥及其区域。
错误(ConnectionFailure): 远程主机关闭了连接。 错误代码: 1011。 错误详细信息: 在发送消息之前无法连接到机器人
确保选中了“启用流式处理终结点”复选框和/或启用了 Web 套接字。
确保 Azure 应用服务正在运行。 如果是,请尝试重新启动它。
错误(ConnectionFailure): 远程主机关闭了连接。 错误代码: 1002。 错误详细信息: 当状态代码应为 '101' 时,服务器返回了状态代码 '503'
确保选中了“启用流式处理终结点”复选框和/或启用了 Web 套接字。
确保 Azure 应用服务正在运行。 如果是,请尝试重新启动它。
错误(ConnectionFailure): 远程主机关闭了连接。 错误代码: 1011。 错误详细信息: 响应状态代码不是指示成功: 500 (InternalServerError)
机器人在其输出活动的讲话字段中指定了神经语音,但与你的资源密钥关联的 Azure 区域不支持神经语音。 请参阅神经语音和标准语音。
如果表格中的操作未解决你的问题,请参阅语音助手:常见问题解答。 如果在遵循本教程中的所有步骤后仍无法解决问题,请在语音助理 GitHub 页中输入新问题。
有关连接超时的说明
如果你已连接到机器人,但在过去五分钟内未发生任何活动,则服务将自动关闭与客户端和机器人建立的 Web 套接字连接。 这是设计的结果。 底部栏中会出现一条消息:“活动连接已超时,但可按需重新连接”。
无需选择“重新连接”按钮。 按下麦克风按钮并开始讲话,输入文本消息或者讲出关键字(如果已启用)。 随后将自动重新建立连接。
查看机器人活动
每个机器人都会发送和接收活动消息。 在 Windows 语音助理客户端的“活动日志”窗口中,带时间戳的日志显示客户端从机器人接收的每个活动。 通过使用 DialogServiceConnector.SendActivityAsync 方法,还可以查看客户端发送到机器人的活动。 选择某个日志项时,会以 JSON 格式显示关联活动的详细信息。
下面是客户端接收到的活动的示例 JSON:
"attachments":[],
"channelData":{
"conversationalAiData":{
"requestInfo":{
"interactionId":"8d5cb416-73c3-476b-95fd-9358cbfaebfa",
"version":"0.2"
"channelId":"directlinespeech",
"conversation":{
"id":"129ebffe-772b-47f0-9812-7c5bfd4aca79",
"isGroup":false
"entities":[],
"from":{
"id":"SpeechEchoBotTutorial-BotRegistration-8726"
"id":"89841b4d-46ce-42de-9960-4fe4070c70cc",
"inputHint":"acceptingInput",
"recipient":{
"id":"129ebffe-772b-47f0-9812-7c5bfd4aca79|0000"
"replyToId":"67c823b4-4c7a-4828-9d6e-0b84fd052869",
"serviceUrl":"urn:botframework:websocket:directlinespeech",
"speak":"<speak version='1.0' xmlns='https://www.w3.org/2001/10/synthesis' xml:lang='en-US'><voice name='en-US-JennyNeural'>Echo: Hello and welcome.</voice></speak>",
"text":"Echo: Hello and welcome.",
"timestamp":"2019-07-19T20:03:51.1939097Z",
"type":"message"
若要详细了解 JSON 输出中返回的内容,请参阅活动中的字段。 对于本教程,你可以将重点放在文本和讲话字段上。
查看对语音 SDK 发出的调用的客户端源代码
Windows 语音助理客户端使用 NuGet 包 Microsoft.CognitiveServices.Speech,其中包含语音 SDK。 使用 VoiceAssistantClient\MainWindow.xaml.cs 文件中的 InitSpeechConnector()
方法可以非常方便地查看示例代码。该方法创建以下两个语音 SDK 对象:
- DialogServiceConfig:用于资源密钥及其区域等配置设置。
- DialogServiceConnector:管理用于处理识别到的语音和机器人响应的通道连接和客户端订阅事件。
添加自定义关键字激活
语音 SDK 支持自定义关键字激活。 类似于在 Microsoft 助手中讲出“你好,小娜”,你可以编写一个应用,以便持续收听所选的关键字。 请记住,关键字可以是单词,也可以是词组。
术语“关键字”经常可与术语“唤醒词”互换使用。 你可能会在 Microsoft 文档中看到这两种用法。
关键字检测是在客户端应用中进行的。 如果使用关键字,则只有在检测到关键字时,才会将音频流式传输到 Direct Line Speech 通道。 Direct Line Speech 通道包含一个称作“关键字验证”的组件,该组件在云中执行更复杂的处理,以验证所选关键字是否位于音频流的开头。 如果关键字验证成功,则通道将与机器人通信。
遵循以下步骤创建关键字模型,将 Windows 语音助理客户端配置为使用此模型,然后在机器人上对其进行测试:
- 使用语音服务创建自定义关键字。
- 解压缩在上一步骤中下载的模型文件。 该文件应已根据你的关键字命名。 查找的文件应该名为 kws.table。
- 在 Windows 语音助理客户端中,找到“设置”菜单(右上角的齿轮图标)。 对于“模型文件路径”,输入步骤 2 中获取的 kws.table 文件的完整路径名。
- 选中“已启用”复选框。 在复选框的旁边应会看到以下消息:“下次连接时将会收听关键字”。如果提供了错误的文件或路径无效,应会看到一条错误消息。
- 输入“订阅密钥”和“订阅密钥区域”的值,然后选择“确定”关闭“设置”菜单。
- 选择“重新连接”。 此时应会看到一条消息,指出:“已启动新对话 - 请键入内容、按下麦克风按钮,或者讲出关键字”。应用现在会持续收听。
- 讲出以关键字开头的任何短语。 例如:“{你的关键字},现在是什么时间?”你无需在讲出关键字后暂停讲话。 完成后,将发生两种情况:
- 你会看到讲话内容的听录版本。
- 你会听到机器人的响应。
- 继续使用机器人支持的三种输入类型进行试验:
- 在底部栏上输入文本
- 按下麦克风图标并讲话
- 讲出以关键字开头的短语
查看启用关键字检测的源代码
在 Windows 语音助手客户端的源代码中,使用以下文件查看用于启用关键字检测的代码:
- VoiceAssistantClient\Models.cs 包含对语音 SDK 方法 KeywordRecognitionModel.fromFile() 的调用。 此方法用于实例化磁盘上的本地文件中的模型。
- VoiceAssistantClient\MainWindow.xaml.cs 包含对语音 SDK 方法 DialogServiceConnector.StartKeywordRecognitionAsync() 的调用。 此方法可激活连续关键字检测。
可选:更改语言和机器人语音
创建的机器人将会收听英语讲话内容并以英语作答,使用默认的美式英语文本转语音声音。 但是,你并不局限于使用英语,也就是默认语音。
本部分介绍如何更改机器人收听和回答语言。 其中还介绍了如何为该语言选择不同的语音。
可以从语音转文本表格中提到的语言中选择任何一种。 以下示例将语言更改为德语。
打开 Windows 语音助理客户端应用,选择“设置”按钮(右上角的齿轮图标),然后在“语言”字段中输入“de-de”。 这是语音转文本表格中提到的区域设置值。
此步骤会设置要识别的讲话语言,并重写默认的“en-us”。 它还会指示 Direct Line Speech 通道使用默认的德语语音作为机器人的回复语音。
关闭“设置”页,然后选择“重新连接”按钮来与回显机器人建立新连接。
选择麦克风按钮,并讲出一个德语短语。 此时会显示已识别的文本,而回显机器人将以默认的德语语音给出回复。
更改默认的机器人语音
如果机器人以语音合成标记语言 (SSML) 而不是简单文本的形式指定了回复,则可以选择文本转语音声音并控制发音。 回显机器人不使用 SSML,但你可以轻松修改代码来让它这样做。
以下示例将 SSML 添加到回显机器人回复,以使用德语语音 de-DE-RalfNeural
(男性语音),而不是默认的女性语音。 参阅你的语言所支持的标准语音列表和神经语音列表。
打开 samples\csharp_dotnetcore\02.echo-bot\echo-bot.cs。
找到这些行:
var replyText = $"Echo: {turnContext.Activity.Text}";
await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
将其替换为以下代码:
var replyText = $"Echo: {turnContext.Activity.Text}";
var replySpeak = @"<speak version='1.0' xmlns='https://www.w3.org/2001/10/synthesis' xml:lang='de-DE'>
<voice name='de-DE-RalfNeural'>" +
$"{replyText}" + "</voice></speak>";
await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replySpeak), cancellationToken);
在 Visual Studio 中生成解决方案并修复任何生成错误。
方法 MessageFactory.Text
中的第二个参数设置机器人回复中的活动讲话字段。 做出上述更改后,回复形式即已从简单文本替换为 SSML,以指定非默认的德语语音。
重新部署机器人
对机器人做出所需的更改后,下一步是将它重新发布到 Azure 应用服务并尝试使用它:
在“解决方案资源管理器”窗口中,右键单击“EchoBot”项目并选择“发布”。
以前的部署配置已作为默认值加载。 选择“EchoBot20190805125647 - Web 部署”旁边的“发布”。
“发布成功”消息将显示在 Visual Studio 输出窗口中,同时会打开一个网页,其中显示了消息“你的机器人已准备就绪!”。
打开 Windows 语音助理客户端应用。 选择“设置”按钮(右上角齿轮图标),并确保“语言”字段仍设置为“de-de”
按照运行 Windows 语音助理客户端中的说明重新连接到新部署的机器人,以新的语言讲话,然后将会听到机器人使用该语言以新的语音给出回复。
如果你不打算继续使用本教程中部署的回显机器人,只需删除 Azure 资源组,即可删除该机器人及其关联的所有 Azure 资源:
- 在 Azure 门户中,选择“Azure 服务”下的“资源组”。
- 找到“SpeechEchoBotTutorial-ResourceGroup”资源组。 选择三点图标 (...)。
- 选择“删除资源组”。
- 部署到你附近的 Azure 区域以改进机器人的响应时间。
- 部署到支持优质神经文本转语音的 Azure 区域。
- 获取与 Direct Line Speech 通道相关的定价: