C# bot框架下的消息附件翻译

C# bot框架下的消息附件翻译,c#,botframework,C#,Botframework,我在bot框架中尝试多语言聊天机器人。 我成功地翻译了没有附件的普通信息。但我对像herocard或suggestedcard这样的附件有问题 var reply = stepContext.Context.Activity.CreateReply(); var card = new HeroCard(); card.Buttons = new List<CardAction>() { new CardAction() { Title = "1. All lights are gr

我在bot框架中尝试多语言聊天机器人。 我成功地翻译了没有附件的普通信息。但我对像herocard或suggestedcard这样的附件有问题

var reply = stepContext.Context.Activity.CreateReply();
var card = new HeroCard();

card.Buttons = new List<CardAction>()
{
new CardAction() { Title = "1. All lights are green.", Type = ActionTypes.ImBack, Value = "All lights are green." },
new CardAction() { Title = "2. DSL light is OFF/Red/Blinking Green.", Type = ActionTypes.ImBack, Value = "DSL light is OFF/Red/Blinking Green." },
new CardAction() { Title = "3. Internet light is OFF/Red/Amber or blinking red and green.", Type = ActionTypes.ImBack, Value = "Internet light is OFF/Red/Amber or blinking red and green." },
new CardAction() { Title = "4. Power light is OFF/Red/Amber or blinking.", Type = ActionTypes.ImBack, Value = "Power light is OFF/Red/Amber or blinking." },
};
reply.Attachments = new List<Attachment>() { card.ToAttachment() };
reply.AttachmentLayout = AttachmentLayoutTypes.List;

var options = new PromptOptions()
                {
                    Prompt = reply, 
                };

