使用 c# 在 Microsoft botframework 中将语音转为文本

speech to text in microsoft botframework using c#

我使用 c# 中的 Microsoft botframework 创建了一个机器人。现在我正在使用语音识别,因为我想知道一件事,如果不可能的话,我们可以控制麦克风 on/off 而不是在网络聊天中为每个问题单击它然后请告诉我我们如何将语音作为输入并从机器人获取文本输出响应。现在,当我将文本作为输入提供文本作为响应,当我将语音作为输入提供语音作为响应时它提供文本作为响应,但我希望当我将语音作为输入提供语音时它应该以文本响应。 提前致谢。

这取决于您使用的 SDK 版本。

对于 v3,没有您可以使用的开箱即用的解决方案。如 this discussion, you may need to code a custom solution yourself to meet your needs. However, this discussion 中所述,表明可能已经有一个解决方案可以满足您的需求。

对于 v4,目前还没有开箱即用的解决方案,但已经进行了一些开发,正在考虑中。阅读该讨论 here

希望得到帮助!

如果你想让麦克风在机器人对你说话后打开,你需要将 activity 上的 inputHint 设置为 ExpectingInput。如果你总是想要它并且你不一次发送多条消息,那么你可以使用 ActivityMapper (v3) 或 Middleware (v4) 来设置它。请注意,对于 v3,ExpectingInput 在 ios 上中断。不过我不确定 v4。下面是一个示例中间件 (v4),如果文本或附件以“?”结尾,我会将 inputHint 设置为 ExpectingInput

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

        return next(cancellationToken);
    }

    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)
            {
                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 = null;
                }

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

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