Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

使用Google云语音和自然语言API创建智能APP

by
Difficulty:IntermediateLength:LongLanguages:

Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)

几十年来,不管是科学爱好者,程序员还是AI研究人员,一直梦寐以求实现一个真正理解自然语言的APP。今天,感谢机器学习技术的巨大进步,梦想终于照进现实。 而且,基于云的服务(如Google云机器学习)已经把这些技术免费提供给每个人使用了。

在本教程中,你将学习如何使用Google云机器学习平台提供的两种功能强大的自然语言API:Cloud Speech APICloud Natural Language API。使用它们,你可以创建处理各种语言的语音APP。

准备工作

你需要的东西:

  • Android Studio 2.2或更高版本
  • 一个谷歌云平台帐户
  • 运行Android 4.4或更高版本的设备

1.为什么要使用这些API?

可以处理语音的APP必须具有以下功能:

  • 它必须能够从原始音频数据中提取单个单词。
  • 它必须能够对提取的单词之间的语法关系作出有根据的猜测。

云语音和云自然语言API能够让你在几分钟内将上述功能添加到你的Android APP中。

云语音API作为最先进的语音识别器,可以准确地转录超过80种语言的语音。它可以强大到处理区域口音和嘈杂条件下的语音。

云自然语言API是一种语言处理系统,以近人类的精确度来确定句子中词语的角色。它目前支持十种语言,并提供实体和情感分析。

2.启用API

在使用语音和自然语言API之前,你必须在Google Cloud 控制台中启用它们。所以登录到控制台,进入API Manager > Library

Cloud console library

要启用Speech API,请点击Google Cloud Machine Learning部分中的Speech API链接。在接下来打开的页面中,按Enable按钮。

Enabling Cloud Speech API

点击浏览器的返回按钮返回上一页。

这一次,通过点击自然语言API链接并点击下一页上的Enable按钮启用自然语言API。

Enabling Cloud Natural Language API

你还需要一个API密钥来与API进行交互。如果你还没有,请打开Credentials选项卡,点击Create credentials按钮,然后选择“ API”键

现在,你会看到一个显示API密钥的弹出窗口。记下这个密钥,以便以后使用。

API key generated

3.配置项目

这两个API都是基于JSON的,具有REST端点,你可以直接使用任何网络库进行交互。 然而,使用可用的Google API Client库编写更易读的代码,这样你就可以节省大量时间。打开app module级的build.gradle文件,添加以下compile 依赖项:

此外,我们将在本教程中执行一些文件I/O操作。为了简化,添加Commons IO库的依赖关系。

最后,不要忘记在AndroidManifest.xml文件中申请INTERNET权限。否则APP将无法连接到Google服务器。

4.使用Cloud Speech API

不用说,Cloud Speech API会将音频数据作为其输入之一。因此,我们现在要创建一个可以转录音频文件的Android APP。 

为了简单起见,我们只会转录FLAC文件,FLAC文件使用免费无损音频编解码器格式。你设备上可能已经有这样的文件。如果没有,建议你从维基共享资源中下载。

步骤1:创建布局

我们APP的布局有一个Button控件,用户点击后会显示文件选择器,然后浏览并选择设备上可用的音频文件。

布局还有一个TextView控件来显示所选音频文件的文本。代码如下:

步骤2:创建文件选择器

当用户点击我们在上一步中创建的按钮时,会显示文件选择器界面,所以要设置OnClickListener事件。在此操作之前,请确保已经使用findViewById()方法初始化按钮了。

使用Android的存储访问框架(可运行在API等级19或更高版本的设备上)很轻松创建文件选择器。你只需创建一个ACTION_GET_CONTENT 动作的intent,并传递给  startActivityForResult()方法。 或者,你可以通过给Intent对象的setType()方法传递MIME参数来限制文件选择程序仅显示FLAC文件。

文件选择器输出的是另一个Intent对象,该对象包含用户选择的文件URI。为了能够访问,你必须重写Activity类的onActivityResult()方法。

步骤3:编码文件

Cloud Speech API期望音频数据采用Base64字符串的形式。要生成这样的字符串,可以将用户选择的文件内容读取到byte数组中,然后传递给Google API Client库提供的encodeBase64String()方法。

然而,你当前只有所选文件的URI,而不是文件的绝对路径。这意味着,你必须先解析URI才能读取文件。 将该URI传递给activity的内容解析者提供的openInputStream()方法。 访问文件的输入流后,你可以简单地将其传递给IOUtils类的  toByteArray()方法,该方法将其转换为字节数组。代码如下:

如上面的代码所示,我们使用一个新的线程来运行所有的I/O操作。这样做是为了防止阻塞UI。

步骤4:播放文件

在我看来,转录的过程中就播放被转录的声音是个好主意。这实现很简单,却改善了用户体验。

使用MediaPlayer类播放声音文件。一旦使用setDataSource()方法指向文件的URI ,必须调用prepare()方法来同步准备播放器。 当播放器准备就绪时,就可以调用start()方法开始播放文件。

