在GCP上使用Dart入门

“失踪的教程”系列

这是一个迟来的但希望仍然有用的补充。

Stackoverflow上的开发人员无法使用Dart(lang)找到有关Google Cloud Speech-to-Text API的良好文档。

我以前没有使用过Dart,也无法通过文档找到更多信息来提供反馈。 所以我去了。 这并不容易,但这主要是因为我真的不熟悉Dart,也没有使用过语音转文本API(但这并不复杂)。

追逐追赶,这里是解决方案“布鲁克林大桥多大了?”

设定

我正在运行Linux(Debian)。 尽管我是从zip而不是使用软件包管理器安装的,但我将提供安装Dartlang的指示信息(这里),但是您可以自己安装它。 我使用服务器SDK。

  PROJECT_ID = [[您的项目ID]] 
LANG =飞镖
  mkdir -p $ {HOME} / $ {PROJECT_ID} / $ {LANG} 
cd $ {HOME} / $ {PROJECT_ID} / $ {LANG}

您需要启用语音转文本API:

  gcloud服务启用了Speech.googleapis.com --project = $ {PROJECT} 

而且,您需要一个JSON密钥(无权限)服务帐户,以便您的代码可以访问API:

  ROBOT = [[您的服务帐户]] 
FILE = $ {PWD} / $ {ROBOT} .key.json
  gcloud iam服务帐户创建$ ROBOT \ 
--display-name = $机器人
--project = $ PROJECT
  gcloud iam服务帐户密钥创建$ {FILE} \ 
--iam-account=${ROBOT}@${PROJECT}.iam.gserviceaccount.com \
--project = $ PROJECT

舞台手

Dart的SDK包括Stagehand,该支架可用于脚手架项目(我使用了控制台应用程序),并有助于包装管理:

 麦克迪尔演讲&& cd演讲 
 舞台控制台全 

有用的是,该命令完成了有关如何进行的说明:

  ->提供必需的软件包,运行“ pub get” 
->使用`dart bin / main.dart`运行您的应用程序。

在运行pub get之前,我在Visual Studio Code中打开了目录,并决定需要添加对Google API客户端库的引用

题外话 :请参阅Google客户库说明。

令人困惑的是,有多个(无歧义)由Google管理的Dart GitHub库:https://github.com/dart-lang/gcloud、https://github.com/dart-lang/googleapis,并隐藏在其中https://github.com/dart-lang/googleapis/tree/master/generated/googleapis。 后者为我提供了有关使用Google Cloud Storage的示例的最大帮助。

我了解到Dart软件包的中央仓库在这里:

https://pub.dartlang.org/

通过googleapis搜索发现我这个:

https://pub.dartlang.org/packages/googleapis

随后,我意识到我需要OAuth软件包来:

https://pub.dartlang.org/packages/googleapis_auth

方便地,在任何这些页面上单击“安装”,即可将配置粘贴到pubspec.yaml

 依赖项: 
googleapis:^ 0.53.0
googleapis_auth:^ 0.2.7

然后,您可以运行pub get将这些软件包从存储库中提取到您的项目中。

客户

GitHub存储库提供了一些样板代码,用于访问由服务帐户JSON密钥授权的Google API客户端库(云存储):

 导入“ package:googleapis / 语音/v1.dart ”; 
导入“ package:googleapis_auth / auth_io.dart”;
  final _credentials =新的ServiceAccountCredentials.fromJson(r''' 
{
“ private_key_id”:...,
“ private_key”:...,
“ client_email”:...,
“ client_id”:...,
“ type”:“ service_account”
}
''');
  const _SCOPES = const [ SpeechApi.CloudPlatformScope ]; 
  void main(){ 
clientViaServiceAccount(_credentials,_SCOPES).then((http_client){
var Speech =新的SpeechApi (http_client);
言语...
});
}

猜测语音API的替换值很简单。

注意最好将服务帐户JSON密钥引用为文件,但我是菜鸟,因此使用了文本文字,如示例中所示,我将${ROBOT}.key.json的内容复制并粘贴到其中。

但是,这让我感到恼火是因为auth-io库接受JSON字符串或Dart Maps,但是当我实例化Speech API的recognize类时,它不是fromJson方法…..我最终不得不从头开始编写示例到了解这在Dart中是如何工作的:

