google-cloud-speech 0.41.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +2 -1
  3. data/AUTHENTICATION.md +51 -59
  4. data/LICENSE.md +203 -0
  5. data/MIGRATING.md +307 -0
  6. data/README.md +35 -49
  7. data/lib/google-cloud-speech.rb +19 -0
  8. data/lib/google/cloud/speech.rb +81 -142
  9. data/lib/google/cloud/speech/version.rb +1 -1
  10. metadata +103 -67
  11. data/LICENSE +0 -201
  12. data/lib/google/cloud/speech/v1.rb +0 -166
  13. data/lib/google/cloud/speech/v1/cloud_speech_pb.rb +0 -192
  14. data/lib/google/cloud/speech/v1/cloud_speech_services_pb.rb +0 -58
  15. data/lib/google/cloud/speech/v1/credentials.rb +0 -41
  16. data/lib/google/cloud/speech/v1/doc/google/cloud/speech/v1/cloud_speech.rb +0 -698
  17. data/lib/google/cloud/speech/v1/doc/google/longrunning/operations.rb +0 -51
  18. data/lib/google/cloud/speech/v1/doc/google/protobuf/any.rb +0 -131
  19. data/lib/google/cloud/speech/v1/doc/google/protobuf/duration.rb +0 -91
  20. data/lib/google/cloud/speech/v1/doc/google/rpc/status.rb +0 -39
  21. data/lib/google/cloud/speech/v1/helpers.rb +0 -136
  22. data/lib/google/cloud/speech/v1/speech_client.rb +0 -346
  23. data/lib/google/cloud/speech/v1/speech_client_config.json +0 -41
  24. data/lib/google/cloud/speech/v1/stream.rb +0 -615
  25. data/lib/google/cloud/speech/v1p1beta1.rb +0 -166
  26. data/lib/google/cloud/speech/v1p1beta1/cloud_speech_pb.rb +0 -200
  27. data/lib/google/cloud/speech/v1p1beta1/cloud_speech_services_pb.rb +0 -58
  28. data/lib/google/cloud/speech/v1p1beta1/credentials.rb +0 -41
  29. data/lib/google/cloud/speech/v1p1beta1/doc/google/cloud/speech/v1p1beta1/cloud_speech.rb +0 -758
  30. data/lib/google/cloud/speech/v1p1beta1/doc/google/longrunning/operations.rb +0 -51
  31. data/lib/google/cloud/speech/v1p1beta1/doc/google/protobuf/any.rb +0 -131
  32. data/lib/google/cloud/speech/v1p1beta1/doc/google/protobuf/duration.rb +0 -91
  33. data/lib/google/cloud/speech/v1p1beta1/doc/google/rpc/status.rb +0 -39
  34. data/lib/google/cloud/speech/v1p1beta1/helpers.rb +0 -136
  35. data/lib/google/cloud/speech/v1p1beta1/speech_client.rb +0 -346
  36. data/lib/google/cloud/speech/v1p1beta1/speech_client_config.json +0 -41
  37. data/lib/google/cloud/speech/v1p1beta1/stream.rb +0 -615
