Flutter对话流管理插件dialogflow_grpc的使用
Flutter对话流管理插件dialogflow_grpc的使用
Auto-generated Flutter Dialogflow库用于通过gRPC检测意图。 这可以更快地与Dialogflow API集成,并且还可以进行音频流传输。 由Google Developer Advocate for Dialogflow,Lee Boonstra构建。
免责声明:此包由Google开发人员倡导者Lee Boonstra制作。这不是官方Google包。此包按原样提供,不作任何保证或陈述其用途或目的。请自由改进此包并贡献。
gRPC protos已从以下位置生成:
git clone https://github.com/googleapis/googleapis
git clone https://github.com/protocolbuffers/protobuf
文档
使用
在使用此包之前,启用Dialogflow API 在Google Cloud控制台中。
gcloud services enable dialogflow.googleapis.com
之后,下载具有Dialogflow集成访问权限的服务帐户JSON文件,并将其存储在项目中。(例如assets/credentials.json)
示例
编辑pubspec.yaml
文件以包含dialogflow_grpc
依赖项。
并指向您的服务帐户(例如assets/credentials.json)。
...
dependencies:
dialogflow_grpc: any
...
# The following section is specific to Flutter.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
assets:
- assets/credentials.json
导入此包并在代码中使用。加载服务帐户, 并创建一个DialogflowGrpc实例:
import 'package:dialogflow_grpc/v2beta1.dart';
import 'package:dialogflow_grpc/generated/google/cloud/dialogflow/v2beta1/session.pb.dart';
import 'package:dialogflow_grpc/dialogflow_auth.dart';
final serviceAccount = ServiceAccount.fromString(
'${(await rootBundle.loadString('assets/credentials.json'))}');
DialogflowGrpc dialogflow = DialogflowGrpc.viaServiceAccount(serviceAccount);
注意:当在生产应用中工作时 将服务帐户存储在客户端资产文件夹(甚至在安全密钥客户端钥匙链中)如果处理不当可能会很危险。首先,您需要非常小心地处理您的服务帐户。您将授予组件哪些读取和访问权限?如果您给Google Cloud的计算引擎提供了管理员权限,您可以想象攻击者可能会破解和反编译您的应用。当他们获得对您的计算引擎的访问权时,他们可能会通过例如为他们挖掘比特币来为您产生费用。即使您不对Google Cloud服务帐户授予计算访问权限,您仍然不会暴露您的密钥。尽管对于Dialogflow,它只为您提供项目中的聊天机器人访问权限,但如果最终用户在聊天中共享了个人信息数据(PII),攻击者可能能够从聊天历史中读取这些信息。这可能是一个巨大的问题。 此外,在应用程序中更换服务帐户密钥并不容易,因为您不希望当前用户的应用程序停止运行。那么,如何在移动客户端中安全地提供服务帐户和密钥?例如,可以通过构建一个机制来旋转(第二组)密钥。像使用JSON Web Tokens(JWT)一样,这是一种互联网建议标准,用于创建带有可选签名和可选加密的数据,其有效负载包含断言一些数量声明的JSON。这些令牌要么使用私有密钥要么使用公私钥对进行签名。或者,您可以运行(部分)集成在服务器上。
示例:DetectIntent
基于文本输入检测意图:
var data = await dialogflow.detectIntent(text, 'en-US');
print(data.queryResult.fulfillmentText);
示例:StreamingDetectIntent
基于音频流检测意图:
var biasList = SpeechContextV2Beta1(
phrases: [
'Dialogflow CX',
'Dialogflow Essentials',
'Action Builder',
'HIPAA'
],
boost: 20.0
);
var config = InputConfigV2beta1(
encoding: 'AUDIO_ENCODING_LINEAR_16',
languageCode: 'en-US',
sampleRateHertz: 8000,
singleUtterance: false,
speechContexts: [biasList]
);
// import 'dart:io' show Platform;
// On iOS
if (Platform.isIOS) {
config = InputConfigV2beta1(
encoding: 'AUDIO_ENCODING_LINEAR_16',
languageCode: 'en-US',
sampleRateHertz: 16000,
singleUtterance: false,
speechContexts: [biasList]
);
}
// Make the streamingDetectIntent call, with the InputConfig and the audioStream
final responseStream = dialogflow.streamingDetectIntent(config, _audioStream);
responseStream.listen((data) {
print(data);
});
示例:利用生成的代码
使用以下导入:
import 'package:dialogflow_grpc/generated/google/cloud/dialogflow/v2beta1/session.pb.dart';
官方API文档:https://cloud.google.com/dialogflow/es/docs/reference/rpc
示例:测试
确保您有一个服务帐户:assets/credentials.json
flutter test test/v2_test.dart
flutter test test/v2beta1_test.dart
环境
MacOS
https://flutter.dev/desktop
为了在MacOS应用中运行dialogflow_grpc,启用互联网。
编辑您的macos/Runner/
文件夹中的.entitlements文件。
<key>com.apple.security.network.client</key>
<true/>
Android
为了在Android设备上构建示例;
音频录制库sound_stream要求最低minSdk为21。因此,请在android/app/build.gradle
的defaultConfig块中更改此设置。
同时,别忘了进入虚拟设备设置并启用麦克风。
defaultConfig {
applicationId "com.myname.flutter_dialogflow_agent"
minSdkVersion 21
targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
iOS
为了在iOS设备上构建示例,您需要给麦克风权限。
将以下内容添加到ios/Runner/Info.plist
文件中。
<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for uploading videos</string>
更多关于Flutter对话流管理插件dialogflow_grpc的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter对话流管理插件dialogflow_grpc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用dialogflow_grpc
插件来管理对话流的示例代码。dialogflow_grpc
是一个Flutter插件,它允许你通过Google的Dialogflow API与你的对话流进行交互。
首先,确保你已经添加了dialogflow_grpc
到你的pubspec.yaml
文件中:
dependencies:
flutter:
sdk: flutter
dialogflow_grpc: ^x.y.z # 请替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,你需要在Dialogflow中创建一个项目,并获取相关的服务账号密钥文件(通常是一个JSON文件),然后将其放置在Flutter项目的某个安全位置,例如android/app/
目录下。
以下是一个基本的Flutter应用程序示例,它展示了如何使用dialogflow_grpc
插件与Dialogflow进行交互:
- 初始化Dialogflow客户端
import 'package:flutter/material.dart';
import 'package:dialogflow_grpc/dialogflow_grpc.dart';
import 'dart:io';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Dialogflow gRPC Example'),
),
body: DialogflowExample(),
),
);
}
}
class DialogflowExample extends StatefulWidget {
@override
_DialogflowExampleState createState() => _DialogflowExampleState();
}
class _DialogflowExampleState extends State<DialogflowExample> {
late SessionsClient _sessionsClient;
late SessionName _sessionName;
late String _projectId = 'your-project-id'; // 替换为你的Dialogflow项目ID
late String _sessionId = 'unique-session-id'; // 替换或生成一个唯一的会话ID
@override
void initState() {
super.initState();
// 读取服务账号密钥文件
final credentialsPath = File('path/to/your/service-account-file.json').absolute.path;
// 初始化Dialogflow客户端
_sessionsClient = SessionsClient.create(credentials: ServiceAccountCredentials.fromJson(File(credentialsPath).readAsStringSync()));
_sessionName = SessionName.fromProjectSession(_projectId, _sessionId);
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextField(
decoration: InputDecoration(
labelText: 'Enter text',
),
onSubmitted: (text) async {
await sendTextMessage(text);
},
),
Text('Response: $_response', style: TextStyle(fontSize: 18)),
],
),
);
}
late String _response = '';
Future<void> sendTextMessage(String text) async {
try {
// 创建检测请求
final request = DetectIntentRequest()
..session = _sessionName
..queryInput = QueryInput()
..text = TextInput()
..text = text
..languageCode = 'en-US';
// 发送请求并获取响应
final response = await _sessionsClient.detectIntent(request: request);
final queryResult = response.queryResult;
// 更新UI
setState(() {
_response = queryResult.fulfillmentText ?? 'No response';
});
} catch (e) {
print('Error: $e');
}
}
}
在这个示例中:
- 我们在
initState
方法中初始化了Dialogflow客户端,并设置了会话名称。 - 使用
TextField
来接收用户输入,并在用户提交输入时调用sendTextMessage
方法。 sendTextMessage
方法构建了一个DetectIntentRequest
,并将其发送到Dialogflow以获取响应。- 最后,将响应文本显示在UI上。
请注意,你需要将your-project-id
替换为你的Dialogflow项目ID,将unique-session-id
替换或生成一个唯一的会话ID,并将path/to/your/service-account-file.json
替换为你的服务账号密钥文件的实际路径。
这个示例展示了基本的文本消息传递。如果你需要处理更多类型的消息(如图像、音频等),你可能需要调整QueryInput
的构造方式,并相应地处理响应。