From 1e7ccaa95641645800d89264e8959a27c57f14a8 Mon Sep 17 00:00:00 2001 From: nicain Date: Tue, 10 Aug 2021 12:02:58 -0700 Subject: [PATCH] docs(samples): remove io dependency in transcribe samples (#223) * refactor: Refactor transcribe samples into two separate samples (local-file vs gcs) and remove io dependency. Refactor tests. * Removing CLI in samples and shebangs * leaving transcribe_async.py in (to be removed later), because speech_transcribe_async_gcs is a required tag. * Update year in license headers Co-authored-by: Nick Cain --- speech/snippets/transcribe_async_file.py | 60 +++++++++++++++++++ speech/snippets/transcribe_async_file_test.py | 26 ++++++++ speech/snippets/transcribe_async_gcs.py | 45 ++++++++++++++ ...c_test.py => transcribe_async_gcs_test.py} | 14 ++--- 4 files changed, 135 insertions(+), 10 deletions(-) create mode 100644 speech/snippets/transcribe_async_file.py create mode 100644 speech/snippets/transcribe_async_file_test.py create mode 100644 speech/snippets/transcribe_async_gcs.py rename speech/snippets/{transcribe_async_test.py => transcribe_async_gcs_test.py} (68%) diff --git a/speech/snippets/transcribe_async_file.py b/speech/snippets/transcribe_async_file.py new file mode 100644 index 000000000000..db5ed5c37b73 --- /dev/null +++ b/speech/snippets/transcribe_async_file.py @@ -0,0 +1,60 @@ +# Copyright 2021 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Google Cloud Speech-to-Text sample application using gRPC for async +batch processing. +""" + + +# [START speech_transcribe_async] +def transcribe_file(speech_file): + """Transcribe the given audio file asynchronously.""" + from google.cloud import speech + + client = speech.SpeechClient() + + # [START speech_python_migration_async_request] + with open(speech_file, "rb") as audio_file: + content = audio_file.read() + + """ + Note that transcription is limited to a 60 seconds audio file. + Use a GCS file for audio longer than 1 minute. + """ + audio = speech.RecognitionAudio(content=content) + + config = speech.RecognitionConfig( + encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16, + sample_rate_hertz=16000, + language_code="en-US", + ) + + # [START speech_python_migration_async_response] + + operation = client.long_running_recognize(config=config, audio=audio) + # [END speech_python_migration_async_request] + + print("Waiting for operation to complete...") + response = operation.result(timeout=90) + + # Each result is for a consecutive portion of the audio. Iterate through + # them to get the transcripts for the entire audio file. + for result in response.results: + # The first alternative is the most likely one for this portion. + print(u"Transcript: {}".format(result.alternatives[0].transcript)) + print("Confidence: {}".format(result.alternatives[0].confidence)) + # [END speech_python_migration_async_response] + + +# [END speech_transcribe_async] diff --git a/speech/snippets/transcribe_async_file_test.py b/speech/snippets/transcribe_async_file_test.py new file mode 100644 index 000000000000..1711cae160de --- /dev/null +++ b/speech/snippets/transcribe_async_file_test.py @@ -0,0 +1,26 @@ +# Copyright 2021, Google, Inc. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import re + +import transcribe_async_file + +RESOURCES = os.path.join(os.path.dirname(__file__), "resources") + + +def test_transcribe(capsys): + transcribe_async_file.transcribe_file(os.path.join(RESOURCES, "audio.raw")) + out, err = capsys.readouterr() + + assert re.search(r"how old is the Brooklyn Bridge", out, re.DOTALL | re.I) diff --git a/speech/snippets/transcribe_async_gcs.py b/speech/snippets/transcribe_async_gcs.py new file mode 100644 index 000000000000..727b91512d2e --- /dev/null +++ b/speech/snippets/transcribe_async_gcs.py @@ -0,0 +1,45 @@ +# Copyright 2021 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Google Cloud Speech-to-Text sample application using the gRPC for async +batch processing. +""" + + +# [START speech_transcribe_async_gcs] +def transcribe_gcs(gcs_uri): + """Asynchronously transcribes the audio file specified by the gcs_uri.""" + from google.cloud import speech + + client = speech.SpeechClient() + + audio = speech.RecognitionAudio(uri=gcs_uri) + config = speech.RecognitionConfig( + encoding=speech.RecognitionConfig.AudioEncoding.FLAC, + sample_rate_hertz=16000, + language_code="en-US", + ) + + operation = client.long_running_recognize(config=config, audio=audio) + + print("Waiting for operation to complete...") + response = operation.result(timeout=90) + + # Each result is for a consecutive portion of the audio. Iterate through + # them to get the transcripts for the entire audio file. + for result in response.results: + # The first alternative is the most likely one for this portion. + print(u"Transcript: {}".format(result.alternatives[0].transcript)) + print("Confidence: {}".format(result.alternatives[0].confidence)) +# [END speech_transcribe_async_gcs] diff --git a/speech/snippets/transcribe_async_test.py b/speech/snippets/transcribe_async_gcs_test.py similarity index 68% rename from speech/snippets/transcribe_async_test.py rename to speech/snippets/transcribe_async_gcs_test.py index 47d5f8385a78..2294f056c1fe 100644 --- a/speech/snippets/transcribe_async_test.py +++ b/speech/snippets/transcribe_async_gcs_test.py @@ -1,4 +1,4 @@ -# Copyright 2016, Google, Inc. +# Copyright 2021, Google, Inc. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,20 +14,14 @@ import os import re -import transcribe_async +import transcribe_async_gcs RESOURCES = os.path.join(os.path.dirname(__file__), "resources") -def test_transcribe(capsys): - transcribe_async.transcribe_file(os.path.join(RESOURCES, "audio.raw")) - out, err = capsys.readouterr() - - assert re.search(r"how old is the Brooklyn Bridge", out, re.DOTALL | re.I) - - def test_transcribe_gcs(capsys): - transcribe_async.transcribe_gcs("gs://python-docs-samples-tests/speech/audio.flac") + gcs_path = "gs://python-docs-samples-tests/speech/audio.flac" + transcribe_async_gcs.transcribe_gcs(gcs_path) out, err = capsys.readouterr() assert re.search(r"how old is the Brooklyn Bridge", out, re.DOTALL | re.I)