Botframework 网络聊天中的语音服务-文本到语音-如何忽略响应中的某些文本

Botframework 网络聊天中的语音服务-文本到语音-如何忽略响应中的某些文本,botframework,Botframework,在我的网络聊天中,我的意图处理代码用一些嵌入超链接的文本进行响应,这样用户就可以从聊天窗口单击这些文本。在我启用speech之前,这一切都很好,现在这些超链接正在被使用。我是否可以在文本响应中使用标记,以便语音服务忽略某些文本,如超链接 谢谢 拉里 我是否可以在文本响应中使用标记,以便语音服务忽略某些文本,如超链接 您可以使用正则表达式从文本中检测超链接,然后显式指定要显示的文本和要说出的文本,如下所示: var mes = "For details, please check https://

在我的网络聊天中,我的意图处理代码用一些嵌入超链接的文本进行响应,这样用户就可以从聊天窗口单击这些文本。在我启用speech之前,这一切都很好,现在这些超链接正在被使用。我是否可以在文本响应中使用标记,以便语音服务忽略某些文本,如超链接

谢谢

拉里

我是否可以在文本响应中使用标记,以便语音服务忽略某些文本,如超链接

您可以使用正则表达式从文本中检测超链接,然后显式指定要显示的文本和要说出的文本,如下所示:

var mes = "For details, please check https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/faqs";

var res = "";

if (Regex.Match(mes, @"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?").Success)
{
    res = Regex.Replace(mes, @"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?", "the link");
}

await context.SayAsync(text: $"{mes}", speak: $"{res}");
测试结果:


我会制作一个
IMessagActivityMapper
,为您进行类似的检查。通过这种方式,它将检查您在一个位置发送回的每个响应,而不必在您发送回url的任何位置都进行检查

public sealed class TextToSpeakActivityMapper : IMessageActivityMapper
{
    public IMessageActivity Map(IMessageActivity message)
    {
        // only set the speak if it is not set by the developer.
        var channelCapability = new ChannelCapability(Address.FromActivity(message));

        if (channelCapability.SupportsSpeak() && string.IsNullOrEmpty(message.Speak))
        {
            message.Speak = Regex.Replace(message.Text, @"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?", "the link");
        }

        return message;
    }
}
然后在Global.asax.cs文件中注册:

builder.RegisterType<TextToSpeakActivityMapper>()
       .AsImplementedInterfaces()
       .SingleInstance();
builder.RegisterType()
.AsImplementedInterfaces()
.SingleInstance();