google gRPC在macOS中的简单使用
1. 简述
A high-performance, open-source universal RPC framework
gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。
gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务,使应用程序之间可以进行通信,而且也遵循service/client模型。在客户端调用service端提供的接口就像是调用本地函数一样,一般使用客户端快速能获取到服务器接口数据的时候,如:实时语音识别、翻译、语音合成等。
下面详解googleapis
里的gRPC的使用
2. cocopods
添加gRPC
- ios-docs-samples 下载googleapis库
- 找到并复制ios-docs-samples/speech-to-speech目录下的google文件夹和googleapis.podspec文件
- 将上述两个文件复制到自己工程主目录
- cd 到自己工程
- pod install –verbose 或 pod update –verbose (过程较慢,需要翻墙)
3. 示例
客户端代码、不会服务器<可以自行研究>
3.1 语音识别
// ZDASRService.h
#import <Foundation/Foundation.h>
#import <google/cloud/speech/v1p1beta1/CloudSpeech.pbobjc.h>
NS_ASSUME_NONNULL_BEGIN
typedef void (^SpeechRecognitionCompletionHandler)(BOOL done, StreamingRecognizeResponse *object, NSError *error);
@interface ZDASRService : NSObject
- (void)streamAudioData:(NSData *)audioData
languageCode:(NSString *)languageCode
withCompletion:(SpeechRecognitionCompletionHandler)completion;
- (void)stopStreaming;
- (BOOL)isStreaming;
@end
// ZDASRService.m
NS_ASSUME_NONNULL_END
#import "ZDASRService.h"
#import <GRPCClient/GRPCCall.h>
#import <RxLibrary/GRXBufferedPipe.h>
#import <ProtoRPC/ProtoRPC.h>
#import <google/cloud/speech/v1p1beta1/CloudSpeech.pbrpc.h>
@interface ZDASRService ()
@property (nonatomic, strong) Speech *client;
@property (nonatomic, strong) GRXBufferedPipe *writer;
@property (nonatomic, strong) GRPCProtoCall *call;
@property (nonatomic, assign) BOOL streaming;
@end
@implementation ZDASRService
- (id)init {
self = [super init];
if (self) {
[self defaultSetting];
}
return self;
}
- (void)defaultSetting {
}
- (void)streamAudioData:(NSData *)audioData
languageCode:(NSString *)languageCode
withCompletion:(SpeechRecognitionCompletionHandler)completion {
if (!_streaming) {
_client = [[Speech alloc] initWithHost:[ZDDogAPIService shared].dogApis];
_writer = [[GRXBufferedPipe alloc] init];
_call = [_client RPCToStreamingRecognizeWithRequestsWriter:_writer eventHandler:^(BOOL done, StreamingRecognizeResponse * _Nullable response, NSError * _Nullable error) {
completion(done, response, error);
}];
_call.requestHeaders[