@@ -1,346 +0,0 @@
1
- # Copyright 2020 Google LLC
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- #
15
- # EDITING INSTRUCTIONS
16
- # This file was generated from the file
17
- # https://github.com/googleapis/googleapis/blob/master/google/cloud/speech/v1/cloud_speech.proto,
18
- # and updates to that file get reflected here through a refresh process.
19
- # For the short term, the refresh process will only be runnable by Google
20
- # engineers.
21
-
22
-
23
- require "json"
24
- require "pathname"
25
-
26
- require "google/gax"
27
- require "google/gax/operation"
28
- require "google/longrunning/operations_client"
29
-
30
- require "google/cloud/speech/v1/cloud_speech_pb"
31
- require "google/cloud/speech/v1/credentials"
32
- require "google/cloud/speech/version"
33
-
34
- module Google
35
- module Cloud
36
- module Speech
37
- module V1
38
- # Service that implements Google Cloud Speech API.
39
- #
40
- # @!attribute [r] speech_stub
41
- # @return [Google::Cloud::Speech::V1::Speech::Stub]
42
- class SpeechClient
43
- # @private
44
- attr_reader :speech_stub
45
-
46
- # The default address of the service.
47
- SERVICE_ADDRESS = "speech.googleapis.com".freeze
48
-
49
- # The default port of the service.
50
- DEFAULT_SERVICE_PORT = 443
51
-
52
- # The default set of gRPC interceptors.
53
- GRPC_INTERCEPTORS = []
54
-
55
- DEFAULT_TIMEOUT = 30
56
-
57
- # The scopes needed to make gRPC calls to all of the methods defined in
58
- # this service.
59
- ALL_SCOPES = [
60
- "https://www.googleapis.com/auth/cloud-platform"
61
- ].freeze
62
-
63
- # @private
64
- class OperationsClient < Google::Longrunning::OperationsClient
65
- self::SERVICE_ADDRESS = SpeechClient::SERVICE_ADDRESS
66
- self::GRPC_INTERCEPTORS = SpeechClient::GRPC_INTERCEPTORS
67
- end
68
-
69
- # @param credentials [Google::Auth::Credentials, String, Hash, GRPC::Core::Channel, GRPC::Core::ChannelCredentials, Proc]
70
- # Provides the means for authenticating requests made by the client. This parameter can
71
- # be many types.
72
- # A `Google::Auth::Credentials` uses a the properties of its represented keyfile for
73
- # authenticating requests made by this client.
74
- # A `String` will be treated as the path to the keyfile to be used for the construction of
75
- # credentials for this client.
76
- # A `Hash` will be treated as the contents of a keyfile to be used for the construction of
77
- # credentials for this client.
78
- # A `GRPC::Core::Channel` will be used to make calls through.
79
- # A `GRPC::Core::ChannelCredentials` for the setting up the RPC client. The channel credentials
80
- # should already be composed with a `GRPC::Core::CallCredentials` object.
81
- # A `Proc` will be used as an updater_proc for the Grpc channel. The proc transforms the
82
- # metadata for requests, generally, to give OAuth credentials.
83
- # @param scopes [Array<String>]
84
- # The OAuth scopes for this service. This parameter is ignored if
85
- # an updater_proc is supplied.
86
- # @param client_config [Hash]
87
- # A Hash for call options for each method. See
88
- # Google::Gax#construct_settings for the structure of
89
- # this data. Falls back to the default config if not specified
90
- # or the specified config is missing data points.
91
- # @param timeout [Numeric]
92
- # The default timeout, in seconds, for calls made through this client.
93
- # @param metadata [Hash]
94
- # Default metadata to be sent with each request. This can be overridden on a per call basis.
95
- # @param service_address [String]
96
- # Override for the service hostname, or `nil` to leave as the default.
97
- # @param service_port [Integer]
98
- # Override for the service port, or `nil` to leave as the default.
99
- # @param exception_transformer [Proc]
100
- # An optional proc that intercepts any exceptions raised during an API call to inject
101
- # custom error handling.
102
- def initialize \
103
- credentials: nil,
104
- scopes: ALL_SCOPES,
105
- client_config: {},
106
- timeout: DEFAULT_TIMEOUT,
107
- metadata: nil,
108
- service_address: nil,
109
- service_port: nil,
110
- exception_transformer: nil,
111
- lib_name: nil,
112
- lib_version: ""
113
- # These require statements are intentionally placed here to initialize
114
- # the gRPC module only when it's required.
115
- # See https://github.com/googleapis/toolkit/issues/446
116
- require "google/gax/grpc"
117
- require "google/cloud/speech/v1/cloud_speech_services_pb"
118
-
119
- credentials ||= Google::Cloud::Speech::V1::Credentials.default
120
-
121
- @operations_client = OperationsClient.new(
122
- credentials: credentials,
123
- scopes: scopes,
124
- client_config: client_config,
125
- timeout: timeout,
126
- lib_name: lib_name,
127
- service_address: service_address,
128
- service_port: service_port,
129
- lib_version: lib_version,
130
- metadata: metadata,
131
- )
132
-
133
- if credentials.is_a?(String) || credentials.is_a?(Hash)
134
- updater_proc = Google::Cloud::Speech::V1::Credentials.new(credentials).updater_proc
135
- end
136
- if credentials.is_a?(GRPC::Core::Channel)
137
- channel = credentials
138
- end
139
- if credentials.is_a?(GRPC::Core::ChannelCredentials)
140
- chan_creds = credentials
141
- end
142
- if credentials.is_a?(Proc)
143
- updater_proc = credentials
144
- end
145
- if credentials.is_a?(Google::Auth::Credentials)
146
- updater_proc = credentials.updater_proc
147
- end
148
-
149
- package_version = Google::Cloud::Speech::VERSION
150
-
151
- google_api_client = "gl-ruby/#{RUBY_VERSION}"
152
- google_api_client << " #{lib_name}/#{lib_version}" if lib_name
153
- google_api_client << " gapic/#{package_version} gax/#{Google::Gax::VERSION}"
154
- google_api_client << " grpc/#{GRPC::VERSION}"
155
- google_api_client.freeze
156
-
157
- headers = { :"x-goog-api-client" => google_api_client }
158
- if credentials.respond_to?(:quota_project_id) && credentials.quota_project_id
159
- headers[:"x-goog-user-project"] = credentials.quota_project_id
160
- end
161
- headers.merge!(metadata) unless metadata.nil?
162
- client_config_file = Pathname.new(__dir__).join(
163
- "speech_client_config.json"
164
- )
165
- defaults = client_config_file.open do |f|
166
- Google::Gax.construct_settings(
167
- "google.cloud.speech.v1.Speech",
168
- JSON.parse(f.read),
169
- client_config,
170
- Google::Gax::Grpc::STATUS_CODE_NAMES,
171
- timeout,
172
- errors: Google::Gax::Grpc::API_ERRORS,
173
- metadata: headers
174
- )
175
- end
176
-
177
- # Allow overriding the service path/port in subclasses.
178
- service_path = service_address || self.class::SERVICE_ADDRESS
179
- port = service_port || self.class::DEFAULT_SERVICE_PORT
180
- interceptors = self.class::GRPC_INTERCEPTORS
181
- @speech_stub = Google::Gax::Grpc.create_stub(
182
- service_path,
183
- port,
184
- chan_creds: chan_creds,
185
- channel: channel,
186
- updater_proc: updater_proc,
187
- scopes: scopes,
188
- interceptors: interceptors,
189
- &Google::Cloud::Speech::V1::Speech::Stub.method(:new)
190
- )
191
-
192
- @recognize = Google::Gax.create_api_call(
193
- @speech_stub.method(:recognize),
194
- defaults["recognize"],
195
- exception_transformer: exception_transformer
196
- )
197
- @long_running_recognize = Google::Gax.create_api_call(
198
- @speech_stub.method(:long_running_recognize),
199
- defaults["long_running_recognize"],
200
- exception_transformer: exception_transformer
201
- )
202
- @streaming_recognize = Google::Gax.create_api_call(
203
- @speech_stub.method(:streaming_recognize),
204
- defaults["streaming_recognize"],
205
- exception_transformer: exception_transformer
206
- )
207
- end
208
-
209
- # Service calls
210
-
211
- # Performs synchronous speech recognition: receive results after all audio
212
- # has been sent and processed.
213
- #
214
- # @param config [Google::Cloud::Speech::V1::RecognitionConfig | Hash]
215
- # Required. Provides information to the recognizer that specifies how to
216
- # process the request.
217
- # A hash of the same form as `Google::Cloud::Speech::V1::RecognitionConfig`
218
- # can also be provided.
219
- # @param audio [Google::Cloud::Speech::V1::RecognitionAudio | Hash]
220
- # Required. The audio data to be recognized.
221
- # A hash of the same form as `Google::Cloud::Speech::V1::RecognitionAudio`
222
- # can also be provided.
223
- # @param options [Google::Gax::CallOptions]
224
- # Overrides the default settings for this call, e.g, timeout,
225
- # retries, etc.
226
- # @yield [result, operation] Access the result along with the RPC operation
227
- # @yieldparam result [Google::Cloud::Speech::V1::RecognizeResponse]
228
- # @yieldparam operation [GRPC::ActiveCall::Operation]
229
- # @return [Google::Cloud::Speech::V1::RecognizeResponse]
230
- # @raise [Google::Gax::GaxError] if the RPC is aborted.
231
- # @example
232
- # require "google/cloud/speech"
233
- #
234
- # speech_client = Google::Cloud::Speech.new(version: :v1)
235
- # encoding = :FLAC
236
- # sample_rate_hertz = 44100
237
- # language_code = "en-US"
238
- # config = {
239
- # encoding: encoding,
240
- # sample_rate_hertz: sample_rate_hertz,
241
- # language_code: language_code
242
- # }
243
- # uri = "gs://bucket_name/file_name.flac"
244
- # audio = { uri: uri }
245
- # response = speech_client.recognize(config, audio)
246
-
247
- def recognize \
248
- config,
249
- audio,
250
- options: nil,
251
- &block
252
- req = {
253
- config: config,
254
- audio: audio
255
- }.delete_if { |_, v| v.nil? }
256
- req = Google::Gax::to_proto(req, Google::Cloud::Speech::V1::RecognizeRequest)
257
- @recognize.call(req, options, &block)
258
- end
259
-
260
- # Performs asynchronous speech recognition: receive results via the
261
- # google.longrunning.Operations interface. Returns either an
262
- # `Operation.error` or an `Operation.response` which contains
263
- # a `LongRunningRecognizeResponse` message.
264
- # For more information on asynchronous speech recognition, see the
265
- # [how-to](https://cloud.google.com/speech-to-text/docs/async-recognize).
266
- #
267
- # @param config [Google::Cloud::Speech::V1::RecognitionConfig | Hash]
268
- # Required. Provides information to the recognizer that specifies how to
269
- # process the request.
270
- # A hash of the same form as `Google::Cloud::Speech::V1::RecognitionConfig`
271
- # can also be provided.
272
- # @param audio [Google::Cloud::Speech::V1::RecognitionAudio | Hash]
273
- # Required. The audio data to be recognized.
274
- # A hash of the same form as `Google::Cloud::Speech::V1::RecognitionAudio`
275
- # can also be provided.
276
- # @param options [Google::Gax::CallOptions]
277
- # Overrides the default settings for this call, e.g, timeout,
278
- # retries, etc.
279
- # @return [Google::Gax::Operation]
280
- # @raise [Google::Gax::GaxError] if the RPC is aborted.
281
- # @example
282
- # require "google/cloud/speech"
283
- #
284
- # speech_client = Google::Cloud::Speech.new(version: :v1)
285
- # encoding = :FLAC
286
- # sample_rate_hertz = 44100
287
- # language_code = "en-US"
288
- # config = {
289
- # encoding: encoding,
290
- # sample_rate_hertz: sample_rate_hertz,
291
- # language_code: language_code
292
- # }
293
- # uri = "gs://bucket_name/file_name.flac"
294
- # audio = { uri: uri }
295
- #
296
- # # Register a callback during the method call.
297
- # operation = speech_client.long_running_recognize(config, audio) do |op|
298
- # raise op.results.message if op.error?
299
- # op_results = op.results
300
- # # Process the results.
301
- #
302
- # metadata = op.metadata
303
- # # Process the metadata.
304
- # end
305
- #
306
- # # Or use the return value to register a callback.
307
- # operation.on_done do |op|
308
- # raise op.results.message if op.error?
309
- # op_results = op.results
310
- # # Process the results.
311
- #
312
- # metadata = op.metadata
313
- # # Process the metadata.
314
- # end
315
- #
316
- # # Manually reload the operation.
317
- # operation.reload!
318
- #
319
- # # Or block until the operation completes, triggering callbacks on
320
- # # completion.
321
- # operation.wait_until_done!
322
-
323
- def long_running_recognize \
324
- config,
325
- audio,
326
- options: nil
327
- req = {
328
- config: config,
329
- audio: audio
330
- }.delete_if { |_, v| v.nil? }
331
- req = Google::Gax::to_proto(req, Google::Cloud::Speech::V1::LongRunningRecognizeRequest)
332
- operation = Google::Gax::Operation.new(
333
- @long_running_recognize.call(req, options),
334
- @operations_client,
335
- Google::Cloud::Speech::V1::LongRunningRecognizeResponse,
336
- Google::Cloud::Speech::V1::LongRunningRecognizeMetadata,
337
- call_options: options
338
- )
339
- operation.on_done { |operation| yield(operation) } if block_given?
340
- operation
341
- end
342
- end
343
- end
344
- end
345
- end
346
- end
@@ -1,41 +0,0 @@
1
- {
2
- "interfaces": {
3
- "google.cloud.speech.v1.Speech": {
4
- "retry_codes": {
5
- "idempotent": [
6
- "DEADLINE_EXCEEDED",
7
- "UNAVAILABLE"
8
- ],
9
- "non_idempotent": []
10
- },
11
- "retry_params": {
12
- "default": {
13
- "initial_retry_delay_millis": 100,
14
- "retry_delay_multiplier": 1.3,
15
- "max_retry_delay_millis": 60000,
16
- "initial_rpc_timeout_millis": 1000000,
17
- "rpc_timeout_multiplier": 1.0,
18
- "max_rpc_timeout_millis": 1000000,
19
- "total_timeout_millis": 5000000
20
- }
21
- },
22
- "methods": {
23
- "Recognize": {
24
- "timeout_millis": 60000,
25
- "retry_codes_name": "idempotent",
26
- "retry_params_name": "default"
27
- },
28
- "LongRunningRecognize": {
29
- "timeout_millis": 60000,
30
- "retry_codes_name": "non_idempotent",
31
- "retry_params_name": "default"
32
- },
33
- "StreamingRecognize": {
34
- "timeout_millis": 60000,
35
- "retry_codes_name": "non_idempotent",
36
- "retry_params_name": "default"
37
- }
38
- }
39
- }
40
- }
41
- }
@@ -1,615 +0,0 @@
1
- # Copyright 2018 Google LLC
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
-
16
- require "google/cloud/speech/v1"
17
- require "monitor"
18
- require "forwardable"
19
-
20
- module Google
21
- module Cloud
22
- module Speech
23
- module V1
24
- ##
25
- # # Stream
26
- #
27
- # A resource that represents the streaming requests and responses.
28
- #
29
- # @example
30
- # require "google/cloud/speech"
31
- #
32
- # speech_client = Google::Cloud::Speech.new
33
- # streaming_config = {
34
- # config: {
35
- # encoding: :linear16,
36
- # language_code: "en-US",
37
- # sample_rate_hertz: 16000
38
- # }
39
- # }
40
- # stream = speech_client.streaming_recognize(streaming_config)
41
- #
42
- # # Stream 5 seconds of audio from the microphone
43
- # # Actual implementation of microphone input varies by platform
44
- # 5.times do
45
- # stream.send MicrophoneInput.read(32000)
46
- # end
47
- #
48
- # stream.stop
49
- # stream.wait_until_complete!
50
- #
51
- # results = stream.results
52
- # result = results.first.alternatives.first
53
- # result.transcript #=> "how old is the Brooklyn Bridge"
54
- # result.confidence #=> 0.9826789498329163
55
- #
56
- class Stream
57
- include MonitorMixin
58
- ##
59
- # @private Creates a new Speech Stream instance.
60
- # This must always be private, since it may change as the implementation
61
- # changes over time.
62
- def initialize streaming_config, streaming_call
63
- super() # to init MonitorMixin
64
-
65
- @streaming_call = streaming_call
66
- @streaming_recognize_request = {
67
- streaming_config: streaming_config
68
- }
69
- @results = []
70
- @callbacks = Hash.new { |h, k| h[k] = [] }
71
- end
72
-
73
- ##
74
- # Starts the stream. The stream will be started in the first #send call.
75
- def start
76
- return if @request_queue
77
- @request_queue = EnumeratorQueue.new(self)
78
- @request_queue.push @streaming_recognize_request
79
-
80
- Thread.new { background_run }
81
- end
82
-
83
- ##
84
- # Checks if the stream has been started.
85
- #
86
- # @return [boolean] `true` when started, `false` otherwise.
87
- def started?
88
- synchronize do
89
- !(!@request_queue)
90
- end
91
- end
92
-
93
- ##
94
- # Sends audio content to the server.
95
- #
96
- # @param [String] bytes A string of binary audio data to be recognized.
97
- # The data should be encoded as `ASCII-8BIT`.
98
- #
99
- # @example
100
- # require "google/cloud/speech"
101
- #
102
- # speech_client = Google::Cloud::Speech.new
103
- # streaming_config = {
104
- # config: {
105
- # encoding: :linear16,
106
- # language_code: "en-US",
107
- # sample_rate_hertz: 16000
108
- # }
109
- # }
110
- # stream = speech_client.streaming_recognize(streaming_config)
111
- #
112
- # # Stream 5 seconds of audio from the microphone
113
- # # Actual implementation of microphone input varies by platform
114
- # 5.times do
115
- # stream.send MicrophoneInput.read(32000)
116
- # end
117
- #
118
- # stream.stop
119
- # stream.wait_until_complete!
120
- #
121
- # results = stream.results
122
- # result = results.first.alternatives.first
123
- # result.transcript #=> "how old is the Brooklyn Bridge"
124
- # result.confidence #=> 0.9826789498329163
125
- #
126
- def send bytes
127
- start # lazily call start if the stream wasn't started yet
128
- # TODO: do not send if stopped?
129
- synchronize do
130
- req = V1::StreamingRecognizeRequest.new(
131
- audio_content: bytes.encode(Encoding::ASCII_8BIT)
132
- )
133
- @request_queue.push req
134
- end
135
- end
136
-
137
- ##
138
- # Stops the stream. Signals to the server that no more data will be
139
- # sent.
140
- def stop
141
- synchronize do
142
- return if @request_queue.nil?
143
- @request_queue.push self
144
- @stopped = true
145
- end
146
- end
147
-
148
- ##
149
- # Checks if the stream has been stopped.
150
- #
151
- # @return [boolean] `true` when stopped, `false` otherwise.
152
- def stopped?
153
- synchronize do
154
- @stopped
155
- end
156
- end
157
-
158
- ##
159
- # The speech recognition results for the audio.
160
- #
161
- # @return [Array<Result>] The transcribed text of audio recognized.
162
- #
163
- # @example
164
- # require "google/cloud/speech"
165
- #
166
- # speech_client = Google::Cloud::Speech.new
167
- # streaming_config = {
168
- # config: {
169
- # encoding: :linear16,
170
- # language_code: "en-US",
171
- # sample_rate_hertz: 16000
172
- # }
173
- # }
174
- # stream = speech_client.streaming_recognize(streaming_config)
175
- #
176
- # # Stream 5 seconds of audio from the microphone
177
- # # Actual implementation of microphone input varies by platform
178
- # 5.times do
179
- # stream.send MicrophoneInput.read(32000)
180
- # end
181
- #
182
- # stream.stop
183
- #
184
- # results = stream.results
185
- # results.each do |result|
186
- # result.alternatives.each do |alternative|
187
- # puts alternative.transcript
188
- # puts alternative.confidence
189
- # end
190
- # end
191
- #
192
- def results
193
- synchronize do
194
- @results
195
- end
196
- end
197
-
198
- ##
199
- # Whether all speech recognition results have been returned.
200
- #
201
- # @return [Boolean] All speech recognition results have been returned.
202
- #
203
- # @example
204
- # require "google/cloud/speech"
205
- #
206
- # speech_client = Google::Cloud::Speech.new
207
- # streaming_config = {
208
- # config: {
209
- # encoding: :linear16,
210
- # language_code: "en-US",
211
- # sample_rate_hertz: 16000
212
- # }
213
- # }
214
- # stream = speech_client.streaming_recognize(streaming_config)
215
- #
216
- # # Stream 5 seconds of audio from the microphone
217
- # # Actual implementation of microphone input varies by platform
218
- # 5.times do
219
- # stream.send MicrophoneInput.read(32000)
220
- # end
221
- #
222
- # stream.stop
223
- #
224
- # stream.wait_until_complete!
225
- # stream.complete? #=> true
226
- #
227
- # results = stream.results
228
- # results.each do |result|
229
- # result.alternatives.each do |alternative|
230
- # puts alternative.transcript
231
- # puts alternative.confidence
232
- # end
233
- # end
234
- #
235
- def complete?
236
- synchronize do
237
- @complete
238
- end
239
- end
240
-
241
- ##
242
- # Blocks until all speech recognition results have been returned.
243
- #
244
- # @example
245
- # require "google/cloud/speech"
246
- #
247
- # speech_client = Google::Cloud::Speech.new
248
- # streaming_config = {
249
- # config: {
250
- # encoding: :linear16,
251
- # language_code: "en-US",
252
- # sample_rate_hertz: 16000
253
- # }
254
- # }
255
- # stream = speech_client.streaming_recognize(streaming_config)
256
- #
257
- # # Stream 5 seconds of audio from the microphone
258
- # # Actual implementation of microphone input varies by platform
259
- # 5.times do
260
- # stream.send MicrophoneInput.read(32000)
261
- # end
262
- #
263
- # stream.stop
264
- #
265
- # stream.wait_until_complete!
266
- # stream.complete? #=> true
267
- #
268
- # results = stream.results
269
- # results.each do |result|
270
- # result.alternatives.each do |alternative|
271
- # puts alternative.transcript
272
- # puts alternative.confidence
273
- # end
274
- # end
275
- #
276
- def wait_until_complete!
277
- complete_check = nil
278
- synchronize { complete_check = @complete }
279
- while complete_check.nil?
280
- sleep 1
281
- synchronize { complete_check = @complete }
282
- end
283
- end
284
-
285
- ##
286
- # Register to be notified on the reception of an interim result.
287
- #
288
- # @yield [callback] The block for accessing final and interim results.
289
- # @yieldparam [Array<Result>] final_results The final results.
290
- # @yieldparam [Array<Result>] interim_results The interim results.
291
- #
292
- # @example
293
- # require "google/cloud/speech"
294
- #
295
- # speech_client = Google::Cloud::Speech.new
296
- # streaming_config = {
297
- # config: {
298
- # encoding: :linear16,
299
- # language_code: "en-US",
300
- # sample_rate_hertz: 16000
301
- # },
302
- # interim_results: true
303
- # }
304
- # stream = speech_client.streaming_recognize(streaming_config)
305
- #
306
- # # register callback for when an interim result is returned
307
- # stream.on_interim do |final_results, interim_results|
308
- # interim_result = interim_results.first
309
- # interim_alternative = interim_result.alternatives.first
310
- # puts interim_alternative.transcript # "how old is the Brooklyn Bridge"
311
- # puts interim_alternative.confidence # 0.9826789498329163
312
- # puts interim_result.stability # 0.8999
313
- # end
314
- #
315
- # # Stream 5 seconds of audio from the microphone
316
- # # Actual implementation of microphone input varies by platform
317
- # 5.times do
318
- # stream.send MicrophoneInput.read(32000)
319
- # end
320
- #
321
- # stream.stop
322
- #
323
- def on_interim &block
324
- synchronize do
325
- @callbacks[:interim] << block
326
- end
327
- end
328
-
329
- ##
330
- # @private yields two arguments, all final results and the
331
- # non-final/incomplete result
332
- def pass_interim! interim_results
333
- synchronize do
334
- @callbacks[:interim].each { |c| c.call results, interim_results }
335
- end
336
- end
337
-
338
- ##
339
- # Register to be notified on the reception of a final result.
340
- #
341
- # @yield [callback] The block for accessing final results.
342
- # @yieldparam [Array<Result>] results The final results.
343
- #
344
- # @example
345
- # require "google/cloud/speech"
346
- #
347
- # speech_client = Google::Cloud::Speech.new
348
- # streaming_config = {
349
- # config: {
350
- # encoding: :linear16,
351
- # language_code: "en-US",
352
- # sample_rate_hertz: 16000
353
- # }
354
- # }
355
- # stream = speech_client.streaming_recognize(streaming_config)
356
- #
357
- # # register callback for when a final result has been received
358
- # stream.on_result do |results|
359
- # results.each do |result|
360
- # puts result.alternatives.first.transcript
361
- # end
362
- # end
363
- #
364
- # # Stream 5 seconds of audio from the microphone
365
- # # Actual implementation of microphone input varies by platform
366
- # 5.times do
367
- # stream.send MicrophoneInput.read(32000)
368
- # end
369
- #
370
- # stream.stop
371
- # stream.wait_until_complete!
372
- #
373
- # results = stream.results
374
- # result = results.first.alternatives.first
375
- # result.transcript #=> "how old is the Brooklyn Bridge"
376
- # result.confidence #=> 0.9826789498329163
377
- #
378
- def on_result &block
379
- synchronize do
380
- @callbacks[:result] << block
381
- end
382
- end
383
-
384
- ##
385
- # @private add a result object, and call the callbacks
386
- def pass_result! result_grpc
387
- synchronize do
388
- @results << result_grpc
389
- @callbacks[:result].each { |c| c.call @results }
390
- end
391
- end
392
-
393
- ##
394
- # Register to be notified when the end of the audio stream has been
395
- # reached.
396
- #
397
- # @yield [callback] The block to be called when the end of the audio
398
- # stream has been reached.
399
- #
400
- # @example
401
- # require "google/cloud/speech"
402
- #
403
- # speech_client = Google::Cloud::Speech.new
404
- # streaming_config = {
405
- # config: {
406
- # encoding: :linear16,
407
- # language_code: "en-US",
408
- # sample_rate_hertz: 16000
409
- # }
410
- # }
411
- # stream = speech_client.streaming_recognize(streaming_config)
412
- #
413
- # # register callback for when stream has ended.
414
- # stream.on_complete do
415
- # puts "Stream has ended."
416
- # end
417
- #
418
- # # Stream 5 seconds of audio from the microphone
419
- # # Actual implementation of microphone input varies by platform
420
- # 5.times do
421
- # stream.send MicrophoneInput.read(32000)
422
- # end
423
- #
424
- # stream.stop
425
- #
426
- def on_complete &block
427
- synchronize do
428
- @callbacks[:complete] << block
429
- end
430
- end
431
-
432
- ##
433
- # @private yields when the end of the audio stream has been reached.
434
- def pass_complete!
435
- synchronize do
436
- @complete = true
437
- @callbacks[:complete].each(&:call)
438
- end
439
- end
440
-
441
- ##
442
- # Register to be notified when the server has detected the end of the
443
- # user's speech utterance and expects no additional speech. Therefore,
444
- # the server will not process additional audio. The client should stop
445
- # sending additional audio data. This event only occurs when `utterance`
446
- # is `true`.
447
- #
448
- # @yield [callback] The block to be called when the end of the audio
449
- # stream has been reached.
450
- #
451
- # @example
452
- # require "google/cloud/speech"
453
- #
454
- # speech_client = Google::Cloud::Speech.new
455
- # streaming_config = {
456
- # config: {
457
- # encoding: :linear16,
458
- # language_code: "en-US",
459
- # sample_rate_hertz: 16000
460
- # },
461
- # single_utterance: true
462
- # }
463
- # stream = speech_client.streaming_recognize(streaming_config)
464
- #
465
- # # register callback for when utterance has occurred.
466
- # stream.on_utterance do
467
- # puts "Utterance has occurred."
468
- # stream.stop
469
- # end
470
- #
471
- # # Stream 5 seconds of audio from the microphone
472
- # # Actual implementation of microphone input varies by platform
473
- # 5.times do
474
- # stream.send MicrophoneInput.read(32000)
475
- # end
476
- #
477
- # stream.stop unless stream.stopped?
478
- #
479
- def on_utterance &block
480
- synchronize do
481
- @callbacks[:utterance] << block
482
- end
483
- end
484
-
485
- ##
486
- # @private returns single final result once :END_OF_SINGLE_UTTERANCE is
487
- # received.
488
- def pass_utterance!
489
- synchronize do
490
- @callbacks[:utterance].each(&:call)
491
- end
492
- end
493
-
494
- ##
495
- # Register to be notified of an error received during the stream.
496
- #
497
- # @yield [callback] The block for accessing final results.
498
- # @yieldparam [Exception] error The error raised.
499
- #
500
- # @example
501
- # require "google/cloud/speech"
502
- #
503
- # speech_client = Google::Cloud::Speech.new
504
- # streaming_config = {
505
- # config: {
506
- # encoding: :linear16,
507
- # language_code: "en-US",
508
- # sample_rate_hertz: 16000
509
- # }
510
- # }
511
- # stream = speech_client.streaming_recognize(streaming_config)
512
- #
513
- # # register callback for when an error is returned
514
- # stream.on_error do |error|
515
- # puts "The following error occurred while streaming: #{error}"
516
- # stream.stop
517
- # end
518
- #
519
- # # Stream 5 seconds of audio from the microphone
520
- # # Actual implementation of microphone input varies by platform
521
- # 5.times do
522
- # stream.send MicrophoneInput.read(32000)
523
- # end
524
- #
525
- # stream.stop
526
- #
527
- def on_error &block
528
- synchronize do
529
- @callbacks[:error] << block
530
- end
531
- end
532
-
533
- # @private returns error object from the stream thread.
534
- def error! err
535
- synchronize do
536
- @callbacks[:error].each { |c| c.call err }
537
- end
538
- end
539
-
540
- protected
541
-
542
- def background_run
543
- response_enum = @streaming_call.call(@request_queue.each_item)
544
- response_enum.each do |response|
545
- begin
546
- background_results response
547
- background_event_type response.speech_event_type
548
- background_error response.error
549
- rescue StandardError => e
550
- error! e
551
- end
552
- end
553
- rescue StandardError => e
554
- error! e
555
- ensure
556
- pass_complete!
557
- Thread.pass
558
- end
559
-
560
- def background_results response
561
- # Handle the results (StreamingRecognitionResult)
562
- return unless response.results && response.results.any?
563
-
564
- final_grpc = response.results.select { |res| res.is_final }
565
- # Only one final result
566
- final_grpc = if final_grpc.any? then final_grpc.first else nil end
567
-
568
- interim_grpc = response.results.select { |res| !res.is_final }
569
-
570
- # callback for interim results received
571
- pass_interim! interim_grpc if interim_grpc.any?
572
- # callback for final results received, if any
573
- pass_result! final_grpc if final_grpc
574
- end
575
-
576
- def background_event_type event_type
577
- # Handle the event_type by raising events
578
- # TODO: do we automatically call stop here?
579
- pass_utterance! if event_type == :END_OF_SINGLE_UTTERANCE
580
- end
581
-
582
- def background_error error
583
- return if error.nil?
584
-
585
- require "grpc/errors"
586
- raise GRPC::BadStatus.new(error.code, error.message)
587
- end
588
-
589
- # @private
590
- class EnumeratorQueue
591
- extend Forwardable
592
- def_delegators :@q, :push
593
-
594
- # @private
595
- def initialize sentinel
596
- @q = Queue.new
597
- @sentinel = sentinel
598
- end
599
-
600
- # @private
601
- def each_item
602
- return enum_for(:each_item) unless block_given?
603
- loop do
604
- r = @q.pop
605
- break if r.equal? @sentinel
606
- raise r if r.is_a? Exception
607
- yield r
608
- end
609
- end
610
- end
611
- end
612
- end
613
- end
614
- end
615
- end