Xamarin.Forms 和 Azure 认知服务简介

Microsoft 认知服务是一组可供开发人员使用的 API、SDK 和服务,通过添加面部识别、语音识别和语言理解等功能,使应用程序更加智能。 本文将介绍一个示例应用程序,用于演示如何调用某些 Microsoft 认知服务 API。

概述

随附的示例是一个待办事项列表应用程序,可提供以下功能:

  • 查看任务列表。
  • 通过软键盘或使用 Microsoft 语音 API 执行语音识别来添加和编辑任务。
  • 使用必应拼写检查 API 对任务进行拼写检查。 有关详细信息,请参阅使用必应拼写检查 API 进行拼写检查。
  • 使用翻译器 API 将任务从英语翻译成德语。 有关详细信息,请参阅使用翻译器 API 进行文本翻译
  • 删除任务。
  • 将任务的状态设置为“完成”。

警告

必应语音 API 已弃用,取而代之的是 Azure 语音服务。 有关专门针对 Azure 语音服务的示例,请参阅使用语音服务 API 进行语音识别

任务存储在本地 SQLite 数据库中。 有关使用本地 SQLite 数据库的详细信息,请参阅使用本地数据库

启动应用程序时会显示 TodoListPage。 此页显示存储在本地数据库中的任何任务的列表,并允许用户创建新任务或对应用程序进行评分:

TodoListPage

可以通过单击 + 按钮来创建新项目,该按钮将导航到 TodoItemPage。 也可以通过选择任务导航到此页:

TodoItemPage

TodoItemPage 允许创建、编辑、拼写检查、翻译、保存和删除任务。 语音识别可用于创建或编辑任务。 这是通过按麦克风按钮开始录制,并再次按同一按钮停止录制来实现的,此操作会将录制内容发送到必应语音识别 API。

了解应用程序剖析

示例应用程序的共享代码项目由五个主要文件夹组成:

Folder 目的
模型 包含应用程序的数据模型类。 这包括 TodoItem 类,该类对应用程序使用的单个数据项进行建模。 该文件夹还包括用于对从不同 Microsoft 认知服务 API 返回的 JSON 响应进行建模的类。
存储库 包含用于执行数据库操作的 ITodoItemRepository 接口和 TodoItemRepository 类。
服务 包含用于访问不同 Microsoft 认知服务 API 的接口和类,以及 DependencyService 类查找在平台项目中实现接口的类所使用的接口。
Utils 包含 Timer 类,AuthenticationService 类使用该类每 9 分钟更新一个 JWT 访问令牌。
视图 包含应用程序的页面。

共享代码项目还包含一些重要文件:

文件 目的
Constants.cs Constants 类,用于指定调用的 Microsoft 认知服务 API 的 API 密钥和终结点。 API 密钥常量需要更新才能访问不同的认知服务 API。
App.xaml.cs App 类负责实例化应用程序将在每个平台上显示的第一页,以及用于调用数据库操作的 TodoManager 类。

NuGet 包

示例应用程序使用以下 NuGet 包:

  • Newtonsoft.Json – 为 .NET 提供 JSON 框架。
  • PCLStorage – 提供一组跨平台的本地文件 IO API。
  • sqlite-net-pcl – 提供 SQLite 数据库存储。
  • Xam.Plugin.Media - 提供跨平台拍照和选取 API。

此外,这些 NuGet 包还会安装自己的依赖项。

数据建模

示例应用程序使用 TodoItem 类对本地 SQLite 数据库中显示和存储的数据进行建模。 以下代码示例演示 TodoItem 类:

public class TodoItem
{
  [PrimaryKey, AutoIncrement]
  public int ID { get; set; }
  public string Name { get; set; }
  public bool Done { get; set; }
}

ID 属性用于唯一标识每个 TodoItem 实例,并使用 SQLite 属性进行修饰,使该属性成为数据库中自动递增的主键。

调用数据库操作

TodoItemRepository 类实现数据库操作,可以通过 App.TodoManager 属性访问该类的实例。 TodoItemRepository 类提供以下方法来调用数据库操作:

  • GetAllItemsAsync – 从本地 SQLite 数据库检索所有项。
  • GetItemAsync – 从本地 SQLite 数据库检索指定项。
  • SaveItemAsync – 在本地 SQLite 数据库中创建或更新项。
  • DeleteItemAsync – 从本地 SQLite 数据库中删除指定项。

平台项目实现

共享代码项目中的 Services 文件夹包含 IFileHelperIAudioRecorderService 接口,DependencyService 类使用这两个接口来查找在平台项目中实现接口的类。

IFileHelper 接口由每个平台项目中的 FileHelper 类实现。 此类由单个方法 GetLocalFilePath 组成,该方法返回用于存储 SQLite 数据库的本地文件路径。

IAudioRecorderService 接口由每个平台项目中的 AudioRecorderService 类实现。 此类由 StartRecordingStopRecording 和支持方法组成,这些方法使用平台 API 从设备的麦克风录制音频并将其存储为 wav 文件。 在 iOS 上,AudioRecorderService 使用 AVFoundation API 录制音频。 在 Android 上,AudioRecordService 使用 AudioRecord API 录制音频。 在通用 Windows 平台 (UWP) 上,AudioRecorderService 使用 AudioGraph API 录制音频。

调用认知服务

示例应用程序调用以下 Microsoft 认知服务: