为不受支持的语言构建LUIS机器人

时间:2018-06-28 09:17:16

标签: c# botframework luis microsoft-translator azure-cognitive-services

我想用.net框架构建一个智能的LUIS机器人,该机器人可以用C#理解英语以外的其他语言。由于LUIS不支持我的母语,因此我想实现翻译API,以便在LUIS生成输入之前将输入翻译为英语。到目前为止,我只有一个简单的LUIS机器人,并且可以使用翻译API的密钥,但是由于对编程非常陌生,因此我发现很难将其实现到该机器人。感谢代码示例对进一步构建代码的帮助。
编辑:到目前为止,这就是我所掌握的内容,当使用另一种语言编写时,我仍然在模拟器中遇到post 500错误。换句话说,LUIS API运行良好,这是翻译器API存在的问题。这是我的BasicLuisDialog.cs和RootDialog.cs:
BasicLuisDialog:

namespace Microsoft.Bot.Sample.LuisBot {

[Serializable]
public class BasicLuisDialog : LuisDialog<object>
{
    public BasicLuisDialog() : base(new LuisService(new LuisModelAttribute(
        ConfigurationManager.AppSettings["appid"],
        ConfigurationManager.AppSettings["key"],
        domain: ConfigurationManager.AppSettings["hostname"])))
    {
    }

    [LuisIntent("None")]
    public async Task NoneIntent(IDialogContext context, LuisResult result)
    {
        string message = $"Beklager, jeg forsto ikke '{result.Query}'. Skriv 'hjelp' om du trenger assistanse.";

        await context.PostAsync(message);

        context.Wait(this.MessageReceived);
    }

    [LuisIntent("Greeting")]
    public async Task GreetingIntent(IDialogContext context, LuisResult result)
    {
        await context.PostAsync($"Velkommen til vår nye chatbot! Hva kan vi hjelpe deg med?");

        context.Wait(this.MessageReceived);
    }

    [LuisIntent("Bot")]
    public async Task BotIntent(IDialogContext context, LuisResult result)
    {
        await context.PostAsync($" Jeg er laget av Microsoft sin teknologi innenfor Bot Framework og kunstig intelligens. Jeg er ikke så smart enda, men vil bli smartere for hver dag!");

        context.Wait(this.MessageReceived);
    }

    [LuisIntent("Hjelp")]
    public async Task HelpIntent(IDialogContext context, LuisResult result)
    {
        await context.PostAsync("Hei! Prøv å spørre meg om 'priser' eller 'support' ");

        context.Wait(this.MessageReceived);
    }
}

}

RootDialog:

namespace LuisBot.Dialogs {
[Serializable]
public class RootDialog
{
    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        var activity = await result;

        var MesInEn = await TranslateToEn(activity.Text);

        activity.Text = MesInEn;

        await context.Forward(new BasicLuisDialog(), AfterLuis, activity, CancellationToken.None);

        context.Wait(MessageReceivedAsync);
    }

    private async Task<string> TranslateToEn(string text)
    {
        var uri = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=en";
        var key = "translator_key";

        System.Object[] body = new System.Object[] { new { Text = text } };
        var requestBody = JsonConvert.SerializeObject(body);

        using (var client = new HttpClient())
        using (var request = new HttpRequestMessage())
        {
            request.Method = HttpMethod.Post;
            request.RequestUri = new Uri(uri);
            request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");
            request.Headers.Add("Ocp-Apim-Subscription-Key", key);

            var response = await client.SendAsync(request);
            var responseBody = await response.Content.ReadAsStringAsync();

            dynamic jsonResponse = JsonConvert.DeserializeObject(responseBody);
            var textinen = jsonResponse[0]["translations"][0]["text"].Value;

            return textinen;
        }
    }

    private async Task AfterLuis(IDialogContext context, IAwaitable<object> result)
    {
        context.Wait(MessageReceivedAsync);
    }
}

}

1 个答案:

答案 0 :(得分:0)

  

到目前为止,我只有一个简单的LUIS机器人,并且可以使用翻译API的密钥,但是由于对编程非常陌生,因此我发现很难将其实现到该机器人。

似乎您具有Translator Text API的密钥并创建了一个简单的LUIS机器人项目,将translate user inputs转换为英语并将其传递给LUIS对话框,您可以参考以下代码示例。

在RootDialog中:

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    var activity = await result;

    var MesInEn = await TranslateToEn(activity.Text);

    activity.Text = MesInEn;

    await context.Forward(new BasicLuisDialog(), AfterLuis, activity, CancellationToken.None);

    context.Wait(MessageReceivedAsync);
}

private async Task<string> TranslateToEn(string text)
{
    var uri = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=en";
    var key = "{your_key}";

    System.Object[] body = new System.Object[] { new { Text = text } };
    var requestBody = JsonConvert.SerializeObject(body);

    using (var client = new HttpClient())
    using (var request = new HttpRequestMessage())
    {
        request.Method = HttpMethod.Post;
        request.RequestUri = new Uri(uri);
        request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");
        request.Headers.Add("Ocp-Apim-Subscription-Key", key);

        var response = await client.SendAsync(request);
        var responseBody = await response.Content.ReadAsStringAsync();

        dynamic jsonResponse = JsonConvert.DeserializeObject(responseBody);
        var textinen = jsonResponse[0]["translations"][0]["text"].Value;

        return textinen;
    }
}


private async Task AfterLuis(IDialogContext context, IAwaitable<object> result)
{    
    context.Wait(MessageReceivedAsync);
}

测试结果:

enter image description here

注意:文本翻译的测试请求和回复

enter image description here