此外,一旦文件播放完,必须记住释放播放器的资源。为此,请分配一个OnCompletionListener对象并调用其release()方法。代码如下:

步骤5:同步转录文件

现在,将Base64编码的音频数据发送到Cloud Speech API进行转录。但首先,我建议将之前生成的API密钥存储为Activity类的成员变量。

为了能够与Cloud Speech API通信,必须用Speech.Builder实例创建一个Speech对象。需要为构造方法传递HTTP传输和JSON工厂这两个参数。 另外,为了确保在API的每个HTTP请求中都包含了API密钥,必须将SpeechRequestInitializer对象与构建器关联并将API密钥传递给过去。

以下代码使用AndroidJsonFactory 类作为JSON工厂创建Speech对象,用NetHttpTransport类作为HTTP传输:

Cloud Speech API必须被告知音频文件包含哪种语言。你可以通过创建RecognitionConfig 对象并调用其setLanguageCode() 方法来实现。以下是将其配置为仅转录美式英文的方法:

此外,Base64编码的字符串必须包装在一个RecognitionAudio对象中才能被API使用。

接下来,必须创建SyncRecognizeRequest对象才能使用RecognitionConfigRecognitionAudio对象。顾名思义,它用来创建一个HTTP请求,以便同步转录音频数据。 创建对象后,可以将其作为参数传递给syncrecognize()方法,并调用Speech.SpeechOperations.Syncrecognize对象的execute() 方法来执行HTTP请求。

execute()方法返回值是一个SyncRecognizeResponse对象,它包含几个可选记录。这里,我们使用选择第一项。

最后,将文本传递给TextView控件来显示。当然,只能在UI线程更新UI,请确保调用activity的runOnUiThread()方法之后执行此操作。

运行应用程序,选择包含美式英语演讲的FLAC文件,并查看Cloud Speech API为其生成文本。

要注意,Cloud Speech API目前只能处理单声道音频文件。如果发送多个频道的文件会报错。

5.使用Cloud Natural Language API

现在有一个文本,将其传递给Cloud Natural Language API进行分析。为了简单起见,我们只进行实体和情绪分析。 换句话说,我们要确定文本中提到的所有实体,如人员,地点和职业,还要判断其总体情绪是消极的,中立的还是积极的。

步骤1:更新布局

为了让用户开始,布局必须包含另一个Button控件。将以下代码添加到activity的XML布局文件中:

步骤2:Annotate the Transcript

Cloud Natural Language REST API提供了一个名为annotateText的选项 ,它让你只需一个HTTP请求即可在文档上运行情绪和实体分析。我们用它来分析文本。

因为分析必须在用户点击按钮时开始,需要添加一个OnClickListener事件。

要使用Google API Client库与API进行交互,必须使用CloudNaturalLanguage.Builder类创建CloudNaturalLanguage对象  。它的构造方法还需要HTTP传输和JSON工厂这两个参数。

此外,通过分配CloudNaturalLanguageRequestInitializer实例给它,可以强制它将API密钥添加到所有请求中。

要使用API​​分析的所有文本必须放在Document对象内。 该Document对象还必须包含配置信息,如文本的语言,以及它是否被格式化为纯文本或HTML。代码如下:

接下来,必须创建一个Features对象来指定你感兴趣的特征。以下代码显示了如何创建一个Features对象,该对象表示你要提取实体并仅运行情绪分析。

现在可以使用DocumentFeatures对象来组合一个  AnnotateTextRequest对象,该对象被传递给annotateText()方法,然后生成AnnotateTextResponse对象。

请注意,我们正在开启一个新线程,因为在UI线程上不允许网络操作。

通过调用AnnotateTextResponse对象的getEntities()方法,  你可以从AnnotateTextResponse对象中提取实体列表。同样,你可以通过调用getDocumentSentiment()方法来提取文本的整体情绪。 然而,为了获得情感的实际分数,你必须调用getScore()返回float值。

机智如你,情绪分数等于零意味着情绪是中性的,得分大于零意味着情绪是积极的,小于零的分数意味着情绪是负面的。

如何处理实体列表和情绪评当然取决于你。这里,我们使用一个AlertDialog来显示它们。

使用上述代码,情绪分数将显示在对话框的标题中,实体列表将显示在其正文中。

如果运行APP,应该能够分析音频文件的内容以及转录它们。

结语

现在,你应该知道如何使用云语音和云自然语言API来创建一个Android APP了吧,它不仅可以转录音频文件,还可以对其执行实体和情绪分析。在本教程中,你还学到了如何使用Android的存储访问框架和Google Client API库。

Google一直在给这两个API增加新的有趣功能,比如同时支持更多的语言。要保持最新状态,请参阅官方文档

当你看到这里,你还可以看看关于移动APP云服务和机器学习的其他文章。

关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.