Речь к тексту в Microsoft Software Botframework с помощью C#
Я создал бот, используя Microsoft Botframework в C#. Теперь я использую распознавание речи, в котором я хочу знать одну вещь: можем ли мы включать и выключать микрофон вместо того, чтобы щелкать по нему для каждого вопроса в веб-чате, если это невозможно, тогда, пожалуйста, скажите мне, как мы можем дать речь как ввод и получить выходной ответ в тексте от бота. Теперь он дает текст как ответ, когда я даю текст как ввод, и речь как ответ, когда я даю речь как ввод, но я хочу, чтобы он отвечал в тексте, когда я даю речь как ввод. Заранее спасибо.
2 ответа
Это зависит от используемой версии SDK.
Для версии 3 нет готовых решений, которые вы можете использовать. Как уже упоминалось в этом обсуждении, вам может понадобиться написать собственное решение, соответствующее вашим потребностям. Тем не менее, это обсуждение предполагает, что уже может быть решение, которое вы могли бы адаптировать к вашим потребностям.
Для v4 в настоящее время не существует готового решения, но оно находится на стадии рассмотрения, и некоторые разработки уже выполнены. Прочитайте это обсуждение здесь.
Надеюсь на помощь!
Если вы хотите, чтобы микрофон включался после того, как бот говорит с вами, вам нужно установить 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;
}
}
}