await stepContext.Context.SendActivityAsync(reply, cancellationToken);
var reply=stepContext.Context.Activity.CreateReply();
var卡=新卡();
card.Buttons=新列表()
{
new CardAction(){Title=“1.所有灯都是绿色的。”,Type=ActionTypes.ImBack,Value=“所有灯都是绿色的。”},
new CardAction(){Title=“2.DSL灯熄灭/红色/闪烁绿色。”,Type=ActionTypes.ImBack,Value=“DSL灯熄灭/红色/闪烁绿色。”},
new CardAction(){Title=“3.互联网指示灯关闭/红色/琥珀色或闪烁红色和绿色。”,Type=ActionTypes.ImBack,Value=“互联网指示灯关闭/红色/琥珀色或闪烁红色和绿色。”,
new CardAction(){Title=“4.电源指示灯关闭/红色/琥珀色或闪烁。”,Type=ActionTypes.ImBack,Value=“电源指示灯关闭/红色/琥珀色或闪烁。”,
};
reply.Attachments=newlist(){card.ToAttachment()};
reply.AttachmentLayout=AttachmentLayoutTypes.List;
var options=新的prompoptions()
{
提示=回复,
};
Wait stepContext.Context.SendActivityAsync(回复、取消令牌);

谢谢

您需要检查是否有任何附件。我有一些中间件设置speak on消息并使用以下代码:

if (string.IsNullOrEmpty(message.Text))
{
    if (message.Attachments[0].Content is HeroCard attachment)
    {
        message.Speak = TextToSpeechHelper.ConvertTextToSpeechText(attachment.Text);
    }
}
else
{
    message.Speak = TextToSpeechHelper.ConvertTextToSpeechText(message.Text);
}
你必须调整它来设置文本和翻译

下面是我的中间件的完整示例。请记住,此中间件将speak设置为文本,并设置输入提示

public class TextToSpeechMiddleware : IMiddleware
{
    private readonly IEnumerable<string> ignoreList;

    public TextToSpeechMiddleware(string speakIgnore)
    {
        ignoreList = GetSpeakIgnore(speakIgnore);
    }

    public Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default(CancellationToken))
    {
        turnContext.OnSendActivities(OnSendActivities);
        turnContext.OnUpdateActivity(OnUpdateActivity);

        return next(cancellationToken);
    }

    private static IEnumerable<string> GetSpeakIgnore(string value)
    {
        string[] ignoreList = value.Split(';');

        return ignoreList.Select(i => i.Trim())
                         .Where(i => !string.IsNullOrEmpty(i));
    }

    private Task<ResourceResponse> OnUpdateActivity(ITurnContext turnContext, Activity activity, Func<Task<ResourceResponse>> next)
    {
        ConvertTextToSpeech(activity);
        return next();
    }

    private Task<ResourceResponse[]> OnSendActivities(ITurnContext turnContext, List<Activity> activities, Func<Task<ResourceResponse[]>> next)
    {
        foreach (Activity currentActivity in activities.Where(a => a.Type == ActivityTypes.Message))
        {
            ConvertTextToSpeech(currentActivity);
        }

        return next();
    }

    private void ConvertTextToSpeech(Activity message)
    {
        Activity initialMessage = message;

        try
        {
            if (message.Type == ActivityTypes.Message)
            {
                bool ignoredSpeak = false;
                if (string.IsNullOrEmpty(message.Speak))
                {
                    if (string.IsNullOrEmpty(message.Text))
                    {
                        if (message.Attachments[0].Content is HeroCard attachment)
                        {
                            message.Speak = TextToSpeechHelper.ConvertTextToSpeechText(attachment.Text);
                        }
                    }
                    else
                    {
                        message.Speak = TextToSpeechHelper.ConvertTextToSpeechText(message.Text);
                    }

                    message.Speak = message.Speak.Trim();

                    if (ignoreList.Where(i => message.Speak.ToLower().StartsWith(i.ToLower())).Count() != 0)
                    {
                        message.Speak = null;
                        ignoredSpeak = true;
                    }
                }
                else if (string.IsNullOrWhiteSpace(message.Speak))
                {
                    message.Speak = " ";
                }

                if ((!string.IsNullOrEmpty(message.Speak) && (message.Speak.EndsWith("?") || message.Speak.StartsWith("Is this correct?")))
                     || (!string.IsNullOrEmpty(message.Text) && message.Text.EndsWith("?"))
                     || ignoredSpeak)
                {
                    message.InputHint = InputHints.ExpectingInput;
                }

                // IOs won't work with expecting input
                if (message.Recipient.Name.EndsWith(":ios"))
                {
                    message.InputHint = InputHints.AcceptingInput;
                }
            }

            // Logic needed to increase speech speed.
            // if (!string.IsNullOrEmpty(message.Speak))
            // {
            //    message.Speak = @"<speak version='1.0' " + "xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='en-GB'><prosody rate=\"1.5\">" + message.Speak + "</prosody></speak>";
            // }
        }
        catch (Exception)
        {
            message = initialMessage;
        }
    }
}
公共类TextToSpeechMiddleware:imidleware
{
私有只读IEnumerable ignoreList;
公共TextToSpeechMiddleware(字符串speakIgnore)
{
ignoreList=GetSpeakIgnore(speakIgnore);
}
公共任务OnTurnAsync(ITurnContext turnContext,NextDelegate next,CancellationToken CancellationToken=default(CancellationToken))
{
turnContext.OnSendActivities(OnSendActivities);
turnContext.onUpdate活动(onUpdate活动);
返回下一个(取消令牌);
}
私有静态IEnumerable GetSpeakIgnore(字符串值)
{
字符串[]ignoreList=value.Split(“;”);
返回ignoreList.Select(i=>i.Trim())
.Where(i=>!string.IsNullOrEmpty(i));
}
私有任务OnUpdateActivity(iTunesContext turnContext、Activity Activity、Func next)
{
ConvertTextToSpeech(活动);
返回next();
}
私有任务OnSendActivities(iTunesContext turnContext、列表活动、Func next)
{
foreach(Activity.Where中的Activity currentActivity(a=>a.Type==ActivityTypes.Message))
{
ConvertTextToSpeech(currentActivity);
}
返回next();
}
私有void convertexttospeech(活动消息)
{
活动初始消息=消息;
尝试
{
if(message.Type==ActivityTypes.message)
{
bool ignoredSpeak=false;
if(string.IsNullOrEmpty(message.Speak))
{
if(string.IsNullOrEmpty(message.Text))
{
如果(邮件。附件[0]。内容为贺卡附件)
{
message.Speak=TextToSpeechHelper.convertexttospeechtext(附件.Text);
}
}
其他的
{
message.Speak=TextToSpeechHelper.convertexttospeechtext(message.Text);
}
message.Speak=message.Speak.Trim();
if(ignoreList.Where(i=>message.Speak.ToLower().StartsWith(i.ToLower())).Count()!=0)
{
message.Speak=null;
ignoredSpeak=true;
}
}
else if(string.IsNullOrWhiteSpace(message.Speak))
{
message.Speak=“”;
}
if((!string.IsNullOrEmpty(message.Speak)和&(message.Speak.EndsWith(“?”)| | message.Speak.StartsWith(“这是否正确?”))
||(!string.IsNullOrEmpty(message.Text)和&message.Text.EndsWith(“?”))
||忽略(峰值)
{
message.InputHint=InputHints.ExpectingInput;
}
//IOs无法与预期的输入一起工作
if(message.Recipient.Name.EndsWith(“:ios”))
{
message.InputHint=InputHints.AcceptingInput;
}
}
//提高语速需要逻辑。
//如果(!string.IsNullOrEmpty(message.Speak))
// {
//message.Speak=@“+message.Speak+”;
// }
}
捕获(例外)
{
消息=初始消息;
}
}
}

您需要检查是否有任何附件。我有一些中间件设置speak on消息并使用以下代码:

if (string.IsNullOrEmpty(message.Text))
{
    if (message.Attachments[0].Content is HeroCard attachment)
    {
        message.Speak = TextToSpeechHelper.ConvertTextToSpeechText(attachment.Text);
    }
}
else
{
    message.Speak = TextToSpeechHelper.ConvertTextToSpeechText(message.Text);
}
你必须调整它来设置文本和翻译

下面是我的中间件的完整示例。请记住,此中间件将speak设置为文本,并设置输入提示

public class TextToSpeechMiddleware : IMiddleware
{
    private readonly IEnumerable<string> ignoreList;

    public TextToSpeechMiddleware(string speakIgnore)
    {
        ignoreList = GetSpeakIgnore(speakIgnore);
    }

    public Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default(CancellationToken))
    {
        turnContext.OnSendActivities(OnSendActivities);
        turnContext.OnUpdateActivity(OnUpdateActivity);

        return next(cancellationToken);
    }

    private static IEnumerable<string> GetSpeakIgnore(string value)
    {
        string[] ignoreList = value.Split(';');

        return ignoreList.Select(i => i.Trim())
                         .Where(i => !string.IsNullOrEmpty(i));
    }

    private Task<ResourceResponse> OnUpdateActivity(ITurnContext turnContext, Activity activity, Func<Task<ResourceResponse>> next)
    {
        ConvertTextToSpeech(activity);
        return next();
    }

    private Task<ResourceResponse[]> OnSendActivities(ITurnContext turnContext, List<Activity> activities, Func<Task<ResourceResponse[]>> next)
    {
        foreach (Activity currentActivity in activities.Where(a => a.Type == ActivityTypes.Message))
        {
            ConvertTextToSpeech(currentActivity);
        }

        return next();
    }

    private void ConvertTextToSpeech(Activity message)
    {
        Activity initialMessage = message;

        try
        {
            if (message.Type == ActivityTypes.Message)
            {
                bool ignoredSpeak = false;
                if (string.IsNullOrEmpty(message.Speak))
                {
                    if (string.IsNullOrEmpty(message.Text))
                    {
                        if (message.Attachments[0].Content is HeroCard attachment)
                        {
                            message.Speak = TextToSpeechHelper.ConvertTextToSpeechText(attachment.Text);
                        }
                    }
                    else
                    {
                        message.Speak = TextToSpeechHelper.ConvertTextToSpeechText(message.Text);
                    }

                    message.Speak = message.Speak.Trim();

                    if (ignoreList.Where(i => message.Speak.ToLower().StartsWith(i.ToLower())).Count() != 0)
                    {
                        message.Speak = null;
                        ignoredSpeak = true;
                    }
                }
                else if (string.IsNullOrWhiteSpace(message.Speak))
                {
                    message.Speak = " ";
                }

                if ((!string.IsNullOrEmpty(message.Speak) && (message.Speak.EndsWith("?") || message.Speak.StartsWith("Is this correct?")))
                     || (!string.IsNullOrEmpty(message.Text) && message.Text.EndsWith("?"))
                     || ignoredSpeak)
                {
                    message.InputHint = InputHints.ExpectingInput;
                }

                // IOs won't work with expecting input
                if (message.Recipient.Name.EndsWith(":ios"))
                {
                    message.InputHint = InputHints.AcceptingInput;
                }
            }

            // Logic needed to increase speech speed.
            // if (!string.IsNullOrEmpty(message.Speak))
            // {
            //    message.Speak = @"<speak version='1.0' " + "xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='en-GB'><prosody rate=\"1.5\">" + message.Speak + "</prosody></speak>";
            // }
        }
        catch (Exception)
        {
            message = initialMessage;
        }
    }
}
公共类TextToSpeechMiddleware:imidleware
{
私有只读IEnumerable ignoreList;
公共TextToSpeechMiddleware(字符串speakIgnore)
{
ignoreList=GetSpeakIgnore(speakIgnore);
}
公共任务OnTurnAsync(ITurnContext turnContext,NextDelegate next,CancellationToken CancellationToken=default(CancellationToken))
{
turnContext.OnSendActivities(OnSendActivities);
turnContext.onUpdate活动(onUpdate活动);
返回下一个(取消令牌);
}
私有静态IEnumerable GetSpeakIgnore(字符串值)
{
字符串[]ign