From 42c0f424e8d05a5246a9696161028f713df06dfc Mon Sep 17 00:00:00 2001 From: Franklin Nunez <69214580+b-loved-dreamer@users.noreply.github.com> Date: Sat, 12 Dec 2020 00:38:06 -0800 Subject: [PATCH] samples: add recognize sample with profanity filter (#376) * feat: added a new sample * fix: fixed region tag * fix: fixed indentation * fix: renamed test duplicate * fix: fixed consecutive capital letter style error * feat: relocated newly added sample and respective test * feat: added missing imports * feat: added another missing imports * fix: harmonized exception handling * fix: harmonized exception handling * fix: redirected system output back to standard output --- .../speech/InfiniteStreamRecognize.java | 6 +- .../example/speech/SpeechProfanityFilter.java | 71 +++++++++++++++++++ .../speech/SpeechProfanityFilterTest.java | 57 +++++++++++++++ 3 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 speech/snippets/src/main/java/com/example/speech/SpeechProfanityFilter.java create mode 100644 speech/snippets/src/test/java/com/example/speech/SpeechProfanityFilterTest.java diff --git a/speech/snippets/src/main/java/com/example/speech/InfiniteStreamRecognize.java b/speech/snippets/src/main/java/com/example/speech/InfiniteStreamRecognize.java index fa045ae0772..1695f08e63a 100644 --- a/speech/snippets/src/main/java/com/example/speech/InfiniteStreamRecognize.java +++ b/speech/snippets/src/main/java/com/example/speech/InfiniteStreamRecognize.java @@ -266,13 +266,13 @@ public void onError(Throwable t) {} if (bridgingOffset > finalRequestEndTime) { bridgingOffset = finalRequestEndTime; } - int chunksFromMS = + int chunksFromMs = (int) Math.floor((finalRequestEndTime - bridgingOffset) / chunkTime); // chunks from MS is number of chunks to resend bridgingOffset = - (int) Math.floor((lastAudioInput.size() - chunksFromMS) * chunkTime); + (int) Math.floor((lastAudioInput.size() - chunksFromMs) * chunkTime); // set bridging offset for next request - for (int i = chunksFromMS; i < lastAudioInput.size(); i++) { + for (int i = chunksFromMs; i < lastAudioInput.size(); i++) { request = StreamingRecognizeRequest.newBuilder() .setAudioContent(lastAudioInput.get(i)) diff --git a/speech/snippets/src/main/java/com/example/speech/SpeechProfanityFilter.java b/speech/snippets/src/main/java/com/example/speech/SpeechProfanityFilter.java new file mode 100644 index 00000000000..b37298388a8 --- /dev/null +++ b/speech/snippets/src/main/java/com/example/speech/SpeechProfanityFilter.java @@ -0,0 +1,71 @@ +/* + * Copyright 2020 Google LLC + * + * 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. + */ + +package com.example.speech; + +// [START speech_transcribe_with_profanity_filter_gcs] +import com.google.cloud.speech.v1.RecognitionAudio; +import com.google.cloud.speech.v1.RecognitionConfig; +import com.google.cloud.speech.v1.RecognitionConfig.AudioEncoding; +import com.google.cloud.speech.v1.RecognizeResponse; +import com.google.cloud.speech.v1.SpeechClient; +import com.google.cloud.speech.v1.SpeechRecognitionAlternative; +import com.google.cloud.speech.v1.SpeechRecognitionResult; +import java.io.IOException; +import java.util.List; + +public class SpeechProfanityFilter { + + public void speechProfanityFilter() throws Exception { + String uriPath = "gs://cloud-samples-tests/speech/brooklyn.flac"; + speechProfanityFilter(uriPath); + } + + /** + * Transcribe a remote audio file with multi-channel recognition + * + * @param gcsUri the path to the audio file + */ + public static void speechProfanityFilter(String gcsUri) throws Exception { + // Instantiates a client with GOOGLE_APPLICATION_CREDENTIALS + try (SpeechClient speech = SpeechClient.create()) { + + // Configure remote file request + RecognitionConfig config = + RecognitionConfig.newBuilder() + .setEncoding(AudioEncoding.FLAC) + .setLanguageCode("en-US") + .setSampleRateHertz(16000) + .setProfanityFilter(true) + .build(); + + // Set the remote path for the audio file + RecognitionAudio audio = RecognitionAudio.newBuilder().setUri(gcsUri).build(); + + // Use blocking call to get audio transcript + RecognizeResponse response = speech.recognize(config, audio); + List results = response.getResultsList(); + + for (SpeechRecognitionResult result : results) { + // There can be several alternative transcripts for a given chunk of speech. Just use the + // first (most likely) one here. + SpeechRecognitionAlternative alternative = result.getAlternativesList().get(0); + System.out.printf("Transcription: %s\n", alternative.getTranscript()); + } + } + } +} +// [END speech_transcribe_with_profanity_filter_gcs] \ No newline at end of file diff --git a/speech/snippets/src/test/java/com/example/speech/SpeechProfanityFilterTest.java b/speech/snippets/src/test/java/com/example/speech/SpeechProfanityFilterTest.java new file mode 100644 index 00000000000..d49eb0a4f70 --- /dev/null +++ b/speech/snippets/src/test/java/com/example/speech/SpeechProfanityFilterTest.java @@ -0,0 +1,57 @@ +/* + * Copyright 2020 Google LLC + * + * 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. + */ + +package com.example.speech; + +import static com.google.common.truth.Truth.assertThat; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +@SuppressWarnings("checkstyle:abbreviationaswordinname") +public class SpeechProfanityFilterTest { + private static final String AUDIO_FILE = "gs://cloud-samples-tests/speech/brooklyn.flac"; + private ByteArrayOutputStream bout; + private PrintStream stdout; + private PrintStream out; + + @Before + public void setUp() { + bout = new ByteArrayOutputStream(); + out = new PrintStream(bout); + stdout = System.out; + System.setOut(out); + } + + @After + public void tearDown() { + System.setOut(stdout); + } + + @Test + public void testSpeechProfanityFilter() throws Exception { + SpeechProfanityFilter.speechProfanityFilter(AUDIO_FILE); + String got = bout.toString(); + assertThat(got).contains("how old is the Brooklyn Bridge"); + } +}