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