保存 Google Cloud Speech API 操作(作业)对象以便稍后检索结果
Save Google Cloud Speech API operation(job) object to retrieve results later
我很难将 Google 云语音 Api 与 ruby 客户端 (v0.22.2) 一起使用。
我可以执行长时间的 运行 作业,如果我使用
可以获得结果
job.wait_until_done!
但这会锁定服务器很长一段时间。
根据 API 文档,我真正需要的只是操作名称 (id)。
有没有什么方法可以根据操作名称创建作业对象并以这种方式检索它?
我似乎无法创建一个功能性的新作业对象,例如使用 @grpc_op
中的 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
真心希望这对某些人有意义。
在 google 的 ruby 客户端上苦苦挣扎,因为一切似乎都被翻译成比使用 API 所需的对象复杂得多的对象。
我在这里遗漏了什么技巧吗?
好的。有一个非常丑陋的方式来解决这个问题。
从作业对象中获取操作的 id
operation_id = job.grpc.grpc_op.name
获取访问令牌以手动使用 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!
进行 api 调用以检索操作详细信息。
这将 return 带有一个 "done" => true 参数,一旦结果出现就会显示结果。如果 "done" => true 不存在,那么您必须稍后再次轮询,直到它存在。
HTTParty.get(
"https://speech.googleapis.com/v1/operations/#{operation_id}",
headers: {"Authorization" => "Bearer #{token['access_token']}"}
)
一定有更好的方法来做到这一点。似乎是演讲 API.
的一个明显用例
房子里 google 的任何人都可以解释很多 simpler/cleaner 的方法吗?
您可以将此功能猴子修补到您正在使用的版本,但我建议升级到 google-cloud-speech 0.24.0 or later. With those more current versions you can use Operation#id
and Project#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:[=16= 中描述的解决方法将此功能猴子修补到旧版本]
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
我很难将 Google 云语音 Api 与 ruby 客户端 (v0.22.2) 一起使用。
我可以执行长时间的 运行 作业,如果我使用
可以获得结果job.wait_until_done!
但这会锁定服务器很长一段时间。
根据 API 文档,我真正需要的只是操作名称 (id)。
有没有什么方法可以根据操作名称创建作业对象并以这种方式检索它? 我似乎无法创建一个功能性的新作业对象,例如使用 @grpc_op
中的 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
真心希望这对某些人有意义。 在 google 的 ruby 客户端上苦苦挣扎,因为一切似乎都被翻译成比使用 API 所需的对象复杂得多的对象。 我在这里遗漏了什么技巧吗?
好的。有一个非常丑陋的方式来解决这个问题。
从作业对象中获取操作的 id
operation_id = job.grpc.grpc_op.name
获取访问令牌以手动使用 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!
进行 api 调用以检索操作详细信息。
这将 return 带有一个 "done" => true 参数,一旦结果出现就会显示结果。如果 "done" => true 不存在,那么您必须稍后再次轮询,直到它存在。
HTTParty.get(
"https://speech.googleapis.com/v1/operations/#{operation_id}",
headers: {"Authorization" => "Bearer #{token['access_token']}"}
)
一定有更好的方法来做到这一点。似乎是演讲 API.
的一个明显用例房子里 google 的任何人都可以解释很多 simpler/cleaner 的方法吗?
您可以将此功能猴子修补到您正在使用的版本,但我建议升级到 google-cloud-speech 0.24.0 or later. With those more current versions you can use Operation#id
and Project#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:[=16= 中描述的解决方法将此功能猴子修补到旧版本]
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