注意:通过尝试对Google的代码进行反向工程,我学到了其他东西。 它使用例如core.String但是DartPad为此引起了错误。 我意识到core前缀是某种形式的别名,并查看了Google代码中的import 'dart:core' as core; 。 这可能是特定性的良好做法,并确保在编写例如String并从dart:core表示String确保它是您所得到的。

通过查看Google的语音转文本文档,我意识到我要使用的关键方法是recognize

https://cloud.google.com/speech-to-text/docs/reference/rest/v1/speech/recognize

该方法需要:

  { 
“配置”:{
对象(RecognitionConfig)
},
“音频”:{
对象(RecognitionAudio)
}
}

搜索GitHub存储库,发现:

https://github.com/dart-lang/googleapis/blob/9181a52ad90c47c56d38576090ebbc94957ab716/generated/googleapis/lib/speech/v1.dart#L442

签名看起来很有希望:

  async.Future 识别(RecognizeRequest请求) 

在Node.JS中使用了Future之后,我意识到样板代码使用了另一个Future,我有了起点:

  clientViaServiceAccount(_credentials,_SCOPES).then((...){...}) 

形式为:

 言语。  语音 .recognize(_recognizeRequest).then((response){...}) 

speech.recognize无法正常工作时,我检查了代码并与Cloud Storage进行了比较,发现:

  SpeechResourceApi获取语音 =>新的SpeechResourceApi(_requester); 

并且意识到我需要添加它(并且可能应该重新考虑我对第一个的命名)。

REST API文档显示该方法返回:

  { 
“结果”:[
{
对象(SpeechRecognitionResult)
}
]
}

但是,从源头来看,很明显,这在Dart库中称为RecognizeResponse 。 我得到了:

  speech.speech.recognize(_recognizeRequest).then((response){ 
对于(var result in response.results){
打印(result.toJson());
}
});

但是我花了很长时间(如上所述)才能弄清楚如何将Map | JSON传递给命令。 我最终使用源代码(和示例)作为指导:

 最终_json = { 
“音频”:{
“ content”:“ [[SEE BELOW]]
},
“配置”:{
“ encoding”:“ LINEAR16”,
“ sampleRateHertz”:16000,
“ languageCode”:“ en-US”
}
};
final _recognizeRequest = RecognizeRequest.fromJson(_json);

这似乎已经过去了,当我尝试dart bin/main.dart时,我不再收到严重错误。

我需要一个(base-64编码)样本文件。

方便地,Google文档完全涵盖了此问题:

https://cloud.google.com/speech-to-text/docs/base64-encoding

而且,我猜想在Google其他示例之一的某个地方,会有一个方便的音频文件可以使用:

https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/speech/cloud-client/resources

我使用了audio.raw

我通过它运行:

  base64 audio.raw -w 0>音频.b64 

而且,由于我仍然不知道如何在Dart中使用文件,因此我也将其内容复制并粘贴到了我的源代码中😉

然后,我运行它:

  dart bin / main.dart 

而且,它的工作原理是:

  { 
备择方案: [{
信心:0.9835046,
成绩单:布鲁克林大桥多大了
}]
}

结论

Google API(!)客户端库的一致性使语言之间的转换变得非常容易,因为API客户端库几乎是相同的(无论使用哪种语言),并且因为Google在记录其REST API方面做得很出色。

我想念并假设可以使用的一件事是Dart API的在线文档。 显然,Google的资源中包含大量基于注释的文档,但是我找不到显示该文档的网站。 显然,这将有所帮助。

19–04–04: 更新 -找到了文档: https://pub.dartlang.org/documentation/googleapis/latest/googleapis.speech.v1/googleapis.speech.v1-library.html ://pub.dartlang.org/documentation/googleapis/latest/googleapis.speech.v1/googleapis.speech.v1-library.html

通常,当我学习新的Google API时,我会使用Google的“优秀**” API Explorer来测试调用。 在这种情况下,API的结构很清晰,我面临的主要挑战是确定如何与Google机器生成的API客户端库进行交互。

希望这篇文章可以帮助其他人使用Dart(lang)和Google的API客户端库进行导航。

就这样!