2017-08-31 12 views
0

Rubyクライアント(v0.22.2)でGoogleクラウドスピーチApiを使用するのに苦労しています。GoogleクラウドスピーチAPI操作(ジョブ)オブジェクトを保存して後で結果を取得する

私は、長時間実行されるジョブを実行することができますし、私は

job.wait_until_done! 

を使用した場合の結果を得ることができますが、これは、時間の長い期間とすることができます何のためにサーバーをロックします。

APIドキュメントによれば、本当に必要なのは操作名(id)だけです。

操作名からジョブオブジェクトを作成し、それを取得する方法はありますか?本当に望ん

speech = Google::Cloud::Speech.new(auth_credentials) 
job = speech.recognize_job file, options 

saved_job = job.to_json #Or some element of that object such that I can retrieve it. 

Later, I want to do something like.... 
job_object = Google::Cloud::Speech::Job.new(saved_job) 

job.reload! 

job.done? 

job.results 

:私は、そのような私が何をしたいのか@grpc_op

からIDを使用するなどの機能新しいジョブオブジェクトを作成することができないよう のようなものですそれは誰かにとって理にかなっている。 Googleのルビークライアントでは、APIを使用するよりもはるかに複雑なオブジェクトにすべてが翻訳されているように思えるので、かなり苦労しています。 私はここで行方不明のトリックはありますか?

答えて

1

この機能を使用しているバージョンにサンクすることはできますが、以降にアップグレードすることをお勧めします。これらの最新バージョンでは、これを達成するためにOperation#idProject#operationを使用できます。

require "google/cloud/speech" 

speech = Google::Cloud::Speech.new 

audio = speech.audio "path/to/audio.raw", 
        encoding: :linear16, 
        language: "en-US", 
        sample_rate: 16000 

op = audio.process 
# get the operation's id 
id = op.id #=> "1234567890" 

# construct a new operation object from the id 
op2 = speech.operation id 

# verify the jobs are the same 
op.id == op2.id #=> true 

op2.done? #=> false 
op2.wait_until_done! 
op2.done? #=> true 

results = op2.results 

更新アップグレードすることはできませんので、あなたがGoogleCloudPlatform/google-cloud-ruby#1214に記載されている回避策を使用して旧バージョンにモンキーパッチこの機能は次のことができます。

require "google/cloud/speech" 

# Add monkey-patches 
module Google 
    Module Cloud 
    Module Speech 
     class Job 
     def id 
      @grpc.name 
     end 
     end 
     class Project 
     def job id 
      Job.from_grpc(OpenStruct.new(name: id), speech.service).refresh! 
     end 
     end 
    end 
    end 
end 

# Use the new monkey-patched methods 
speech = Google::Cloud::Speech.new 

audio = speech.audio "path/to/audio.raw", 
        encoding: :linear16, 
        language: "en-US", 
        sample_rate: 16000 

job = audio.recognize_job 
# get the job's id 
id = job.id #=> "1234567890" 

# construct a new operation object from the id 
job2 = speech.job id 

# verify the jobs are the same 
job.id == job2.id #=> true 

job2.done? #=> false 
job2.wait_until_done! 
job2.done? #=> true 

results = job2.results 
+0

はるかに便利になります。 私の問題は、おそらく私にとってユニークなものです。アップグレードすると、別のバージョンのgoogle apiクライアントに移行します。これは、私がやっている他のものと互換性がありません(私たちは、リワークの全負荷。 これは、大部分のケースでは明らかに正しいことです。 – Carpela

+0

この機能を古いバージョンにサンクさせる方法を示すために更新されました。 – blowmage

+0

ここにいくつかの問題があります。 まず、サルパッチはそれを定義せずに「スピーチ」を使用します。これは未定義のメソッドエラーにつながります。 NameError:#のための未定義のローカル変数またはメソッド 'speech' 第2に、それを修正した場合、from_grpcメソッドはそのバージョンの1つの引数(id)図書館。 speech.serviceオブジェクトを渡すことはできません。 ArgumentError:引数の数が間違っています(指定2、予定1) 〜/ vendor/bundle/gems/google-cloud-speech-0.22.2/lib/google/cloud/speech/job.rb: 151:from_grpc ' – Carpela

0

問題を解決するための非常に醜い方法を持ってください。

は、手動操作の詳細を取得するためのAPI呼び出しを行いますRestAPI

json_key_io = StringIO.new(ENV["GOOGLE_CLOUD_SPEECH_JSON_KEY"]) 
authorisation = Google::Auth::ServiceAccountCredentials.make_creds(
    json_key_io:json_key_io, 
    scope:"https://www.googleapis.com/auth/cloud-platform" 
) 
token = authorisation.fetch_access_token! 

を使用するアクセストークンを取得するジョブオブジェクト

operation_id = job.grpc.grpc_op.name 

からの操作のIDを取得します。

結果は "done" => trueのパラメータとともに返され、結果が表示されます。 "done" => trueが存在しない場合は、後で再びポーリングする必要があります。

HTTParty.get(
    "https://speech.googleapis.com/v1/operations/#{operation_id}", 
    headers: {"Authorization" => "Bearer #{token['access_token']}"} 
) 

これを行うには、より良い方法が必要です。音声APIのような明白な使用例と思われます。

Googleの誰もが、もっと簡単で洗練されたやり方を説明することができますか?

関連する問題