diff --git a/speech/snippets/pom.xml b/speech/snippets/pom.xml
index 4c52f580f61..95f095460cd 100644
--- a/speech/snippets/pom.xml
+++ b/speech/snippets/pom.xml
@@ -43,6 +43,10 @@
google-cloud-speech
+
+ com.google.cloud
+ google-cloud-storage
+
commons-cli
commons-cli
diff --git a/speech/snippets/src/main/java/com/example/speech/ExportToStorageBeta.java b/speech/snippets/src/main/java/com/example/speech/ExportToStorageBeta.java
new file mode 100644
index 00000000000..7c60725924b
--- /dev/null
+++ b/speech/snippets/src/main/java/com/example/speech/ExportToStorageBeta.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2021 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_export_to_gcs]
+
+import com.google.api.gax.longrunning.OperationFuture;
+import com.google.cloud.speech.v1p1beta1.LongRunningRecognizeMetadata;
+import com.google.cloud.speech.v1p1beta1.LongRunningRecognizeRequest;
+import com.google.cloud.speech.v1p1beta1.LongRunningRecognizeResponse;
+import com.google.cloud.speech.v1p1beta1.RecognitionAudio;
+import com.google.cloud.speech.v1p1beta1.RecognitionConfig;
+import com.google.cloud.speech.v1p1beta1.RecognitionConfig.AudioEncoding;
+import com.google.cloud.speech.v1p1beta1.SpeechClient;
+import com.google.cloud.speech.v1p1beta1.TranscriptOutputConfig;
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+
+public class ExportToStorageBeta {
+
+ public static void main(String[] args) throws Exception {
+ String inputUri = "gs://YOUR_BUCKET_ID/path/to/your/audio_file.wav";
+ String outputStorageUri = "gs://YOUR_BUCKET_ID/output_dir_prefix/";
+ String encoding = "LINEAR16"; // encoding of the audio
+ int sampleRateHertz = 8000;
+ String languageCode = "en-US"; // language code BCP-47_LANGUAGE_CODE_OF_AUDIO
+ exportToStorage(inputUri, outputStorageUri, encoding, sampleRateHertz, languageCode);
+ }
+
+ // Exports the recognized output to specified GCS destination.
+ public static void exportToStorage(
+ String inputUri, String outputStorageUri, String encoding, int sampleRateHertz,
+ String languageCode)
+ throws IOException, ExecutionException, InterruptedException {
+ // Initialize client that will be used to send requests. This client only needs to be created
+ // once, and can be reused for multiple requests. After completing all of your requests, call
+ // the "close" method on the client to safely clean up any remaining background resources.
+ try (SpeechClient speechClient = SpeechClient.create()) {
+ RecognitionAudio audio = RecognitionAudio.newBuilder().setUri(inputUri).build();
+
+ AudioEncoding audioEncoding = AudioEncoding.valueOf(encoding);
+
+ // Pass in the URI of the Cloud Storage bucket to hold the transcription
+ TranscriptOutputConfig outputConfig = TranscriptOutputConfig.newBuilder()
+ .setGcsUri(outputStorageUri).build();
+
+ RecognitionConfig config = RecognitionConfig.newBuilder()
+ .setEncoding(audioEncoding)
+ .setSampleRateHertz(sampleRateHertz)
+ .setLanguageCode(languageCode)
+ .build();
+
+ LongRunningRecognizeRequest request =
+ LongRunningRecognizeRequest.newBuilder()
+ .setConfig(config)
+ .setAudio(audio)
+ .setOutputConfig(outputConfig)
+ .build();
+
+ OperationFuture future =
+ speechClient.longRunningRecognizeAsync(request);
+
+ System.out.println("Waiting for operation to complete...");
+ LongRunningRecognizeResponse response = future.get();
+
+ System.out.println("Results saved to specified output Cloud Storage bucket.");
+
+ String output = response.getResultsList().stream().map(
+ result -> String.valueOf(result.getAlternatives(0).getTranscript()))
+ .collect(Collectors.joining("\n"));
+ System.out.printf("Transcription: %s", output);
+ }
+ }
+}
+// [END speech_export_to_gcs]
diff --git a/speech/snippets/src/test/java/com/example/speech/ExportToStorageBetaTest.java b/speech/snippets/src/test/java/com/example/speech/ExportToStorageBetaTest.java
new file mode 100644
index 00000000000..64d2f5bc505
--- /dev/null
+++ b/speech/snippets/src/test/java/com/example/speech/ExportToStorageBetaTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2021 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 com.google.api.gax.paging.Page;
+import com.google.cloud.storage.Blob;
+import com.google.cloud.storage.Storage;
+import com.google.cloud.storage.StorageOptions;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.util.UUID;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ExportToStorageBetaTest {
+
+ private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT");
+ private static final String AUDIO_STORAGE_URI =
+ "gs://cloud-samples-data/speech/commercial_mono.wav";
+ private static final String PREFIX = "EXPORT_TEST_OUTPUTS";
+ private static final String OUTPUT_STORAGE_URI =
+ String.format("gs://%s/%s/%s/", PROJECT_ID, PREFIX, UUID.randomUUID());
+ private static final String ENCODING = "LINEAR16";
+ private static final String LANGUAGE_CODE = "en-US";
+
+ private static final int SAMPLE_RATE_HERTZ = 8000;
+
+ private ByteArrayOutputStream bout;
+ private PrintStream originalPrintStream;
+ private PrintStream out;
+
+ private static void cleanUpBucket() {
+ Storage storage = StorageOptions.getDefaultInstance().getService();
+ Page blobs =
+ storage.list(
+ PROJECT_ID,
+ Storage.BlobListOption.currentDirectory(),
+ Storage.BlobListOption.prefix(PREFIX));
+
+ deleteDirectory(storage, blobs);
+ }
+
+ private static void deleteDirectory(Storage storage, Page blobs) {
+ for (Blob blob : blobs.iterateAll()) {
+ if (!blob.delete()) {
+ Page subBlobs =
+ storage.list(
+ PROJECT_ID,
+ Storage.BlobListOption.currentDirectory(),
+ Storage.BlobListOption.prefix(blob.getName()));
+
+ deleteDirectory(storage, subBlobs);
+ }
+ }
+ }
+
+ @Before
+ public void setUp() {
+ bout = new ByteArrayOutputStream();
+ out = new PrintStream(bout);
+ originalPrintStream = System.out;
+ System.setOut(out);
+ }
+
+ @After
+ public void tearDown() {
+ cleanUpBucket();
+ System.out.flush();
+ System.setOut(originalPrintStream);
+ }
+
+ @Test
+ public void testExportToStorageBeta() throws Exception {
+ ExportToStorageBeta.exportToStorage(
+ AUDIO_STORAGE_URI, OUTPUT_STORAGE_URI, ENCODING, SAMPLE_RATE_HERTZ, LANGUAGE_CODE);
+ String got = bout.toString();
+ assertThat(got).contains("Transcription:");
+ }
+}