From d41f03d723424430c4514155cf301dfbe6575654 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Wed, 6 Jan 2021 17:06:50 +0800 Subject: [PATCH] 2021-01-06 17:06:50 --- new/mobi-dl-tflite/03.md | 56 ++++++++++++++++++++-------------------- new/mobi-dl-tflite/04.md | 4 +-- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/new/mobi-dl-tflite/03.md b/new/mobi-dl-tflite/03.md index b8cf6829..b0f9eb26 100644 --- a/new/mobi-dl-tflite/03.md +++ b/new/mobi-dl-tflite/03.md @@ -104,7 +104,7 @@ Dialogflow 项目在 Google Cloud 上运行,并且能够从与构建会话相 ![](img/104abf6b-28d0-4e6f-9017-eb6f41014458.png) -3. 填写代理的名称。 我们将其命名为 DemoBot。 +3. 填写代理的名称。 我们将其命名为`DemoBot`。 4. 将任何现有的 Google Project 链接到聊天机器人。 如果您还没有合格的 Google Project,则单击“创建”按钮时将创建一个新项目。 您需要在 Google Project 上启用结算功能才能创建 Dialogflow 聊天机器人。 要了解如何创建 Google Project,请访问[这里](https://cloud.google.com/billing/docs/how-to/manage-billing-account)。 @@ -117,16 +117,16 @@ Dialogflow 控制台是图形用户界面,用于管理聊天机器人,意图 ![](img/635ba230-6053-43ed-8a4e-40e792ba29ab.png) -Dialogflow 控制台提示您创建一个新的 Intent。 让我们创建一个新的 Intent,该 Intent 可以识别用户名并使用它为用户生成一个幸运数字。 +Dialogflow 控制台提示您创建一个新的意图。 让我们创建一个新的意图,该意图可以识别用户名并使用它为用户生成一个幸运数字。 # 创建一个意图并获取实体 现在,我们将创建一个意图,该意图从用户那里获取输入并确定用户名称。 然后,该意图提取名称的值并将其存储在一个实体中,该实体稍后将传递给 Webhook 进行处理。 请按照以下步骤操作: 1. 单击屏幕右上方的创建意图按钮。 意向创建表单打开。 -2. 我们必须为该意图提供一个名称,例如 luckyNum。 然后,向下滚动到“训练短语”部分并添加一个训练短语:`name is John`。 +2. 我们必须为该意图提供一个名称,例如`luckyNum`。 然后,向下滚动到“训练短语”部分并添加一个训练短语:`name is John`。 -3. 抓住所需的实体,然后选择单词 John。 将出现一个下拉列表,将单词与任何预定义实体匹配。 我们将使用`@sys.person`实体获取名称并将其存储为 userName 参数,如以下屏幕截图所示: +3. 抓住所需的实体,然后选择单词`John`。 将出现一个下拉列表,将单词与任何预定义实体匹配。 我们将使用`@sys.person`实体获取名称并将其存储为`userName`参数,如以下屏幕截图所示: ![](img/0676c8eb-7bb9-4b8a-8059-9e9f4c5e6970.png) @@ -134,7 +134,7 @@ Dialogflow 控制台提示您创建一个新的 Intent。 让我们创建一个 ![](img/cc535d0f-79fc-43f9-8788-6db34aa44b6a.png) -5. 现在,只要用户查询类似于 name 的东西,就会将某些东西提取到$ userName 变量中。 现在可以将其传递到 webhook 或 Firebase Cloud Function 以根据其值生成响应。 +5. 现在,只要用户查询类似于名称的东西,就会将某些东西提取到`$userName`变量中。 现在可以将其传递到 webhook 或 Firebase Cloud Function 以根据其值生成响应。 现在,让我们添加一个操作,以便可以通过 Google Assistant 访问 Dialogflow 代理。 @@ -181,7 +181,7 @@ Google 平台上的操作为有兴趣构建聊天机器人的开发人员提供 在顶部栏上,您将看到内置 Action 的 Google Project 的项目 ID。在左侧垂直导航栏上,您需要执行的所有不同步骤才能完成操作 操作的设置将列出。 在右侧的主要内容部分,提供了一个快速演练来设置您的第一个 Action。 -6. 单击确定如何调用操作。 您需要为您的操作提供唯一的调用字符串。 对于本章中的示例,我们使用了 Talk to Peter please 调用。 您将需要选择稍微不同的调用。 +6. 单击确定如何调用操作。 您需要为您的操作提供唯一的调用字符串。 对于本章中的示例,我们使用了`Talk to Peter please`调用。 您将需要选择稍微不同的调用。 成功设置调用后,演练将要求您添加一个动作。 @@ -203,12 +203,12 @@ Google 平台上的操作为有兴趣构建聊天机器人的开发人员提供 前面的屏幕快照中的对话框使您可以快速定义 Dialogflow 代理与 Google 项目中的操作之间的集成设置。 4. 在“默认调用”下,将“默认欢迎意图”设置为当用户开始通过 Google Assistant 与您的聊天机器人进行交互时将首先运行的意图。 -5. 在隐式调用中,指定我们之前创建的 luckyNum 意图。 这将用于为用户生成幸运数字。 +5. 在隐式调用中,指定我们之前创建的`luckyNum`意图。 这将用于为用户生成幸运数字。 6. 启用自动预览更改是个好主意,因为它使您可以将集成设置自动传播到 Google Console 上的“操作”和 Google Assistant 测试模拟器(我们将在稍后讨论),以便在为以下版本创建版本之前测试我们的应用程序 它。 -现在,让我们为“默认欢迎意图”提供有意义的提示,以要求用户输入其名称,以便在用户做出响应时,其输入类似于 luckyNum 意图的训练短语,从而调用它: +现在,让我们为“默认欢迎意图”提供有意义的提示,以要求用户输入其名称,以便在用户做出响应时,其输入类似于`luckyNum`意图的训练短语,从而调用它: -1. 单击“意图”按钮。 然后,单击“默认欢迎意图”。 向下滚动到“意图”编辑页面的“响应”部分,然后删除那里的所有响应。 由于 luckyNum 意图希望用户说类似`My name is XYZ`的内容,因此合适的问题是`What is your name?`。 因此,我们将响应设置为`Hi, what is your name?`。 +1. 单击“意图”按钮。 然后,单击“默认欢迎意图”。 向下滚动到“意图”编辑页面的“响应”部分,然后删除那里的所有响应。 由于`luckyNum`意图希望用户说类似`My name is XYZ`的内容,因此合适的问题是`What is your name?`。 因此,我们将响应设置为`Hi, what is your name?`。 请注意,“响应”部分的选项卡式导航中有一个名为“Google 助手”的新导航栏。 这样,当我们从 Google Assistant 调用此意图时,我们可以为其指定其他响应。 @@ -220,13 +220,13 @@ Google 平台上的操作为有兴趣构建聊天机器人的开发人员提供 4. 如果缺少前面两个事件中的任何一个,则可以通过简单地键入它们并从出现的自动建议框中选择它们来包括它们。 5. 单击 Dialogflow 控制台中间部分右上方的“保存”。 -现在,我们准备创建我们的业务逻辑,以便为用户生成幸运数字。 首先,我们将为 luckyNum 意图创建一个 Webhook,然后将其部署到 Firebase 的 Cloud Functions 中。 +现在,我们准备创建我们的业务逻辑,以便为用户生成幸运数字。 首先,我们将为`luckyNum`意图创建一个 Webhook,然后将其部署到 Firebase 的 Cloud Functions 中。 # 实施 Webhook -在本节中,我们将为 luckyNum 意图启用 webhook,并为 luckyNum 意图的逻辑准备 webhook 代码。 请按照以下步骤操作: +在本节中,我们将为`luckyNum`意图启用 webhook,并为`luckyNum`意图的逻辑准备 webhook 代码。 请按照以下步骤操作: -1. 打开 luckyNum 意图的意图编辑页面,然后向下滚动到“实现”部分。 在这里,启用“为此意图启用 webhook 调用”选项。 +1. 打开`luckyNum`意图的意图编辑页面,然后向下滚动到“实现”部分。 在这里,启用“为此意图启用 webhook 调用”选项。 现在,此意图将寻找从 webhook 生成的响应。 @@ -257,7 +257,7 @@ const app = dialogflow({debug: true}); 注意,这里的 Dialogflow 变量是`actions-on-google`模块的对象。 -5. 将 Webhook 响应的 Intent 设置为`luckyNum`,然后将其传递给`conv`变量: +5. 将 Webhook 响应的意图设置为`luckyNum`,然后将其传递给`conv`变量: ```py app.intent('luckyNum', (conv, {userName}) => { @@ -277,13 +277,13 @@ app.intent('luckyNum', (conv, {userName}) => { exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app); ``` -我们在本节中开发的脚本需要部署到服务器以使其响应。 我们将使用 Cloud Functions for Firebase 部署此脚本并将其用作聊天机器人的 webhook 端点。 +我们在本节中开发的脚本需要部署到服务器以使其响应。 我们将为 Firebase 使用 Cloud Functions 部署此脚本并将其用作聊天机器人的 webhook 端点。 # 将 Webhook 部署到 Firebase 的云功能 既然我们已经完成了 Webhook 的逻辑创建,那么在 Firebase 上使用 Cloud Functions 部署它就非常简单。 请按照以下步骤操作: -1. 单击 Dialogflow 控制台左侧导航上的 Fulfillment 按钮。 使内联编辑器能够添加您的 Webhook 并将其直接部署到 Cloud Functions。 +1. 单击 Dialogflow 控制台左侧导航上的`Fulfillment`按钮。 使内联编辑器能够添加您的 Webhook 并将其直接部署到 Cloud Functions。 您必须清除内联编辑器中的默认样板代码才能执行此操作。 @@ -307,13 +307,13 @@ exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app); 1. 在 Google 控制台上的操作中单击概述,您将看到准备部署的提示。 2. Actions 测试控制台要求您输入一些 Action 所需的信息。 这些通常是简短和长格式的说明,开发人员的详细信息,隐私政策,操作条款和条件以及徽标。 成功填写所有内容后,单击“保存”。 -3. 在“部署”类别下的左侧导航栏中单击“发布”,以打开“发布”页面。 在这里,选择 Alpha 发布选项,然后单击 Submit 发布。 +3. 在“部署”类别下的左侧导航栏中单击“发布”,以打开“发布”页面。 在这里,选择`Alpha`发布选项,然后单击`Submit`发布。 部署将需要几个小时才能完成。 部署完成后,您将能够在已登录到内置 Action 的 Google 帐户的任何设备上测试您的操作。成功创建并部署 Dialogflow 代理后,我们现在将使用以下方法开发 Flutter 应用程序: 与代理进行交互的能力。 单屏应用程序将具有与任何基本的移动聊天应用程序非常相似的用户界面,带有一个用于输入消息的文本框,这些消息是 Dialogflow 代理的查询,还有一个将每个查询发送到代理的发送按钮。 该屏幕还将包含一个列表视图,以显示来自用户的所有查询和来自代理的响应。 另外,在“发送”按钮旁边将有一个麦克风选项,以便用户可以利用语音到文本功能将查询发送到代理。 # 为会话应用程序创建 UI -我们将从使用一些硬编码文本为应用程序创建基本用户界面开始,以测试 UI 是否正确更新。 然后,我们将集成 Dialogflow 代理,以便它可以回答查询并告诉用户他们的幸运数字,然后添加一个 mic 选项,以便我们可以利用语音转文本功能。 +我们将从使用一些硬编码文本为应用程序创建基本用户界面开始,以测试 UI 是否正确更新。 然后,我们将集成 Dialogflow 代理,以便它可以回答查询并告诉用户他们的幸运数字,然后添加一个`mic`选项,以便我们可以利用语音转文本功能。 该应用程序的整体小部件树如下所示: @@ -389,7 +389,7 @@ Widget _buildTextComposer() { } ``` -`_buildTextComposer()`函数返回一个以`Container`作为其子元素的`IconTheme`小部件。 容器包含由文本字段和我们在“步骤 1”和`2`中创建的发送按钮组成的 Row 小部件。 +`_buildTextComposer()`函数返回一个以`Container`作为其子元素的`IconTheme`小部件。 容器包含由文本字段和我们在“步骤 1”和`2`中创建的发送按钮组成的`Row`小部件。 在下一节中,我们将构建`ChatMessage`小部件,该小部件用于显示用户与聊天机器人的交互。 @@ -406,7 +406,7 @@ Widget _buildTextComposer() { ```py new Container( margin: const EdgeInsets.only(top: 8.0), - child: new Text(“Here is the query text”, + child: new Text("Here is the query text", style: TextStyle( fontSize: 16.0, color: Colors.black45, @@ -422,7 +422,7 @@ new Container( ```py new Container( margin: const EdgeInsets.only(top: 8.0), - child: new Text(“This will be the response string”, + child: new Text("This will be the response string", style: TextStyle( fontSize: 16.0 ), @@ -444,7 +444,7 @@ Widget build(BuildContext context) { children: [ new Container( margin: const EdgeInsets.only(top: 8.0), - child: new Text(“Here is the query text”, + child: new Text("Here is the query text", style: TextStyle( fontSize: 16.0, color: Colors.black45, @@ -453,7 +453,7 @@ Widget build(BuildContext context) { ), new Container( margin: const EdgeInsets.only(top: 8.0), - child: new Text(“this will be the response text”, + child: new Text("this will be the response text", style: TextStyle( fontSize: 16.0 ), @@ -503,7 +503,7 @@ Widget build(BuildContext context) { } ``` -以`ChatMessages`作为其子元素的`ListView`被制作为`Flexible`,以便在放置分隔符和文本字段的容器之后,可以在垂直方向上占据屏幕上可用的整个空间。 在所有四个基本方向上都给`8.0`填充。 另外,将`reverse`属性设置为 true 可以使其在底部到顶部的方向上滚动。 `itemBuilder`属性被分配索引的当前值,以便它可以构建子项。 另外,为`itemCount`分配了一个值,该值可帮助列表视图正确估计最大可滚动内容。 列的第二个子级创建分隔符。 这是一条`devicePixel`粗水平线,标记了列表视图和文本字段的分隔。 在该列的最底部位置,我们将带有文本字段的容器作为其子容器。 这是通过对我们先前定义的`_buildTextComposer()`进行方法调用而构建的。 +以`ChatMessages`作为其子元素的`ListView`被制作为`Flexible`,以便在放置分隔符和文本字段的容器之后,可以在垂直方向上占据屏幕上可用的整个空间。 在所有四个基本方向上都给`8.0`填充。 另外,将`reverse`属性设置为`true`可以使其在底部到顶部的方向上滚动。 `itemBuilder`属性被分配索引的当前值,以便它可以构建子项。 另外,为`itemCount`分配了一个值,该值可帮助列表视图正确估计最大可滚动内容。 列的第二个子级创建分隔符。 这是一条`devicePixel`粗水平线,标记了列表视图和文本字段的分隔。 在该列的最底部位置,我们将带有文本字段的容器作为其子容器。 这是通过对我们先前定义的`_buildTextComposer()`进行方法调用而构建的。 6. 在`ChatScreen.dart`方法内定义`_handleSubmit()`,以正确响应用户的“发送消息”操作: @@ -511,7 +511,7 @@ Widget build(BuildContext context) { void _handleSubmitted(String query) { _textController.clear(); ChatMessage message = new ChatMessage( - query: query, response: “This is the response string”, + query: query, response: "This is the response string", ); setState(() { _messages.insert(0, message); @@ -606,7 +606,7 @@ Future _handleSubmitted(String query) async { } ``` -首先,我们通过指定`assets`文件夹的路径来创建一个名为`authGoogle`的`AuthGoogle`实例。 接下来,我们创建`Dialogflow`代理的实例,该实例指定 Google 身份验证实例以及用于与其通信的语言。 在这里,我们选择了英语。 然后使用`response.getMessage()`提取响应,并将其存储在`rsp`字符串变量中,然后在创建`ChatMessage`实例时传递该变量,以确保两个字符串(输入文本和响应)均在 HTG6 上正确更新。 屏幕。 +首先,我们通过指定`assets`文件夹的路径来创建一个名为`authGoogle`的`AuthGoogle`实例。 接下来,我们创建`Dialogflow`代理的实例,该实例指定 Google 身份验证实例以及用于与其通信的语言。 在这里,我们选择了英语。 然后使用`response.getMessage()`提取响应,并将其存储在`rsp`字符串变量中,然后在创建`ChatMessage`实例时传递该变量,以确保两个字符串(输入文本和响应)均在屏幕上正确更新。 以下屏幕快照显示了在进行上述修改以反映用户的实际查询和 Dialogflow 代理的响应之后的应用程序: @@ -675,7 +675,7 @@ String transcription = ''; `_speechRecognition`是`SpeechRecognition`的实例。 `_isAvailable`很重要,因为它可以让平台(Android/iOS)知道我们正在与之交互,并且`_isListening`将用于检查应用程序当前是否正在监听麦克风。 -最初,我们将两个`boolean`变量的值都设置为 false。 `transcription`是一个字符串变量,将用于存储已侦听的字符串。 +最初,我们将两个`boolean`变量的值都设置为`false`。 `transcription`是一个字符串变量,将用于存储已侦听的字符串。 2. 定义`activateSpeechRecognizer()`方法以设置音频操作: @@ -697,7 +697,7 @@ void activateSpeechRecognizer() { } ``` -在前面的代码片段中,我们在`_speechRecognition`内部初始化了`SpeechRecognition`的实例。 然后,我们通过调用`_speechRecognition.setAvailabilityHandler()`回调函数来设置`AvailabilityHandler`,该回调函数需要传回可以分配给`_isAvailable`的`boolean`结果。 接下来,我们设置`RecognitionStartedHandler`,该功能在启动语音识别服务时执行,并将`_isListening`设置为 true 表示移动设备的麦克风当前处于活动状态并且正在监听。 然后,我们使用`setRecognitionResultHandler`设置`RecognitionResultHandler`,这将给我们返回生成的文本。 这存储在字符串转录中。 最后,我们设置`RecognitionCompleteHandler`,当麦克风停止收听时,将`_isListening`设置为 false。 +在前面的代码片段中,我们在`_speechRecognition`内部初始化了`SpeechRecognition`的实例。 然后,我们通过调用`_speechRecognition.setAvailabilityHandler()`回调函数来设置`AvailabilityHandler`,该回调函数需要传回可以分配给`_isAvailable`的`boolean`结果。 接下来,我们设置`RecognitionStartedHandler`,该功能在启动语音识别服务时执行,并将`_isListening`设置为`true`表示移动设备的麦克风当前处于活动状态并且正在监听。 然后,我们使用`setRecognitionResultHandler`设置`RecognitionResultHandler`,这将给我们返回生成的文本。 这存储在字符串转录中。 最后,我们设置`RecognitionCompleteHandler`,当麦克风停止收听时,将`_isListening`设置为`false`。 3. 公开内部的`initState()`函数调用`activateSpeechRecognizer()`来设置`_speechRecognition`实例,如下所示: @@ -746,7 +746,7 @@ Widget createMicButton() { 首先,我们使用`_isAvailable`和`_isListening`变量检查麦克风是否可用并且尚未在收听用户的声音。 如果`if`语句中的条件为`true`,则将`_isListening`的值设置为`true`。 然后,我们通过调用`_speechRecognition`上的`.listen()`方法开始监听。 `locale`参数指定语言,此处为`en_US`。 相应的字符串存储在`transcription`变量中。 -当第二次按下麦克风停止录制时,由于`_isListening`的值设置为`true`,因此`if`条件将不满足。 现在,执行`else`块。 在这里,通过传递 the 本的值以使其可以与代理进行交互来调用`_handleSubmitted()`,然后使用结果将`_isListening`的值设置为`true`: +当第二次按下麦克风停止录制时,由于`_isListening`的值设置为`true`,因此`if`条件将不满足。 现在,执行`else`块。 在这里,通过传递记录的字符串以使其可以与代理进行交互来调用`_handleSubmitted()`,然后使用结果将`_isListening`的值设置为`true`: ![](img/12804f8e-a618-412e-af67-62295156578e.png) diff --git a/new/mobi-dl-tflite/04.md b/new/mobi-dl-tflite/04.md index 3859d500..7c8dd6c0 100644 --- a/new/mobi-dl-tflite/04.md +++ b/new/mobi-dl-tflite/04.md @@ -213,7 +213,7 @@ train_generator = datagen.flow_from_directory( subset='training') ``` -`datagen`对象采用两个参数-`rescale`和`validation_split`。 `rescale`参数告诉对象将所有黑白图像转换为`0`到`255`的范围,就像**红色,绿色和蓝色**(**RGB**)的规模,因为 MobileNet 模型已经在 RGB 图像上进行了训练。 `validation_split`参数从数据集中分配 20%(0.2 x 100)的图像作为验证集。 但是,我们也需要为验证集创建一个生成器,就像我们为训练集所做的那样。 +`datagen`对象采用两个参数-`rescale`和`validation_split`。 `rescale`参数告诉对象将所有黑白图像转换为`0`到`255`的范围,就像**红色,绿色和蓝色**(**RGB**)的规模,因为 MobileNet 模型已经在 RGB 图像上进行了训练。 `validation_split`参数从数据集中分配 20%(`0.2 x 100`)的图像作为验证集。 但是,我们也需要为验证集创建一个生成器,就像我们为训练集所做的那样。 训练集生成器`train_generator`接受`target_size`和`batch_size`参数以及其他参数。 `target_size`参数设置要生成的图像的尺寸。 这样做是为了与 MobileNet 模型中的图像尺寸匹配。 `batch_size`参数指示单个批次应生成多少个图像。 @@ -704,7 +704,7 @@ aaptOptions { 前面的代码段确保`tflite`文件未以压缩形式存储在 **Android 应用包**(**APK**)中。 -3. 接下来,我们需要将已经保存的`model.tflite`和`labels.txt`文件包括在 assests 文件夹中,如以下屏幕截图所示: +3. 接下来,我们需要将已经保存的`model.tflite`和`labels.txt`文件包括在`assests`文件夹中,如以下屏幕截图所示: ![](img/bda97e78-3717-4a7b-9ab6-980f3be77066.png) -- GitLab