使用C#在Microsoft botframework中对文本进行语音转换

时间:2018-11-20 07:35:58

标签: c# botframework speech-to-text

我在C#中使用Microsoft botframework创建了一个bot。现在我正在使用语音识别,因为我想知道一件事,是否可以控制麦克风的开/关,而不是在不可能的情况下针对网络聊天中的每个问题单击它,请告诉我如何将语音作为输入并获得从机器人以文本形式输出响应。现在,当我输入文本作为输入时,它以文本作为响应,当我输入语音作为输入时,它以语音作为响应,但是我希望当我输入语音作为输入时,它应该以文本作为响应。 预先感谢。

2 个答案:

答案 0 :(得分:0)

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

对于v3,没有可以使用的即用型解决方案。如this discussion中所述,您可能需要自己编写自定义解决方案以满足您的需求。但是,this discussion建议您可能已经有一种解决方案,可以适应您的需求。

对于v4,目前尚没有现成的解决方案,但正在考虑进行一些开发。阅读该讨论here

希望有帮助!

答案 1 :(得分:0)

如果您希望在机器人与您对话后打开麦克风,则需要将活动上的inputHint设置为ExpectingInput。如果您始终希望这样做,并且一次不发送多条消息,则可以使用ActivityMapper(v3)或中间件(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;
        }
    }
}