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

1 回复

更多关于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进行交互:

  1. 初始化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的构造方式,并相应地处理响应。

回到顶部