From 08fac52fa0ef973d541923fd542e873e3b83af27 Mon Sep 17 00:00:00 2001 From: wangamber Date: Wed, 5 Nov 2025 11:50:57 -0800 Subject: [PATCH 01/45] checkout from speech-transcription folder --- .../CHANGELOG.md | 13 + .../azure-ai-speech-transcription/README.md | 308 +++++++++++++++ .../azure-ai-speech-transcription/assets.json | 1 + .../azure-ai-speech-transcription/pom.xml | 71 ++++ .../TranscriptionAsyncClient.java | 130 +++++++ .../transcription/TranscriptionClient.java | 122 ++++++ .../TranscriptionClientBuilder.java | 356 +++++++++++++++++ .../TranscriptionServiceVersion.java | 40 ++ .../MultipartFormDataHelper.java | 209 ++++++++++ .../TranscriptionClientImpl.java | 284 ++++++++++++++ .../implementation/package-info.java | 9 + .../models/AudioFileDetails.java | 97 +++++ .../models/ChannelCombinedPhrases.java | 104 +++++ .../models/EnhancedModeProperties.java | 185 +++++++++ .../models/PhraseListProperties.java | 123 ++++++ .../models/ProfanityFilterMode.java | 69 ++++ .../models/TranscribeRequestContent.java | 83 ++++ .../models/TranscribedPhrase.java | 237 +++++++++++ .../transcription/models/TranscribedWord.java | 126 ++++++ .../TranscriptionDiarizationOptions.java | 124 ++++++ .../models/TranscriptionOptions.java | 327 ++++++++++++++++ .../models/TranscriptionResult.java | 129 ++++++ .../transcription/models/package-info.java | 9 + .../ai/speech/transcription/package-info.java | 9 + .../src/main/java/module-info.java | 12 + ...eech-transcription_apiview_properties.json | 23 ++ ...zure-ai-speech-transcription_metadata.json | 1 + .../azure-ai-speech-transcription.properties | 2 + .../AdvancedTranscriptionSample.java | 246 ++++++++++++ .../AsyncTranscriptionSample.java | 256 ++++++++++++ .../BasicTranscriptionSample.java | 153 ++++++++ .../transcription/EnhancedModeSample.java | 349 +++++++++++++++++ .../transcription/ErrorHandlingSample.java | 368 ++++++++++++++++++ .../azure/ai/speech/transcription/README.md | 186 +++++++++ .../speech/transcription/ReadmeSamples.java | 352 +++++++++++++++++ ...riptionAsyncClientJavaDocCodeSnippets.java | 238 +++++++++++ ...ranscriptionClientJavaDocCodeSnippets.java | 181 +++++++++ .../azure/ai/speech/transcription/README.md | 172 ++++++++ .../TranscriptionAsyncClientTest.java | 280 +++++++++++++ .../TranscriptionClientTest.java | 207 ++++++++++ .../TranscriptionClientTestBase.java | 295 ++++++++++++++ .../TranscriptionClientTestBase.java | 41 ++ .../azure/ai/speech/transcription/sample.wav | Bin 0 -> 764562 bytes .../org.mockito.plugins.MockMaker | 1 + 44 files changed, 6528 insertions(+) create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/README.md create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/assets.json create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClientBuilder.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionServiceVersion.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/MultipartFormDataHelper.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/TranscriptionClientImpl.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/package-info.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ChannelCombinedPhrases.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeProperties.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListProperties.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ProfanityFilterMode.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribeRequestContent.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/package-info.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/package-info.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/azure-ai-speech-transcription.properties create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/generated/TranscriptionClientTestBase.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/sample.wav create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md b/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md new file mode 100644 index 000000000000..ca0f84c627e0 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md @@ -0,0 +1,13 @@ +# Release History + +## 1.0.0-beta.1 (Unreleased) + +- Azure Transcription client library for Java. This package contains Microsoft Azure Transcription client library. + +### Features Added + +### Breaking Changes + +### Bugs Fixed + +### Other Changes diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md new file mode 100644 index 000000000000..90a7f2adbcb7 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md @@ -0,0 +1,308 @@ +# Azure AI Speech Transcription client library for Java + +The Azure AI Speech Transcription client library provides a simple and efficient way to convert audio to text using Azure Cognitive Services. This library enables you to transcribe audio files with features like speaker diarization, profanity filtering, and phrase hints for improved accuracy. + +## Documentation + +Various documentation is available to help you get started: + +- [API reference documentation][docs] +- [Product documentation][product_documentation] +- [Azure Speech Service documentation](https://learn.microsoft.com/azure/ai-services/speech-service/) + +## Getting started + +### Prerequisites + +- [Java Development Kit (JDK)][jdk] with version 8 or above +- [Azure Subscription][azure_subscription] +- An [Azure Speech resource](https://learn.microsoft.com/azure/ai-services/speech-service/overview#try-the-speech-service-for-free) or [Cognitive Services multi-service resource](https://learn.microsoft.com/azure/ai-services/multi-service-resource) + +### Adding the package to your product + +[//]: # ({x-version-update-start;com.azure:azure-ai-speech-transcription;current}) +```xml + + com.azure + azure-ai-speech-transcription + 1.0.0-beta.1 + +``` +[//]: # ({x-version-update-end}) + +#### Optional: For Azure AD Authentication + +If you plan to use Azure AD authentication (recommended for production), also add the `azure-identity` dependency: + +```xml + + com.azure + azure-identity + 1.18.1 + +``` + +### Authentication + +Azure Speech Transcription supports two authentication methods: + +#### Option 1: API Key Authentication (Subscription Key) + +You can find your Speech resource's API key in the [Azure Portal](https://portal.azure.com) or by using the Azure CLI: + +```bash +az cognitiveservices account keys list --name --resource-group +``` + +Once you have an API key, you can authenticate using `KeyCredential`: + +```java +import com.azure.core.credential.KeyCredential; + +TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); +``` + +#### Option 2: Azure AD OAuth2 Authentication (Recommended for Production) + +For production scenarios, it's recommended to use Azure Active Directory (Azure AD) authentication with managed identities or service principals. This provides better security and easier credential management. + +The OAuth2 scope for Azure Cognitive Services is: `https://cognitiveservices.azure.com/.default` + +```java +import com.azure.identity.DefaultAzureCredential; +import com.azure.identity.DefaultAzureCredentialBuilder; + +// Use DefaultAzureCredential which works with managed identities, service principals, Azure CLI, etc. +DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build(); + +TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(credential) + .buildClient(); +``` + +**Note:** To use Azure AD authentication, you need to: +1. Add the `azure-identity` dependency to your project +2. Assign the appropriate role (e.g., "Cognitive Services User") to your managed identity or service principal +3. Ensure your Cognitive Services resource has Azure AD authentication enabled + +For more information on Azure AD authentication, see: +- [Authenticate with Azure Identity](https://learn.microsoft.com/azure/developer/java/sdk/identity) +- [Azure Cognitive Services authentication](https://learn.microsoft.com/azure/ai-services/authentication) + +## Key concepts + +### TranscriptionClient + +The `TranscriptionClient` is the primary interface for interacting with the Speech Transcription service. It provides methods to transcribe audio files to text. + +### TranscriptionAsyncClient + +The `TranscriptionAsyncClient` provides asynchronous methods for transcribing audio, allowing non-blocking operations that return reactive types. + +### Audio Formats + +The service supports various audio formats including WAV, MP3, OGG, and more. Audio files must be: + +- Shorter than 2 hours in duration +- Smaller than 250 MB in size + +### Transcription Options + +You can customize transcription with options like: + +- **Profanity filtering**: Control how profanity is handled in transcriptions +- **Speaker diarization**: Identify different speakers in multi-speaker audio +- **Phrase lists**: Provide domain-specific phrases to improve accuracy +- **Language detection**: Automatically detect the spoken language +- **Enhanced mode**: Improve transcription quality with custom prompts, translation, and task-specific configurations + +## Examples + +### Transcribe an audio file + +```java com.azure.ai.speech.transcription.readme +TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + +try { + // Read audio file + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + + // Create audio file details + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + + // Create transcription options + TranscriptionOptions options = new TranscriptionOptions(); + + // Create transcribe request content + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + // Transcribe audio + TranscriptionResult result = client.transcribe(requestContent); + + // Process results + System.out.println("Duration: " + result.getDurationMilliseconds() + "ms"); + result.getCombinedPhrases().forEach(phrase -> { + System.out.println("Channel " + phrase.getChannel() + ": " + phrase.getText()); + }); +} catch (Exception e) { + System.err.println("Error during transcription: " + e.getMessage()); +} +``` + +### Use enhanced mode for improved transcription quality + +Enhanced mode provides advanced features to improve transcription accuracy with custom prompts, translation capabilities, and task-specific optimizations. + +#### Basic enhanced mode + +```java readme-sample-enhancedModeBasic +byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + +AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + +// Enable enhanced mode for improved transcription quality +EnhancedModeProperties enhancedMode = new EnhancedModeProperties() + .setEnabled(true); + +TranscriptionOptions options = new TranscriptionOptions() + .setLocales(java.util.Arrays.asList("en-US")) + .setEnhancedMode(enhancedMode); + +TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + +TranscriptionResult result = client.transcribe(requestContent); +``` + +#### Enhanced mode with custom prompts + +Use prompts to guide transcription with domain-specific terminology, improving accuracy for specialized content like medical, legal, or technical discussions. + +```java readme-sample-enhancedModeWithPrompts +byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + +AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + +// Use prompts to guide transcription with domain-specific terminology +EnhancedModeProperties enhancedMode = new EnhancedModeProperties() + .setEnabled(true) + .setPrompt(java.util.Arrays.asList( + "Medical consultation discussing hypertension and diabetes", + "Common medications: metformin, lisinopril, atorvastatin", + "Patient symptoms and treatment plan" + )); + +TranscriptionOptions options = new TranscriptionOptions() + .setLocales(java.util.Arrays.asList("en-US")) + .setEnhancedMode(enhancedMode); + +TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + +TranscriptionResult result = client.transcribe(requestContent); +``` + +#### Enhanced mode with translation + +Transcribe audio in one language and translate to another language simultaneously. + +```java readme-sample-enhancedModeWithTranslation +byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + +AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + +// Configure enhanced mode to transcribe Spanish audio and translate to English +EnhancedModeProperties enhancedMode = new EnhancedModeProperties() + .setEnabled(true) + .setTargetLanguage("en-US"); // Translate to English + +TranscriptionOptions options = new TranscriptionOptions() + .setLocales(java.util.Arrays.asList("es-ES")) // Source language: Spanish + .setEnhancedMode(enhancedMode); + +TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + +TranscriptionResult result = client.transcribe(requestContent); +``` + +### Service API versions + +The client library targets the latest service API version by default. +The service client builder accepts an optional service API version parameter to specify which API version to communicate. + +#### Select a service API version + +You have the flexibility to explicitly select a supported service API version when initializing a service client via the service client builder. +This ensures that the client can communicate with services using the specified API version. + +When selecting an API version, it is important to verify that there are no breaking changes compared to the latest API version. +If there are significant differences, API calls may fail due to incompatibility. + +Always ensure that the chosen API version is fully supported and operational for your specific use case and that it aligns with the service's versioning policy. + +## Troubleshooting + +### Enable client logging + +You can enable logging to debug issues with the client library. The Azure client libraries for Java use the SLF4J logging facade. You can configure logging by adding a logging dependency and configuration file. For more information, see the [logging documentation](https://learn.microsoft.com/azure/developer/java/sdk/logging-overview). + +### Common issues + +#### Authentication errors + +- Verify that your API key is correct and has not expired +- Ensure your endpoint URL matches your Azure resource region + +#### Audio format errors + +- Verify your audio file is in a supported format +- Ensure the audio file size is under 250 MB and duration is under 2 hours + +### Getting help + +If you encounter issues: + +- Check the [troubleshooting guide](https://learn.microsoft.com/azure/ai-services/speech-service/troubleshooting) +- Search for existing issues or create a new one on [GitHub](https://github.com/Azure/azure-sdk-for-java/issues) +- Ask questions on [Stack Overflow](https://stackoverflow.com/questions/tagged/azure-java-sdk) with the `azure-java-sdk` tag + +## Next steps + +- Explore the [samples](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples) for more examples +- Learn more about [Azure Speech Service](https://learn.microsoft.com/azure/ai-services/speech-service/) +- Review the [API reference documentation][docs] for detailed information about classes and methods + +## Contributing + + +For details on contributing to this repository, see the [contributing guide](https://github.com/Azure/azure-sdk-for-java/blob/main/CONTRIBUTING.md). + +1. Fork it +1. Create your feature branch (`git checkout -b my-new-feature`) +1. Commit your changes (`git commit -am 'Add some feature'`) +1. Push to the branch (`git push origin my-new-feature`) +1. Create new Pull Request + + +[product_documentation]: https://learn.microsoft.com/azure/ai-services/speech-service/ +[docs]: https://azure.github.io/azure-sdk-for-java/ +[jdk]: https://learn.microsoft.com/azure/developer/java/fundamentals/ +[azure_subscription]: https://azure.microsoft.com/free/ + diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/assets.json b/sdk/cognitiveservices/azure-ai-speech-transcription/assets.json new file mode 100644 index 000000000000..b87270f0fd55 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/assets.json @@ -0,0 +1 @@ +{"AssetsRepo":"Azure/azure-sdk-assets","AssetsRepoPrefixPath":"java","TagPrefix":"java/cognitiveservices/azure-ai-speech-transcription","Tag": "java/cognitiveservices/azure-ai-speech-transcription_5be01e978d"} \ No newline at end of file diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml b/sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml new file mode 100644 index 000000000000..53fad6f4ded0 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + com.azure + azure-client-sdk-parent + 1.7.0 + ../../parents/azure-client-sdk-parent + + + com.azure + azure-ai-speech-transcription + 1.0.0-beta.1 + jar + + Microsoft Azure SDK for Transcription + This package contains Microsoft Azure Transcription client library. + https://github.com/Azure/azure-sdk-for-java + + + + The MIT License (MIT) + http://opensource.org/licenses/MIT + repo + + + + + https://github.com/Azure/azure-sdk-for-java + scm:git:git@github.com:Azure/azure-sdk-for-java.git + scm:git:git@github.com:Azure/azure-sdk-for-java.git + HEAD + + + + microsoft + Microsoft + + + + UTF-8 + + + + com.azure + azure-core + 1.57.0 + + + com.azure + azure-core-http-netty + 1.16.2 + + + com.azure + azure-core-test + 1.27.0-beta.13 + test + + + com.azure + azure-identity + 1.18.1 + test + + + diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java new file mode 100644 index 000000000000..594ec3799bd2 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java @@ -0,0 +1,130 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper; +import com.azure.ai.speech.transcription.implementation.TranscriptionClientImpl; +import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.ReturnType; +import com.azure.core.annotation.ServiceClient; +import com.azure.core.annotation.ServiceMethod; +import com.azure.core.exception.ClientAuthenticationException; +import com.azure.core.exception.HttpResponseException; +import com.azure.core.exception.ResourceModifiedException; +import com.azure.core.exception.ResourceNotFoundException; +import com.azure.core.http.rest.RequestOptions; +import com.azure.core.http.rest.Response; +import com.azure.core.util.BinaryData; +import com.azure.core.util.FluxUtil; +import com.azure.core.util.logging.ClientLogger; +import reactor.core.publisher.Mono; + +/** + * Initializes a new instance of the asynchronous TranscriptionClient type. + */ +@ServiceClient(builder = TranscriptionClientBuilder.class, isAsync = true) +public final class TranscriptionAsyncClient { + + private static final ClientLogger LOGGER = new ClientLogger(TranscriptionAsyncClient.class); + + @Generated + private final TranscriptionClientImpl serviceClient; + + /** + * Initializes an instance of TranscriptionAsyncClient class. + * + * @param serviceClient the service client implementation. + */ + @Generated + TranscriptionAsyncClient(TranscriptionClientImpl serviceClient) { + this.serviceClient = serviceClient; + } + + /** + * Transcribes the provided audio stream. + *

Response Body Schema

+ * + *
+     * {@code
+     * {
+     *     durationMilliseconds: int (Required)
+     *     combinedPhrases (Required): [
+     *          (Required){
+     *             channel: Integer (Optional)
+     *             text: String (Required)
+     *         }
+     *     ]
+     *     phrases (Required): [
+     *          (Required){
+     *             channel: Integer (Optional)
+     *             speaker: Integer (Optional)
+     *             offsetMilliseconds: int (Required)
+     *             durationMilliseconds: int (Required)
+     *             text: String (Required)
+     *             words (Optional): [
+     *                  (Optional){
+     *                     text: String (Required)
+     *                     offsetMilliseconds: int (Required)
+     *                     durationMilliseconds: int (Required)
+     *                 }
+     *             ]
+     *             locale: String (Optional)
+     *             confidence: double (Required)
+     *         }
+     *     ]
+     * }
+     * }
+     * 
+ * + * @param body The body of the multipart request. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the result of the transcribe operation along with {@link Response} on successful completion of + * {@link Mono}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + Mono> transcribeWithResponse(BinaryData body, RequestOptions requestOptions) { + // Operation 'transcribe' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. + return this.serviceClient.transcribeWithResponseAsync(body, requestOptions); + } + + /** + * Transcribes the provided audio stream. + * + * @param body The body of the multipart request. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return the result of the transcribe operation on successful completion of {@link Mono}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono transcribe(TranscribeRequestContent body) { + // Generated convenience method for transcribeWithResponse + // TODO: TEMPORARY WORKAROUND - Remove this null check when TypeSpec generator is fixed + if (body == null) { + return Mono.error(new NullPointerException("Parameter 'body' is required and cannot be null.")); + } + RequestOptions requestOptions = new RequestOptions(); + return transcribeWithResponse( + new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", body.getOptions()) + .serializeFileField("audio", body.getAudio() == null ? null : body.getAudio().getContent(), + body.getAudio() == null ? null : body.getAudio().getContentType(), + body.getAudio() == null ? null : body.getAudio().getFilename()) + .end() + .getRequestBody(), + requestOptions).flatMap(FluxUtil::toMono) + .map(protocolMethodData -> protocolMethodData.toObject(TranscriptionResult.class)); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java new file mode 100644 index 000000000000..1aed5187d941 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java @@ -0,0 +1,122 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper; +import com.azure.ai.speech.transcription.implementation.TranscriptionClientImpl; +import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.ReturnType; +import com.azure.core.annotation.ServiceClient; +import com.azure.core.annotation.ServiceMethod; +import com.azure.core.exception.ClientAuthenticationException; +import com.azure.core.exception.HttpResponseException; +import com.azure.core.exception.ResourceModifiedException; +import com.azure.core.exception.ResourceNotFoundException; +import com.azure.core.http.rest.RequestOptions; +import com.azure.core.http.rest.Response; +import com.azure.core.util.BinaryData; +import com.azure.core.util.logging.ClientLogger; + +/** + * Initializes a new instance of the synchronous TranscriptionClient type. + */ +@ServiceClient(builder = TranscriptionClientBuilder.class) +public final class TranscriptionClient { + + private static final ClientLogger LOGGER = new ClientLogger(TranscriptionClient.class); + + @Generated + private final TranscriptionClientImpl serviceClient; + + /** + * Initializes an instance of TranscriptionClient class. + * + * @param serviceClient the service client implementation. + */ + @Generated + TranscriptionClient(TranscriptionClientImpl serviceClient) { + this.serviceClient = serviceClient; + } + + /** + * Transcribes the provided audio stream. + *

Response Body Schema

+ * + *
+     * {@code
+     * {
+     *     durationMilliseconds: int (Required)
+     *     combinedPhrases (Required): [
+     *          (Required){
+     *             channel: Integer (Optional)
+     *             text: String (Required)
+     *         }
+     *     ]
+     *     phrases (Required): [
+     *          (Required){
+     *             channel: Integer (Optional)
+     *             speaker: Integer (Optional)
+     *             offsetMilliseconds: int (Required)
+     *             durationMilliseconds: int (Required)
+     *             text: String (Required)
+     *             words (Optional): [
+     *                  (Optional){
+     *                     text: String (Required)
+     *                     offsetMilliseconds: int (Required)
+     *                     durationMilliseconds: int (Required)
+     *                 }
+     *             ]
+     *             locale: String (Optional)
+     *             confidence: double (Required)
+     *         }
+     *     ]
+     * }
+     * }
+     * 
+ * + * @param body The body of the multipart request. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the result of the transcribe operation along with {@link Response}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + Response transcribeWithResponse(BinaryData body, RequestOptions requestOptions) { + // Operation 'transcribe' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. + return this.serviceClient.transcribeWithResponse(body, requestOptions); + } + + /** + * Transcribes the provided audio stream. + * + * @param body The body of the multipart request. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return the result of the transcribe operation. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public TranscriptionResult transcribe(TranscribeRequestContent body) { + // Generated convenience method for transcribeWithResponse + RequestOptions requestOptions = new RequestOptions(); + return transcribeWithResponse( + new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", body.getOptions()) + .serializeFileField("audio", body.getAudio() == null ? null : body.getAudio().getContent(), + body.getAudio() == null ? null : body.getAudio().getContentType(), + body.getAudio() == null ? null : body.getAudio().getFilename()) + .end() + .getRequestBody(), + requestOptions).getValue().toObject(TranscriptionResult.class); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClientBuilder.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClientBuilder.java new file mode 100644 index 000000000000..649d0f6ca0d8 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClientBuilder.java @@ -0,0 +1,356 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.implementation.TranscriptionClientImpl; +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.ServiceClientBuilder; +import com.azure.core.client.traits.ConfigurationTrait; +import com.azure.core.client.traits.EndpointTrait; +import com.azure.core.client.traits.HttpTrait; +import com.azure.core.client.traits.KeyCredentialTrait; +import com.azure.core.client.traits.TokenCredentialTrait; +import com.azure.core.credential.KeyCredential; +import com.azure.core.credential.TokenCredential; +import com.azure.core.http.HttpClient; +import com.azure.core.http.HttpHeaders; +import com.azure.core.http.HttpPipeline; +import com.azure.core.http.HttpPipelineBuilder; +import com.azure.core.http.HttpPipelinePosition; +import com.azure.core.http.policy.AddDatePolicy; +import com.azure.core.http.policy.AddHeadersFromContextPolicy; +import com.azure.core.http.policy.AddHeadersPolicy; +import com.azure.core.http.policy.BearerTokenAuthenticationPolicy; +import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.http.policy.HttpLoggingPolicy; +import com.azure.core.http.policy.HttpPipelinePolicy; +import com.azure.core.http.policy.HttpPolicyProviders; +import com.azure.core.http.policy.KeyCredentialPolicy; +import com.azure.core.http.policy.RequestIdPolicy; +import com.azure.core.http.policy.RetryOptions; +import com.azure.core.http.policy.RetryPolicy; +import com.azure.core.http.policy.UserAgentPolicy; +import com.azure.core.util.ClientOptions; +import com.azure.core.util.Configuration; +import com.azure.core.util.CoreUtils; +import com.azure.core.util.builder.ClientBuilderUtil; +import com.azure.core.util.logging.ClientLogger; +import com.azure.core.util.serializer.JacksonAdapter; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * A builder for creating a new instance of the TranscriptionClient type. + */ +@ServiceClientBuilder(serviceClients = { TranscriptionClient.class, TranscriptionAsyncClient.class }) +public final class TranscriptionClientBuilder implements HttpTrait, + ConfigurationTrait, TokenCredentialTrait, + KeyCredentialTrait, EndpointTrait { + + @Generated + private static final String SDK_NAME = "name"; + + @Generated + private static final String SDK_VERSION = "version"; + + @Generated + private static final Map PROPERTIES + = CoreUtils.getProperties("azure-ai-speech-transcription.properties"); + + @Generated + private final List pipelinePolicies; + + /** + * Create an instance of the TranscriptionClientBuilder. + */ + @Generated + public TranscriptionClientBuilder() { + this.pipelinePolicies = new ArrayList<>(); + } + + /* + * The HTTP client used to send the request. + */ + @Generated + private HttpClient httpClient; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public TranscriptionClientBuilder httpClient(HttpClient httpClient) { + this.httpClient = httpClient; + return this; + } + + /* + * The HTTP pipeline to send requests through. + */ + @Generated + private HttpPipeline pipeline; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public TranscriptionClientBuilder pipeline(HttpPipeline pipeline) { + if (this.pipeline != null && pipeline == null) { + LOGGER.atInfo().log("HttpPipeline is being set to 'null' when it was previously configured."); + } + this.pipeline = pipeline; + return this; + } + + /* + * The logging configuration for HTTP requests and responses. + */ + @Generated + private HttpLogOptions httpLogOptions; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public TranscriptionClientBuilder httpLogOptions(HttpLogOptions httpLogOptions) { + this.httpLogOptions = httpLogOptions; + return this; + } + + /* + * The client options such as application ID and custom headers to set on a request. + */ + @Generated + private ClientOptions clientOptions; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public TranscriptionClientBuilder clientOptions(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + return this; + } + + /* + * The retry options to configure retry policy for failed requests. + */ + @Generated + private RetryOptions retryOptions; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public TranscriptionClientBuilder retryOptions(RetryOptions retryOptions) { + this.retryOptions = retryOptions; + return this; + } + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public TranscriptionClientBuilder addPolicy(HttpPipelinePolicy customPolicy) { + Objects.requireNonNull(customPolicy, "'customPolicy' cannot be null."); + pipelinePolicies.add(customPolicy); + return this; + } + + /* + * The configuration store that is used during construction of the service client. + */ + @Generated + private Configuration configuration; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public TranscriptionClientBuilder configuration(Configuration configuration) { + this.configuration = configuration; + return this; + } + + /* + * The KeyCredential used for authentication. + */ + @Generated + private KeyCredential keyCredential; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public TranscriptionClientBuilder credential(KeyCredential keyCredential) { + this.keyCredential = keyCredential; + return this; + } + + /* + * The service endpoint + */ + @Generated + private String endpoint; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public TranscriptionClientBuilder endpoint(String endpoint) { + this.endpoint = endpoint; + return this; + } + + /* + * Service version + */ + @Generated + private TranscriptionServiceVersion serviceVersion; + + /** + * Sets Service version. + * + * @param serviceVersion the serviceVersion value. + * @return the TranscriptionClientBuilder. + */ + @Generated + public TranscriptionClientBuilder serviceVersion(TranscriptionServiceVersion serviceVersion) { + this.serviceVersion = serviceVersion; + return this; + } + + /* + * The retry policy that will attempt to retry failed requests, if applicable. + */ + @Generated + private RetryPolicy retryPolicy; + + /** + * Sets The retry policy that will attempt to retry failed requests, if applicable. + * + * @param retryPolicy the retryPolicy value. + * @return the TranscriptionClientBuilder. + */ + @Generated + public TranscriptionClientBuilder retryPolicy(RetryPolicy retryPolicy) { + this.retryPolicy = retryPolicy; + return this; + } + + /** + * Builds an instance of TranscriptionClientImpl with the provided parameters. + * + * @return an instance of TranscriptionClientImpl. + */ + @Generated + private TranscriptionClientImpl buildInnerClient() { + this.validateClient(); + HttpPipeline localPipeline = (pipeline != null) ? pipeline : createHttpPipeline(); + TranscriptionServiceVersion localServiceVersion + = (serviceVersion != null) ? serviceVersion : TranscriptionServiceVersion.getLatest(); + TranscriptionClientImpl client = new TranscriptionClientImpl(localPipeline, + JacksonAdapter.createDefaultSerializerAdapter(), this.endpoint, localServiceVersion); + return client; + } + + @Generated + private void validateClient() { + // This method is invoked from 'buildInnerClient'/'buildClient' method. + // Developer can customize this method, to validate that the necessary conditions are met for the new client. + Objects.requireNonNull(endpoint, "'endpoint' cannot be null."); + } + + @Generated + private HttpPipeline createHttpPipeline() { + Configuration buildConfiguration + = (configuration == null) ? Configuration.getGlobalConfiguration() : configuration; + HttpLogOptions localHttpLogOptions = this.httpLogOptions == null ? new HttpLogOptions() : this.httpLogOptions; + ClientOptions localClientOptions = this.clientOptions == null ? new ClientOptions() : this.clientOptions; + List policies = new ArrayList<>(); + String clientName = PROPERTIES.getOrDefault(SDK_NAME, "UnknownName"); + String clientVersion = PROPERTIES.getOrDefault(SDK_VERSION, "UnknownVersion"); + String applicationId = CoreUtils.getApplicationId(localClientOptions, localHttpLogOptions); + policies.add(new UserAgentPolicy(applicationId, clientName, clientVersion, buildConfiguration)); + policies.add(new RequestIdPolicy()); + policies.add(new AddHeadersFromContextPolicy()); + HttpHeaders headers = CoreUtils.createHttpHeadersFromClientOptions(localClientOptions); + if (headers != null) { + policies.add(new AddHeadersPolicy(headers)); + } + this.pipelinePolicies.stream() + .filter(p -> p.getPipelinePosition() == HttpPipelinePosition.PER_CALL) + .forEach(p -> policies.add(p)); + HttpPolicyProviders.addBeforeRetryPolicies(policies); + policies.add(ClientBuilderUtil.validateAndGetRetryPolicy(retryPolicy, retryOptions, new RetryPolicy())); + policies.add(new AddDatePolicy()); + if (keyCredential != null) { + policies.add(new KeyCredentialPolicy("Ocp-Apim-Subscription-Key", keyCredential)); + } + if (tokenCredential != null) { + policies.add(new BearerTokenAuthenticationPolicy(tokenCredential, DEFAULT_SCOPES)); + } + this.pipelinePolicies.stream() + .filter(p -> p.getPipelinePosition() == HttpPipelinePosition.PER_RETRY) + .forEach(p -> policies.add(p)); + HttpPolicyProviders.addAfterRetryPolicies(policies); + policies.add(new HttpLoggingPolicy(localHttpLogOptions)); + HttpPipeline httpPipeline = new HttpPipelineBuilder().policies(policies.toArray(new HttpPipelinePolicy[0])) + .httpClient(httpClient) + .clientOptions(localClientOptions) + .build(); + return httpPipeline; + } + + /** + * Builds an instance of TranscriptionAsyncClient class. + * + * @return an instance of TranscriptionAsyncClient. + */ + @Generated + public TranscriptionAsyncClient buildAsyncClient() { + return new TranscriptionAsyncClient(buildInnerClient()); + } + + /** + * Builds an instance of TranscriptionClient class. + * + * @return an instance of TranscriptionClient. + */ + @Generated + public TranscriptionClient buildClient() { + return new TranscriptionClient(buildInnerClient()); + } + + private static final ClientLogger LOGGER = new ClientLogger(TranscriptionClientBuilder.class); + + @Generated + private static final String[] DEFAULT_SCOPES = new String[] { "https://cognitiveservices.azure.com/.default" }; + + /* + * The TokenCredential used for authentication. + */ + @Generated + private TokenCredential tokenCredential; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public TranscriptionClientBuilder credential(TokenCredential tokenCredential) { + this.tokenCredential = tokenCredential; + return this; + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionServiceVersion.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionServiceVersion.java new file mode 100644 index 000000000000..07e1561ff2f4 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionServiceVersion.java @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package com.azure.ai.speech.transcription; + +import com.azure.core.util.ServiceVersion; + +/** + * Service version of TranscriptionClient. + */ +public enum TranscriptionServiceVersion implements ServiceVersion { + /** + * Enum value 2025-10-15. + */ + V2025_10_15("2025-10-15"); + + private final String version; + + TranscriptionServiceVersion(String version) { + this.version = version; + } + + /** + * {@inheritDoc} + */ + @Override + public String getVersion() { + return this.version; + } + + /** + * Gets the latest service version supported by this client library. + * + * @return The latest {@link TranscriptionServiceVersion}. + */ + public static TranscriptionServiceVersion getLatest() { + return V2025_10_15; + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/MultipartFormDataHelper.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/MultipartFormDataHelper.java new file mode 100644 index 000000000000..2a2962e1595d --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/MultipartFormDataHelper.java @@ -0,0 +1,209 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package com.azure.ai.speech.transcription.implementation; + +import com.azure.core.http.HttpHeaderName; +import com.azure.core.http.rest.RequestOptions; +import com.azure.core.util.BinaryData; +import com.azure.core.util.CoreUtils; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.SequenceInputStream; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.UUID; + +// DO NOT modify this helper class + +public final class MultipartFormDataHelper { + /** + * Line separator for the multipart HTTP request. + */ + private static final String CRLF = "\r\n"; + + private static final String APPLICATION_OCTET_STREAM = "application/octet-stream"; + + /** + * Value to be used as part of the divider for the multipart requests. + */ + private final String boundary; + + /** + * The actual part separator in the request. This is obtained by prepending "--" to the "boundary". + */ + private final String partSeparator; + + /** + * The marker for the ending of a multipart request. This is obtained by post-pending "--" to the "partSeparator". + */ + private final String endMarker; + + /** + * Charset used for encoding the multipart HTTP request. + */ + private final Charset encoderCharset = StandardCharsets.UTF_8; + + private InputStream requestDataStream = new ByteArrayInputStream(new byte[0]); + private long requestLength = 0; + + private RequestOptions requestOptions; + private BinaryData requestBody; + + /** + * Default constructor used in the code. The boundary is a random value. + * + * @param requestOptions the RequestOptions to update + */ + public MultipartFormDataHelper(RequestOptions requestOptions) { + this(requestOptions, UUID.randomUUID().toString().substring(0, 16)); + } + + private MultipartFormDataHelper(RequestOptions requestOptions, String boundary) { + this.requestOptions = requestOptions; + this.boundary = boundary; + this.partSeparator = "--" + boundary; + this.endMarker = this.partSeparator + "--"; + } + + /** + * Gets the multipart HTTP request body. + * + * @return the BinaryData of the multipart HTTP request body + */ + public BinaryData getRequestBody() { + return requestBody; + } + + // text/plain + /** + * Formats a text/plain field for a multipart HTTP request. + * + * @param fieldName the field name + * @param value the value of the text/plain field + * @return the MultipartFormDataHelper instance + */ + public MultipartFormDataHelper serializeTextField(String fieldName, String value) { + if (value != null) { + String serialized = partSeparator + CRLF + "Content-Disposition: form-data; name=\"" + escapeName(fieldName) + + "\"" + CRLF + CRLF + value + CRLF; + byte[] data = serialized.getBytes(encoderCharset); + appendBytes(data); + } + return this; + } + + // application/json + /** + * Formats a application/json field for a multipart HTTP request. + * + * @param fieldName the field name + * @param jsonObject the object of the application/json field + * @return the MultipartFormDataHelper instance + */ + public MultipartFormDataHelper serializeJsonField(String fieldName, Object jsonObject) { + if (jsonObject != null) { + String serialized + = partSeparator + CRLF + "Content-Disposition: form-data; name=\"" + escapeName(fieldName) + "\"" + CRLF + + "Content-Type: application/json" + CRLF + CRLF + BinaryData.fromObject(jsonObject) + CRLF; + byte[] data = serialized.getBytes(encoderCharset); + appendBytes(data); + } + return this; + } + + /** + * Formats a file field for a multipart HTTP request. + * + * @param fieldName the field name + * @param file the BinaryData of the file + * @param contentType the content-type of the file + * @param filename the filename + * @return the MultipartFormDataHelper instance + */ + public MultipartFormDataHelper serializeFileField(String fieldName, BinaryData file, String contentType, + String filename) { + if (file != null) { + if (CoreUtils.isNullOrEmpty(contentType)) { + contentType = APPLICATION_OCTET_STREAM; + } + writeFileField(fieldName, file, contentType, filename); + } + return this; + } + + /** + * Formats a file field (potentially multiple files) for a multipart HTTP request. + * + * @param fieldName the field name + * @param files the List of BinaryData of the files + * @param contentTypes the List of content-type of the files + * @param filenames the List of filenames + * @return the MultipartFormDataHelper instance + */ + public MultipartFormDataHelper serializeFileFields(String fieldName, List files, + List contentTypes, List filenames) { + if (files != null) { + for (int i = 0; i < files.size(); ++i) { + BinaryData file = files.get(i); + String contentType = contentTypes.get(i); + if (CoreUtils.isNullOrEmpty(contentType)) { + contentType = APPLICATION_OCTET_STREAM; + } + String filename = filenames.get(i); + writeFileField(fieldName, file, contentType, filename); + } + } + return this; + } + + /** + * Ends the serialization of the multipart HTTP request. + * + * @return the MultipartFormDataHelper instance + */ + public MultipartFormDataHelper end() { + byte[] data = endMarker.getBytes(encoderCharset); + appendBytes(data); + + requestBody = BinaryData.fromStream(requestDataStream, requestLength); + + requestOptions.setHeader(HttpHeaderName.CONTENT_TYPE, "multipart/form-data; boundary=" + this.boundary) + .setHeader(HttpHeaderName.CONTENT_LENGTH, String.valueOf(requestLength)); + + return this; + } + + private void writeFileField(String fieldName, BinaryData file, String contentType, String filename) { + String contentDispositionFilename = ""; + if (!CoreUtils.isNullOrEmpty(filename)) { + contentDispositionFilename = "; filename=\"" + escapeName(filename) + "\""; + } + + // Multipart preamble + String fileFieldPreamble + = partSeparator + CRLF + "Content-Disposition: form-data; name=\"" + escapeName(fieldName) + "\"" + + contentDispositionFilename + CRLF + "Content-Type: " + contentType + CRLF + CRLF; + byte[] data = fileFieldPreamble.getBytes(encoderCharset); + appendBytes(data); + + // Writing the file into the request as a byte stream + requestLength += file.getLength(); + requestDataStream = new SequenceInputStream(requestDataStream, file.toStream()); + + // CRLF + data = CRLF.getBytes(encoderCharset); + appendBytes(data); + } + + private void appendBytes(byte[] bytes) { + requestLength += bytes.length; + requestDataStream = new SequenceInputStream(requestDataStream, new ByteArrayInputStream(bytes)); + } + + private static String escapeName(String name) { + return name.replace("\n", "%0A").replace("\r", "%0D").replace("\"", "%22"); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/TranscriptionClientImpl.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/TranscriptionClientImpl.java new file mode 100644 index 000000000000..bb14d116f3e0 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/TranscriptionClientImpl.java @@ -0,0 +1,284 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package com.azure.ai.speech.transcription.implementation; + +import com.azure.ai.speech.transcription.TranscriptionServiceVersion; +import com.azure.core.annotation.BodyParam; +import com.azure.core.annotation.ExpectedResponses; +import com.azure.core.annotation.HeaderParam; +import com.azure.core.annotation.Host; +import com.azure.core.annotation.HostParam; +import com.azure.core.annotation.Post; +import com.azure.core.annotation.QueryParam; +import com.azure.core.annotation.ReturnType; +import com.azure.core.annotation.ServiceInterface; +import com.azure.core.annotation.ServiceMethod; +import com.azure.core.annotation.UnexpectedResponseExceptionType; +import com.azure.core.exception.ClientAuthenticationException; +import com.azure.core.exception.HttpResponseException; +import com.azure.core.exception.ResourceModifiedException; +import com.azure.core.exception.ResourceNotFoundException; +import com.azure.core.http.HttpPipeline; +import com.azure.core.http.HttpPipelineBuilder; +import com.azure.core.http.policy.RetryPolicy; +import com.azure.core.http.policy.UserAgentPolicy; +import com.azure.core.http.rest.RequestOptions; +import com.azure.core.http.rest.Response; +import com.azure.core.http.rest.RestProxy; +import com.azure.core.util.BinaryData; +import com.azure.core.util.Context; +import com.azure.core.util.FluxUtil; +import com.azure.core.util.serializer.JacksonAdapter; +import com.azure.core.util.serializer.SerializerAdapter; +import reactor.core.publisher.Mono; + +/** + * Initializes a new instance of the TranscriptionClient type. + */ +public final class TranscriptionClientImpl { + /** + * The proxy service used to perform REST calls. + */ + private final TranscriptionClientService service; + + /** + * Supported Cognitive Services endpoints (protocol and hostname, for example: + * https://westus.api.cognitive.microsoft.com. + */ + private final String endpoint; + + /** + * Gets Supported Cognitive Services endpoints (protocol and hostname, for example: + * https://westus.api.cognitive.microsoft.com. + * + * @return the endpoint value. + */ + public String getEndpoint() { + return this.endpoint; + } + + /** + * Service version. + */ + private final TranscriptionServiceVersion serviceVersion; + + /** + * Gets Service version. + * + * @return the serviceVersion value. + */ + public TranscriptionServiceVersion getServiceVersion() { + return this.serviceVersion; + } + + /** + * The HTTP pipeline to send requests through. + */ + private final HttpPipeline httpPipeline; + + /** + * Gets The HTTP pipeline to send requests through. + * + * @return the httpPipeline value. + */ + public HttpPipeline getHttpPipeline() { + return this.httpPipeline; + } + + /** + * The serializer to serialize an object into a string. + */ + private final SerializerAdapter serializerAdapter; + + /** + * Gets The serializer to serialize an object into a string. + * + * @return the serializerAdapter value. + */ + public SerializerAdapter getSerializerAdapter() { + return this.serializerAdapter; + } + + /** + * Initializes an instance of TranscriptionClient client. + * + * @param endpoint Supported Cognitive Services endpoints (protocol and hostname, for example: + * https://westus.api.cognitive.microsoft.com. + * @param serviceVersion Service version. + */ + public TranscriptionClientImpl(String endpoint, TranscriptionServiceVersion serviceVersion) { + this(new HttpPipelineBuilder().policies(new UserAgentPolicy(), new RetryPolicy()).build(), + JacksonAdapter.createDefaultSerializerAdapter(), endpoint, serviceVersion); + } + + /** + * Initializes an instance of TranscriptionClient client. + * + * @param httpPipeline The HTTP pipeline to send requests through. + * @param endpoint Supported Cognitive Services endpoints (protocol and hostname, for example: + * https://westus.api.cognitive.microsoft.com. + * @param serviceVersion Service version. + */ + public TranscriptionClientImpl(HttpPipeline httpPipeline, String endpoint, + TranscriptionServiceVersion serviceVersion) { + this(httpPipeline, JacksonAdapter.createDefaultSerializerAdapter(), endpoint, serviceVersion); + } + + /** + * Initializes an instance of TranscriptionClient client. + * + * @param httpPipeline The HTTP pipeline to send requests through. + * @param serializerAdapter The serializer to serialize an object into a string. + * @param endpoint Supported Cognitive Services endpoints (protocol and hostname, for example: + * https://westus.api.cognitive.microsoft.com. + * @param serviceVersion Service version. + */ + public TranscriptionClientImpl(HttpPipeline httpPipeline, SerializerAdapter serializerAdapter, String endpoint, + TranscriptionServiceVersion serviceVersion) { + this.httpPipeline = httpPipeline; + this.serializerAdapter = serializerAdapter; + this.endpoint = endpoint; + this.serviceVersion = serviceVersion; + this.service + = RestProxy.create(TranscriptionClientService.class, this.httpPipeline, this.getSerializerAdapter()); + } + + /** + * The interface defining all the services for TranscriptionClient to be used by the proxy service to perform REST + * calls. + */ + @Host("{endpoint}/speechtotext") + @ServiceInterface(name = "TranscriptionClient") + public interface TranscriptionClientService { + // @Multipart not supported by RestProxy + @Post("/transcriptions:transcribe") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Mono> transcribe(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @HeaderParam("content-type") String contentType, + @HeaderParam("Accept") String accept, @BodyParam("multipart/form-data") BinaryData body, + RequestOptions requestOptions, Context context); + + // @Multipart not supported by RestProxy + @Post("/transcriptions:transcribe") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Response transcribeSync(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @HeaderParam("content-type") String contentType, + @HeaderParam("Accept") String accept, @BodyParam("multipart/form-data") BinaryData body, + RequestOptions requestOptions, Context context); + } + + /** + * Transcribes the provided audio stream. + *

Response Body Schema

+ * + *
+     * {@code
+     * {
+     *     durationMilliseconds: int (Required)
+     *     combinedPhrases (Required): [
+     *          (Required){
+     *             channel: Integer (Optional)
+     *             text: String (Required)
+     *         }
+     *     ]
+     *     phrases (Required): [
+     *          (Required){
+     *             channel: Integer (Optional)
+     *             speaker: Integer (Optional)
+     *             offsetMilliseconds: int (Required)
+     *             durationMilliseconds: int (Required)
+     *             text: String (Required)
+     *             words (Optional): [
+     *                  (Optional){
+     *                     text: String (Required)
+     *                     offsetMilliseconds: int (Required)
+     *                     durationMilliseconds: int (Required)
+     *                 }
+     *             ]
+     *             locale: String (Optional)
+     *             confidence: double (Required)
+     *         }
+     *     ]
+     * }
+     * }
+     * 
+ * + * @param body The body of the multipart request. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the result of the transcribe operation along with {@link Response} on successful completion of + * {@link Mono}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> transcribeWithResponseAsync(BinaryData body, RequestOptions requestOptions) { + final String contentType = "multipart/form-data"; + final String accept = "application/json"; + return FluxUtil.withContext(context -> service.transcribe(this.getEndpoint(), + this.getServiceVersion().getVersion(), contentType, accept, body, requestOptions, context)); + } + + /** + * Transcribes the provided audio stream. + *

Response Body Schema

+ * + *
+     * {@code
+     * {
+     *     durationMilliseconds: int (Required)
+     *     combinedPhrases (Required): [
+     *          (Required){
+     *             channel: Integer (Optional)
+     *             text: String (Required)
+     *         }
+     *     ]
+     *     phrases (Required): [
+     *          (Required){
+     *             channel: Integer (Optional)
+     *             speaker: Integer (Optional)
+     *             offsetMilliseconds: int (Required)
+     *             durationMilliseconds: int (Required)
+     *             text: String (Required)
+     *             words (Optional): [
+     *                  (Optional){
+     *                     text: String (Required)
+     *                     offsetMilliseconds: int (Required)
+     *                     durationMilliseconds: int (Required)
+     *                 }
+     *             ]
+     *             locale: String (Optional)
+     *             confidence: double (Required)
+     *         }
+     *     ]
+     * }
+     * }
+     * 
+ * + * @param body The body of the multipart request. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the result of the transcribe operation along with {@link Response}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Response transcribeWithResponse(BinaryData body, RequestOptions requestOptions) { + final String contentType = "multipart/form-data"; + final String accept = "application/json"; + return service.transcribeSync(this.getEndpoint(), this.getServiceVersion().getVersion(), contentType, accept, + body, requestOptions, Context.NONE); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/package-info.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/package-info.java new file mode 100644 index 000000000000..140636afd3d6 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/package-info.java @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +/** + * + * Package containing the implementations for Transcription. + * + */ +package com.azure.ai.speech.transcription.implementation; diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java new file mode 100644 index 000000000000..c093b1509cbf --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java @@ -0,0 +1,97 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription.models; + +import com.azure.core.annotation.Fluent; +import com.azure.core.annotation.Generated; +import com.azure.core.util.BinaryData; + +/** + * The file details for the "audio" field. + */ +@Fluent +public final class AudioFileDetails { + + /* + * The content of the file. + */ + @Generated + private final BinaryData content; + + /* + * The filename of the file. + */ + @Generated + private String filename; + + /* + * The content-type of the file. + */ + @Generated + private String contentType = "application/octet-stream"; + + /** + * Creates an instance of AudioFileDetails class. + * + * @param content the content value to set. + */ + @Generated + public AudioFileDetails(BinaryData content) { + this.content = content; + } + + /** + * Get the content property: The content of the file. + * + * @return the content value. + */ + @Generated + public BinaryData getContent() { + return this.content; + } + + /** + * Get the filename property: The filename of the file. + * + * @return the filename value. + */ + @Generated + public String getFilename() { + return this.filename; + } + + /** + * Set the filename property: The filename of the file. + * + * @param filename the filename value to set. + * @return the AudioFileDetails object itself. + */ + @Generated + public AudioFileDetails setFilename(String filename) { + this.filename = filename; + return this; + } + + /** + * Get the contentType property: The content-type of the file. + * + * @return the contentType value. + */ + @Generated + public String getContentType() { + return this.contentType; + } + + /** + * Set the contentType property: The content-type of the file. + * + * @param contentType the contentType value to set. + * @return the AudioFileDetails object itself. + */ + @Generated + public AudioFileDetails setContentType(String contentType) { + this.contentType = contentType; + return this; + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ChannelCombinedPhrases.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ChannelCombinedPhrases.java new file mode 100644 index 000000000000..a315b684bc4c --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ChannelCombinedPhrases.java @@ -0,0 +1,104 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The full transcript per channel. + */ +@Immutable +public final class ChannelCombinedPhrases implements JsonSerializable { + + /* + * The 0-based channel index. Only present if channel separation is enabled. + */ + @Generated + private Integer channel; + + /* + * The complete transcribed text for the channel. + */ + @Generated + private final String text; + + /** + * Creates an instance of ChannelCombinedPhrases class. + * + * @param text the text value to set. + */ + @Generated + private ChannelCombinedPhrases(String text) { + this.text = text; + } + + /** + * Get the channel property: The 0-based channel index. Only present if channel separation is enabled. + * + * @return the channel value. + */ + @Generated + public Integer getChannel() { + return this.channel; + } + + /** + * Get the text property: The complete transcribed text for the channel. + * + * @return the text value. + */ + @Generated + public String getText() { + return this.text; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("text", this.text); + jsonWriter.writeNumberField("channel", this.channel); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of ChannelCombinedPhrases from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of ChannelCombinedPhrases if the JsonReader was pointing to an instance of it, or null if it + * was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the ChannelCombinedPhrases. + */ + @Generated + public static ChannelCombinedPhrases fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String text = null; + Integer channel = null; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("text".equals(fieldName)) { + text = reader.getString(); + } else if ("channel".equals(fieldName)) { + channel = reader.getNullable(JsonReader::getInt); + } else { + reader.skipChildren(); + } + } + ChannelCombinedPhrases deserializedChannelCombinedPhrases = new ChannelCombinedPhrases(text); + deserializedChannelCombinedPhrases.channel = channel; + return deserializedChannelCombinedPhrases; + }); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeProperties.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeProperties.java new file mode 100644 index 000000000000..349b265387ec --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeProperties.java @@ -0,0 +1,185 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription.models; + +import com.azure.core.annotation.Fluent; +import com.azure.core.annotation.Generated; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; +import java.util.List; + +/** + * Enhanced mode properties for transcription. + */ +@Fluent +public final class EnhancedModeProperties implements JsonSerializable { + + /* + * Enable enhanced mode for transcription. + */ + @Generated + private Boolean enabled; + + /* + * Task type for enhanced mode. + */ + @Generated + private String task; + + /* + * Target language for enhanced mode. + */ + @Generated + private String targetLanguage; + + /* + * A list of user prompts. + */ + @Generated + private List prompt; + + /** + * Creates an instance of EnhancedModeProperties class. + */ + @Generated + public EnhancedModeProperties() { + } + + /** + * Get the enabled property: Enable enhanced mode for transcription. + * + * @return the enabled value. + */ + @Generated + public Boolean isEnabled() { + return this.enabled; + } + + /** + * Set the enabled property: Enable enhanced mode for transcription. + * + * @param enabled the enabled value to set. + * @return the EnhancedModeProperties object itself. + */ + @Generated + public EnhancedModeProperties setEnabled(Boolean enabled) { + this.enabled = enabled; + return this; + } + + /** + * Get the task property: Task type for enhanced mode. + * + * @return the task value. + */ + @Generated + public String getTask() { + return this.task; + } + + /** + * Set the task property: Task type for enhanced mode. + * + * @param task the task value to set. + * @return the EnhancedModeProperties object itself. + */ + @Generated + public EnhancedModeProperties setTask(String task) { + this.task = task; + return this; + } + + /** + * Get the targetLanguage property: Target language for enhanced mode. + * + * @return the targetLanguage value. + */ + @Generated + public String getTargetLanguage() { + return this.targetLanguage; + } + + /** + * Set the targetLanguage property: Target language for enhanced mode. + * + * @param targetLanguage the targetLanguage value to set. + * @return the EnhancedModeProperties object itself. + */ + @Generated + public EnhancedModeProperties setTargetLanguage(String targetLanguage) { + this.targetLanguage = targetLanguage; + return this; + } + + /** + * Get the prompt property: A list of user prompts. + * + * @return the prompt value. + */ + @Generated + public List getPrompt() { + return this.prompt; + } + + /** + * Set the prompt property: A list of user prompts. + * + * @param prompt the prompt value to set. + * @return the EnhancedModeProperties object itself. + */ + @Generated + public EnhancedModeProperties setPrompt(List prompt) { + this.prompt = prompt; + return this; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeBooleanField("enabled", this.enabled); + jsonWriter.writeStringField("task", this.task); + jsonWriter.writeStringField("targetLanguage", this.targetLanguage); + jsonWriter.writeArrayField("prompt", this.prompt, (writer, element) -> writer.writeString(element)); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of EnhancedModeProperties from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of EnhancedModeProperties if the JsonReader was pointing to an instance of it, or null if it + * was pointing to JSON null. + * @throws IOException If an error occurs while reading the EnhancedModeProperties. + */ + @Generated + public static EnhancedModeProperties fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + EnhancedModeProperties deserializedEnhancedModeProperties = new EnhancedModeProperties(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("enabled".equals(fieldName)) { + deserializedEnhancedModeProperties.enabled = reader.getNullable(JsonReader::getBoolean); + } else if ("task".equals(fieldName)) { + deserializedEnhancedModeProperties.task = reader.getString(); + } else if ("targetLanguage".equals(fieldName)) { + deserializedEnhancedModeProperties.targetLanguage = reader.getString(); + } else if ("prompt".equals(fieldName)) { + List prompt = reader.readArray(reader1 -> reader1.getString()); + deserializedEnhancedModeProperties.prompt = prompt; + } else { + reader.skipChildren(); + } + } + return deserializedEnhancedModeProperties; + }); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListProperties.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListProperties.java new file mode 100644 index 000000000000..1df7b6fea2e3 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListProperties.java @@ -0,0 +1,123 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription.models; + +import com.azure.core.annotation.Fluent; +import com.azure.core.annotation.Generated; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; +import java.util.List; + +/** + * Phrase list properties for transcription. + */ +@Fluent +public final class PhraseListProperties implements JsonSerializable { + + /* + * List of phrases for recognition. + */ + @Generated + private List phrases; + + /* + * Biasing weight for phrase list (1.0 to 20.0). + */ + @Generated + private Double biasingWeight; + + /** + * Creates an instance of PhraseListProperties class. + */ + @Generated + public PhraseListProperties() { + } + + /** + * Get the phrases property: List of phrases for recognition. + * + * @return the phrases value. + */ + @Generated + public List getPhrases() { + return this.phrases; + } + + /** + * Set the phrases property: List of phrases for recognition. + * + * @param phrases the phrases value to set. + * @return the PhraseListProperties object itself. + */ + @Generated + public PhraseListProperties setPhrases(List phrases) { + this.phrases = phrases; + return this; + } + + /** + * Get the biasingWeight property: Biasing weight for phrase list (1.0 to 20.0). + * + * @return the biasingWeight value. + */ + @Generated + public Double getBiasingWeight() { + return this.biasingWeight; + } + + /** + * Set the biasingWeight property: Biasing weight for phrase list (1.0 to 20.0). + * + * @param biasingWeight the biasingWeight value to set. + * @return the PhraseListProperties object itself. + */ + @Generated + public PhraseListProperties setBiasingWeight(Double biasingWeight) { + this.biasingWeight = biasingWeight; + return this; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeArrayField("phrases", this.phrases, (writer, element) -> writer.writeString(element)); + jsonWriter.writeNumberField("biasingWeight", this.biasingWeight); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of PhraseListProperties from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of PhraseListProperties if the JsonReader was pointing to an instance of it, or null if it + * was pointing to JSON null. + * @throws IOException If an error occurs while reading the PhraseListProperties. + */ + @Generated + public static PhraseListProperties fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + PhraseListProperties deserializedPhraseListProperties = new PhraseListProperties(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("phrases".equals(fieldName)) { + List phrases = reader.readArray(reader1 -> reader1.getString()); + deserializedPhraseListProperties.phrases = phrases; + } else if ("biasingWeight".equals(fieldName)) { + deserializedPhraseListProperties.biasingWeight = reader.getNullable(JsonReader::getDouble); + } else { + reader.skipChildren(); + } + } + return deserializedPhraseListProperties; + }); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ProfanityFilterMode.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ProfanityFilterMode.java new file mode 100644 index 000000000000..8031bcadc6ae --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ProfanityFilterMode.java @@ -0,0 +1,69 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.util.ExpandableStringEnum; +import java.util.Collection; + +/** + * Mode of profanity filtering. + */ +public final class ProfanityFilterMode extends ExpandableStringEnum { + + /** + * Disable profanity filtering. + */ + @Generated + public static final ProfanityFilterMode NONE = fromString("None"); + + /** + * Remove profanity. + */ + @Generated + public static final ProfanityFilterMode REMOVED = fromString("Removed"); + + /** + * Add "profanity" XML tags</Profanity>. + */ + @Generated + public static final ProfanityFilterMode TAGS = fromString("Tags"); + + /** + * Mask the profanity with * except of the first letter, e.g., f***. + */ + @Generated + public static final ProfanityFilterMode MASKED = fromString("Masked"); + + /** + * Creates a new instance of ProfanityFilterMode value. + * + * @deprecated Use the {@link #fromString(String)} factory method. + */ + @Generated + @Deprecated + public ProfanityFilterMode() { + } + + /** + * Creates or finds a ProfanityFilterMode from its string representation. + * + * @param name a name to look for. + * @return the corresponding ProfanityFilterMode. + */ + @Generated + public static ProfanityFilterMode fromString(String name) { + return fromString(name, ProfanityFilterMode.class); + } + + /** + * Gets known ProfanityFilterMode values. + * + * @return known ProfanityFilterMode values. + */ + @Generated + public static Collection values() { + return values(ProfanityFilterMode.class); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribeRequestContent.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribeRequestContent.java new file mode 100644 index 000000000000..07eeb4ec2e91 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribeRequestContent.java @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription.models; + +import com.azure.core.annotation.Fluent; +import com.azure.core.annotation.Generated; + +/** + * Request model for transcription operation. + */ +@Fluent +public final class TranscribeRequestContent { + + /* + * Metadata for a transcription request. This field contains a JSON-serialized object of type + * `TranscriptionOptions`. + */ + @Generated + private TranscriptionOptions options; + + /* + * The content of the audio file to be transcribed. The audio file must be shorter than 2 hours in audio duration + * and smaller than 250 MB in size. Optional if audioUrl is provided in the definition. + */ + @Generated + private AudioFileDetails audio; + + /** + * Creates an instance of TranscribeRequestContent class. + */ + @Generated + public TranscribeRequestContent() { + } + + /** + * Get the options property: Metadata for a transcription request. This field contains a JSON-serialized object of + * type `TranscriptionOptions`. + * + * @return the options value. + */ + @Generated + public TranscriptionOptions getOptions() { + return this.options; + } + + /** + * Set the options property: Metadata for a transcription request. This field contains a JSON-serialized object of + * type `TranscriptionOptions`. + * + * @param options the options value to set. + * @return the TranscribeRequestContent object itself. + */ + @Generated + public TranscribeRequestContent setOptions(TranscriptionOptions options) { + this.options = options; + return this; + } + + /** + * Get the audio property: The content of the audio file to be transcribed. The audio file must be shorter than 2 + * hours in audio duration and smaller than 250 MB in size. Optional if audioUrl is provided in the definition. + * + * @return the audio value. + */ + @Generated + public AudioFileDetails getAudio() { + return this.audio; + } + + /** + * Set the audio property: The content of the audio file to be transcribed. The audio file must be shorter than 2 + * hours in audio duration and smaller than 250 MB in size. Optional if audioUrl is provided in the definition. + * + * @param audio the audio value to set. + * @return the TranscribeRequestContent object itself. + */ + @Generated + public TranscribeRequestContent setAudio(AudioFileDetails audio) { + this.audio = audio; + return this; + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java new file mode 100644 index 000000000000..11f18461290c --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java @@ -0,0 +1,237 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; +import java.util.List; + +/** + * A transcribed phrase. + */ +@Immutable +public final class TranscribedPhrase implements JsonSerializable { + + /* + * The 0-based channel index. Only present if channel separation is enabled. + */ + @Generated + private Integer channel; + + /* + * A unique integer number that is assigned to each speaker detected in the audio without particular order. Only + * present if speaker diarization is enabled. + */ + @Generated + private Integer speaker; + + /* + * The start offset of the phrase in milliseconds. + */ + @Generated + private final int offsetMilliseconds; + + /* + * The duration of the phrase in milliseconds. + */ + @Generated + private final int durationMilliseconds; + + /* + * The transcribed text of the phrase. + */ + @Generated + private final String text; + + /* + * The words that make up the phrase. Only present if word-level timestamps are enabled. + */ + @Generated + private List words; + + /* + * The locale of the phrase. + */ + @Generated + private String locale; + + /* + * The confidence value for the phrase. + */ + @Generated + private final double confidence; + + /** + * Creates an instance of TranscribedPhrase class. + * + * @param offsetMilliseconds the offsetMilliseconds value to set. + * @param durationMilliseconds the durationMilliseconds value to set. + * @param text the text value to set. + * @param confidence the confidence value to set. + */ + @Generated + private TranscribedPhrase(int offsetMilliseconds, int durationMilliseconds, String text, double confidence) { + this.offsetMilliseconds = offsetMilliseconds; + this.durationMilliseconds = durationMilliseconds; + this.text = text; + this.confidence = confidence; + } + + /** + * Get the channel property: The 0-based channel index. Only present if channel separation is enabled. + * + * @return the channel value. + */ + @Generated + public Integer getChannel() { + return this.channel; + } + + /** + * Get the speaker property: A unique integer number that is assigned to each speaker detected in the audio without + * particular order. Only present if speaker diarization is enabled. + * + * @return the speaker value. + */ + @Generated + public Integer getSpeaker() { + return this.speaker; + } + + /** + * Get the offsetMilliseconds property: The start offset of the phrase in milliseconds. + * + * @return the offsetMilliseconds value. + */ + @Generated + public int getOffsetMilliseconds() { + return this.offsetMilliseconds; + } + + /** + * Get the durationMilliseconds property: The duration of the phrase in milliseconds. + * + * @return the durationMilliseconds value. + */ + @Generated + public int getDurationMilliseconds() { + return this.durationMilliseconds; + } + + /** + * Get the text property: The transcribed text of the phrase. + * + * @return the text value. + */ + @Generated + public String getText() { + return this.text; + } + + /** + * Get the words property: The words that make up the phrase. Only present if word-level timestamps are enabled. + * + * @return the words value. + */ + @Generated + public List getWords() { + return this.words; + } + + /** + * Get the locale property: The locale of the phrase. + * + * @return the locale value. + */ + @Generated + public String getLocale() { + return this.locale; + } + + /** + * Get the confidence property: The confidence value for the phrase. + * + * @return the confidence value. + */ + @Generated + public double getConfidence() { + return this.confidence; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeIntField("offsetMilliseconds", this.offsetMilliseconds); + jsonWriter.writeIntField("durationMilliseconds", this.durationMilliseconds); + jsonWriter.writeStringField("text", this.text); + jsonWriter.writeDoubleField("confidence", this.confidence); + jsonWriter.writeNumberField("channel", this.channel); + jsonWriter.writeNumberField("speaker", this.speaker); + jsonWriter.writeArrayField("words", this.words, (writer, element) -> writer.writeJson(element)); + jsonWriter.writeStringField("locale", this.locale); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of TranscribedPhrase from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of TranscribedPhrase if the JsonReader was pointing to an instance of it, or null if it was + * pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the TranscribedPhrase. + */ + @Generated + public static TranscribedPhrase fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + int offsetMilliseconds = 0; + int durationMilliseconds = 0; + String text = null; + double confidence = 0.0; + Integer channel = null; + Integer speaker = null; + List words = null; + String locale = null; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("offsetMilliseconds".equals(fieldName)) { + offsetMilliseconds = reader.getInt(); + } else if ("durationMilliseconds".equals(fieldName)) { + durationMilliseconds = reader.getInt(); + } else if ("text".equals(fieldName)) { + text = reader.getString(); + } else if ("confidence".equals(fieldName)) { + confidence = reader.getDouble(); + } else if ("channel".equals(fieldName)) { + channel = reader.getNullable(JsonReader::getInt); + } else if ("speaker".equals(fieldName)) { + speaker = reader.getNullable(JsonReader::getInt); + } else if ("words".equals(fieldName)) { + words = reader.readArray(reader1 -> TranscribedWord.fromJson(reader1)); + } else if ("locale".equals(fieldName)) { + locale = reader.getString(); + } else { + reader.skipChildren(); + } + } + TranscribedPhrase deserializedTranscribedPhrase + = new TranscribedPhrase(offsetMilliseconds, durationMilliseconds, text, confidence); + deserializedTranscribedPhrase.channel = channel; + deserializedTranscribedPhrase.speaker = speaker; + deserializedTranscribedPhrase.words = words; + deserializedTranscribedPhrase.locale = locale; + return deserializedTranscribedPhrase; + }); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java new file mode 100644 index 000000000000..338fe177011b --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java @@ -0,0 +1,126 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * Time-stamped word in the display form. + */ +@Immutable +public final class TranscribedWord implements JsonSerializable { + + /* + * The recognized word, including punctuation. + */ + @Generated + private final String text; + + /* + * The start offset of the word in milliseconds. + */ + @Generated + private final int offsetMilliseconds; + + /* + * The duration of the word in milliseconds. + */ + @Generated + private final int durationMilliseconds; + + /** + * Creates an instance of TranscribedWord class. + * + * @param text the text value to set. + * @param offsetMilliseconds the offsetMilliseconds value to set. + * @param durationMilliseconds the durationMilliseconds value to set. + */ + @Generated + private TranscribedWord(String text, int offsetMilliseconds, int durationMilliseconds) { + this.text = text; + this.offsetMilliseconds = offsetMilliseconds; + this.durationMilliseconds = durationMilliseconds; + } + + /** + * Get the text property: The recognized word, including punctuation. + * + * @return the text value. + */ + @Generated + public String getText() { + return this.text; + } + + /** + * Get the offsetMilliseconds property: The start offset of the word in milliseconds. + * + * @return the offsetMilliseconds value. + */ + @Generated + public int getOffsetMilliseconds() { + return this.offsetMilliseconds; + } + + /** + * Get the durationMilliseconds property: The duration of the word in milliseconds. + * + * @return the durationMilliseconds value. + */ + @Generated + public int getDurationMilliseconds() { + return this.durationMilliseconds; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("text", this.text); + jsonWriter.writeIntField("offsetMilliseconds", this.offsetMilliseconds); + jsonWriter.writeIntField("durationMilliseconds", this.durationMilliseconds); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of TranscribedWord from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of TranscribedWord if the JsonReader was pointing to an instance of it, or null if it was + * pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the TranscribedWord. + */ + @Generated + public static TranscribedWord fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String text = null; + int offsetMilliseconds = 0; + int durationMilliseconds = 0; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("text".equals(fieldName)) { + text = reader.getString(); + } else if ("offsetMilliseconds".equals(fieldName)) { + offsetMilliseconds = reader.getInt(); + } else if ("durationMilliseconds".equals(fieldName)) { + durationMilliseconds = reader.getInt(); + } else { + reader.skipChildren(); + } + } + return new TranscribedWord(text, offsetMilliseconds, durationMilliseconds); + }); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java new file mode 100644 index 000000000000..eae7b66f98a4 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java @@ -0,0 +1,124 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription.models; + +import com.azure.core.annotation.Fluent; +import com.azure.core.annotation.Generated; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The Speaker Diarization settings. Diarization settings must be specified to enable speaker diarization. + */ +@Fluent +public final class TranscriptionDiarizationOptions implements JsonSerializable { + + /* + * Gets or sets a value indicating whether speaker diarization is enabled. + */ + @Generated + private Boolean enabled; + + /* + * Gets or sets a hint for the maximum number of speakers for diarization. Must be greater than 1 and less than 36. + */ + @Generated + private Integer maxSpeakers; + + /** + * Creates an instance of TranscriptionDiarizationOptions class. + */ + @Generated + public TranscriptionDiarizationOptions() { + } + + /** + * Get the enabled property: Gets or sets a value indicating whether speaker diarization is enabled. + * + * @return the enabled value. + */ + @Generated + public Boolean isEnabled() { + return this.enabled; + } + + /** + * Set the enabled property: Gets or sets a value indicating whether speaker diarization is enabled. + * + * @param enabled the enabled value to set. + * @return the TranscriptionDiarizationOptions object itself. + */ + @Generated + public TranscriptionDiarizationOptions setEnabled(Boolean enabled) { + this.enabled = enabled; + return this; + } + + /** + * Get the maxSpeakers property: Gets or sets a hint for the maximum number of speakers for diarization. Must be + * greater than 1 and less than 36. + * + * @return the maxSpeakers value. + */ + @Generated + public Integer getMaxSpeakers() { + return this.maxSpeakers; + } + + /** + * Set the maxSpeakers property: Gets or sets a hint for the maximum number of speakers for diarization. Must be + * greater than 1 and less than 36. + * + * @param maxSpeakers the maxSpeakers value to set. + * @return the TranscriptionDiarizationOptions object itself. + */ + @Generated + public TranscriptionDiarizationOptions setMaxSpeakers(Integer maxSpeakers) { + this.maxSpeakers = maxSpeakers; + return this; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeBooleanField("enabled", this.enabled); + jsonWriter.writeNumberField("maxSpeakers", this.maxSpeakers); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of TranscriptionDiarizationOptions from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of TranscriptionDiarizationOptions if the JsonReader was pointing to an instance of it, or + * null if it was pointing to JSON null. + * @throws IOException If an error occurs while reading the TranscriptionDiarizationOptions. + */ + @Generated + public static TranscriptionDiarizationOptions fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + TranscriptionDiarizationOptions deserializedTranscriptionDiarizationOptions + = new TranscriptionDiarizationOptions(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("enabled".equals(fieldName)) { + deserializedTranscriptionDiarizationOptions.enabled = reader.getNullable(JsonReader::getBoolean); + } else if ("maxSpeakers".equals(fieldName)) { + deserializedTranscriptionDiarizationOptions.maxSpeakers = reader.getNullable(JsonReader::getInt); + } else { + reader.skipChildren(); + } + } + return deserializedTranscriptionDiarizationOptions; + }); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java new file mode 100644 index 000000000000..5fd6d90aec17 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java @@ -0,0 +1,327 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription.models; + +import com.azure.core.annotation.Fluent; +import com.azure.core.annotation.Generated; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * Metadata for a transcription request. + */ +@Fluent +public final class TranscriptionOptions implements JsonSerializable { + + /* + * The URL of the audio to be transcribed. The audio must be shorter than 2 hours in audio duration and smaller than + * 250 MB in size. If both Audio and AudioUrl are provided, Audio is used. + */ + @Generated + private String audioUrl; + + /* + * A list of possible locales for the transcription. If not specified, the locale of the speech in the audio is + * detected automatically from all supported locales. + */ + @Generated + private List locales; + + /* + * Maps some or all candidate locales to a model URI to be used for transcription. If no mapping is given, the + * default model for the locale is used. + */ + @Generated + private Map models; + + /* + * Mode of profanity filtering. + */ + @Generated + private ProfanityFilterMode profanityFilterMode; + + /* + * Enhanced mode properties. + */ + @Generated + private EnhancedModeProperties enhancedMode; + + /* + * Phrase list properties. + */ + @Generated + private PhraseListProperties phraseList; + + /** + * Creates an instance of TranscriptionOptions class. + */ + @Generated + public TranscriptionOptions() { + } + + /** + * Get the audioUrl property: The URL of the audio to be transcribed. The audio must be shorter than 2 hours in + * audio duration and smaller than 250 MB in size. If both Audio and AudioUrl are provided, Audio is used. + * + * @return the audioUrl value. + */ + @Generated + public String getAudioUrl() { + return this.audioUrl; + } + + /** + * Set the audioUrl property: The URL of the audio to be transcribed. The audio must be shorter than 2 hours in + * audio duration and smaller than 250 MB in size. If both Audio and AudioUrl are provided, Audio is used. + * + * @param audioUrl the audioUrl value to set. + * @return the TranscriptionOptions object itself. + */ + @Generated + public TranscriptionOptions setAudioUrl(String audioUrl) { + this.audioUrl = audioUrl; + return this; + } + + /** + * Get the locales property: A list of possible locales for the transcription. If not specified, the locale of the + * speech in the audio is detected automatically from all supported locales. + * + * @return the locales value. + */ + @Generated + public List getLocales() { + return this.locales; + } + + /** + * Set the locales property: A list of possible locales for the transcription. If not specified, the locale of the + * speech in the audio is detected automatically from all supported locales. + * + * @param locales the locales value to set. + * @return the TranscriptionOptions object itself. + */ + @Generated + public TranscriptionOptions setLocales(List locales) { + this.locales = locales; + return this; + } + + /** + * Get the models property: Maps some or all candidate locales to a model URI to be used for transcription. If no + * mapping is given, the default model for the locale is used. + * + * @return the models value. + */ + @Generated + public Map getModels() { + return this.models; + } + + /** + * Set the models property: Maps some or all candidate locales to a model URI to be used for transcription. If no + * mapping is given, the default model for the locale is used. + * + * @param models the models value to set. + * @return the TranscriptionOptions object itself. + */ + @Generated + public TranscriptionOptions setModels(Map models) { + this.models = models; + return this; + } + + /** + * Get the profanityFilterMode property: Mode of profanity filtering. + * + * @return the profanityFilterMode value. + */ + @Generated + public ProfanityFilterMode getProfanityFilterMode() { + return this.profanityFilterMode; + } + + /** + * Set the profanityFilterMode property: Mode of profanity filtering. + * + * @param profanityFilterMode the profanityFilterMode value to set. + * @return the TranscriptionOptions object itself. + */ + @Generated + public TranscriptionOptions setProfanityFilterMode(ProfanityFilterMode profanityFilterMode) { + this.profanityFilterMode = profanityFilterMode; + return this; + } + + /** + * Get the enhancedMode property: Enhanced mode properties. + * + * @return the enhancedMode value. + */ + @Generated + public EnhancedModeProperties getEnhancedMode() { + return this.enhancedMode; + } + + /** + * Set the enhancedMode property: Enhanced mode properties. + * + * @param enhancedMode the enhancedMode value to set. + * @return the TranscriptionOptions object itself. + */ + @Generated + public TranscriptionOptions setEnhancedMode(EnhancedModeProperties enhancedMode) { + this.enhancedMode = enhancedMode; + return this; + } + + /** + * Get the phraseList property: Phrase list properties. + * + * @return the phraseList value. + */ + @Generated + public PhraseListProperties getPhraseList() { + return this.phraseList; + } + + /** + * Set the phraseList property: Phrase list properties. + * + * @param phraseList the phraseList value to set. + * @return the TranscriptionOptions object itself. + */ + @Generated + public TranscriptionOptions setPhraseList(PhraseListProperties phraseList) { + this.phraseList = phraseList; + return this; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("audioUrl", this.audioUrl); + jsonWriter.writeArrayField("locales", this.locales, (writer, element) -> writer.writeString(element)); + jsonWriter.writeMapField("models", this.models, (writer, element) -> writer.writeString(element)); + jsonWriter.writeStringField("profanityFilterMode", + this.profanityFilterMode == null ? null : this.profanityFilterMode.toString()); + jsonWriter.writeJsonField("diarization", this.diarizationOptions); + jsonWriter.writeArrayField("channels", this.activeChannels, (writer, element) -> writer.writeInt(element)); + jsonWriter.writeJsonField("enhancedMode", this.enhancedMode); + jsonWriter.writeJsonField("phraseList", this.phraseList); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of TranscriptionOptions from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of TranscriptionOptions if the JsonReader was pointing to an instance of it, or null if it + * was pointing to JSON null. + * @throws IOException If an error occurs while reading the TranscriptionOptions. + */ + @Generated + public static TranscriptionOptions fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + TranscriptionOptions deserializedTranscriptionOptions = new TranscriptionOptions(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("audioUrl".equals(fieldName)) { + deserializedTranscriptionOptions.audioUrl = reader.getString(); + } else if ("locales".equals(fieldName)) { + List locales = reader.readArray(reader1 -> reader1.getString()); + deserializedTranscriptionOptions.locales = locales; + } else if ("models".equals(fieldName)) { + Map models = reader.readMap(reader1 -> reader1.getString()); + deserializedTranscriptionOptions.models = models; + } else if ("profanityFilterMode".equals(fieldName)) { + deserializedTranscriptionOptions.profanityFilterMode + = ProfanityFilterMode.fromString(reader.getString()); + } else if ("diarization".equals(fieldName)) { + deserializedTranscriptionOptions.diarizationOptions + = TranscriptionDiarizationOptions.fromJson(reader); + } else if ("channels".equals(fieldName)) { + List activeChannels = reader.readArray(reader1 -> reader1.getInt()); + deserializedTranscriptionOptions.activeChannels = activeChannels; + } else if ("enhancedMode".equals(fieldName)) { + deserializedTranscriptionOptions.enhancedMode = EnhancedModeProperties.fromJson(reader); + } else if ("phraseList".equals(fieldName)) { + deserializedTranscriptionOptions.phraseList = PhraseListProperties.fromJson(reader); + } else { + reader.skipChildren(); + } + } + return deserializedTranscriptionOptions; + }); + } + + /* + * Mode of diarization. + */ + @Generated + private TranscriptionDiarizationOptions diarizationOptions; + + /* + * The 0-based indices of the channels to be transcribed separately. If not specified, multiple channels are merged + * and transcribed jointly. Only up to two channels are supported. + */ + @Generated + private List activeChannels; + + /** + * Get the diarizationOptions property: Mode of diarization. + * + * @return the diarizationOptions value. + */ + @Generated + public TranscriptionDiarizationOptions getDiarizationOptions() { + return this.diarizationOptions; + } + + /** + * Set the diarizationOptions property: Mode of diarization. + * + * @param diarizationOptions the diarizationOptions value to set. + * @return the TranscriptionOptions object itself. + */ + @Generated + public TranscriptionOptions setDiarizationOptions(TranscriptionDiarizationOptions diarizationOptions) { + this.diarizationOptions = diarizationOptions; + return this; + } + + /** + * Get the activeChannels property: The 0-based indices of the channels to be transcribed separately. If not + * specified, multiple channels are merged and transcribed jointly. Only up to two channels are supported. + * + * @return the activeChannels value. + */ + @Generated + public List getActiveChannels() { + return this.activeChannels; + } + + /** + * Set the activeChannels property: The 0-based indices of the channels to be transcribed separately. If not + * specified, multiple channels are merged and transcribed jointly. Only up to two channels are supported. + * + * @param activeChannels the activeChannels value to set. + * @return the TranscriptionOptions object itself. + */ + @Generated + public TranscriptionOptions setActiveChannels(List activeChannels) { + this.activeChannels = activeChannels; + return this; + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java new file mode 100644 index 000000000000..8c33f6fee92f --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java @@ -0,0 +1,129 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.speech.transcription.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; +import java.util.List; + +/** + * The result of the transcribe operation. + */ +@Immutable +public final class TranscriptionResult implements JsonSerializable { + + /* + * The duration of the audio in milliseconds. + */ + @Generated + private final int durationMilliseconds; + + /* + * The full transcript for each channel. + */ + @Generated + private final List combinedPhrases; + + /* + * The transcription results segmented into phrases. + */ + @Generated + private final List phrases; + + /** + * Creates an instance of TranscriptionResult class. + * + * @param durationMilliseconds the durationMilliseconds value to set. + * @param combinedPhrases the combinedPhrases value to set. + * @param phrases the phrases value to set. + */ + @Generated + private TranscriptionResult(int durationMilliseconds, List combinedPhrases, + List phrases) { + this.durationMilliseconds = durationMilliseconds; + this.combinedPhrases = combinedPhrases; + this.phrases = phrases; + } + + /** + * Get the durationMilliseconds property: The duration of the audio in milliseconds. + * + * @return the durationMilliseconds value. + */ + @Generated + public int getDurationMilliseconds() { + return this.durationMilliseconds; + } + + /** + * Get the combinedPhrases property: The full transcript for each channel. + * + * @return the combinedPhrases value. + */ + @Generated + public List getCombinedPhrases() { + return this.combinedPhrases; + } + + /** + * Get the phrases property: The transcription results segmented into phrases. + * + * @return the phrases value. + */ + @Generated + public List getPhrases() { + return this.phrases; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeIntField("durationMilliseconds", this.durationMilliseconds); + jsonWriter.writeArrayField("combinedPhrases", this.combinedPhrases, + (writer, element) -> writer.writeJson(element)); + jsonWriter.writeArrayField("phrases", this.phrases, (writer, element) -> writer.writeJson(element)); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of TranscriptionResult from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of TranscriptionResult if the JsonReader was pointing to an instance of it, or null if it was + * pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the TranscriptionResult. + */ + @Generated + public static TranscriptionResult fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + int durationMilliseconds = 0; + List combinedPhrases = null; + List phrases = null; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("durationMilliseconds".equals(fieldName)) { + durationMilliseconds = reader.getInt(); + } else if ("combinedPhrases".equals(fieldName)) { + combinedPhrases = reader.readArray(reader1 -> ChannelCombinedPhrases.fromJson(reader1)); + } else if ("phrases".equals(fieldName)) { + phrases = reader.readArray(reader1 -> TranscribedPhrase.fromJson(reader1)); + } else { + reader.skipChildren(); + } + } + return new TranscriptionResult(durationMilliseconds, combinedPhrases, phrases); + }); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/package-info.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/package-info.java new file mode 100644 index 000000000000..f1ff4db6a641 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/package-info.java @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +/** + * + * Package containing the data models for Transcription. + * + */ +package com.azure.ai.speech.transcription.models; diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/package-info.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/package-info.java new file mode 100644 index 000000000000..8e50f3224f2d --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/package-info.java @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +/** + * + * Package containing the classes for Transcription. + * + */ +package com.azure.ai.speech.transcription; diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java new file mode 100644 index 000000000000..29f86f2fb127 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +module com.azure.ai.speech.transcription { + requires transitive com.azure.core; + + exports com.azure.ai.speech.transcription; + exports com.azure.ai.speech.transcription.models; + + opens com.azure.ai.speech.transcription.models to com.azure.core, com.fasterxml.jackson.databind; +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json new file mode 100644 index 000000000000..46eef16fd976 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json @@ -0,0 +1,23 @@ +{ + "flavor": "azure", + "CrossLanguageDefinitionId": { + "com.azure.ai.speech.transcription.TranscriptionAsyncClient": "Azure.Ai.Speech.Transcription", + "com.azure.ai.speech.transcription.TranscriptionAsyncClient.transcribe": "Azure.Ai.Speech.Transcription.transcribe", + "com.azure.ai.speech.transcription.TranscriptionAsyncClient.transcribeWithResponse": "Azure.Ai.Speech.Transcription.transcribe", + "com.azure.ai.speech.transcription.TranscriptionClient": "Azure.Ai.Speech.Transcription", + "com.azure.ai.speech.transcription.TranscriptionClient.transcribe": "Azure.Ai.Speech.Transcription.transcribe", + "com.azure.ai.speech.transcription.TranscriptionClient.transcribeWithResponse": "Azure.Ai.Speech.Transcription.transcribe", + "com.azure.ai.speech.transcription.TranscriptionClientBuilder": "Azure.Ai.Speech.Transcription", + "com.azure.ai.speech.transcription.models.AudioFileDetails": null, + "com.azure.ai.speech.transcription.models.ChannelCombinedPhrases": "Azure.Ai.Speech.Transcription.ChannelCombinedPhrases", + "com.azure.ai.speech.transcription.models.EnhancedModeProperties": "Azure.Ai.Speech.Transcription.EnhancedModeProperties", + "com.azure.ai.speech.transcription.models.PhraseListProperties": "Azure.Ai.Speech.Transcription.PhraseListProperties", + "com.azure.ai.speech.transcription.models.ProfanityFilterMode": "Azure.Ai.Speech.Transcription.ProfanityFilterMode", + "com.azure.ai.speech.transcription.models.TranscribeRequestContent": "Azure.Ai.Speech.Transcription.TranscribeRequestContent", + "com.azure.ai.speech.transcription.models.TranscribedPhrase": "Azure.Ai.Speech.Transcription.TranscribedPhrase", + "com.azure.ai.speech.transcription.models.TranscribedWord": "Azure.Ai.Speech.Transcription.TranscribedWord", + "com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions": "Azure.Ai.Speech.Transcription.TranscriptionDiarizationOptions", + "com.azure.ai.speech.transcription.models.TranscriptionOptions": "Azure.Ai.Speech.Transcription.TranscriptionOptions", + "com.azure.ai.speech.transcription.models.TranscriptionResult": "Azure.Ai.Speech.Transcription.TranscriptionResult" + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json new file mode 100644 index 000000000000..6ddd770d8525 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json @@ -0,0 +1 @@ +{"flavor":"azure","apiVersion":"2025-10-15","crossLanguageDefinitions":{"com.azure.ai.speech.transcription.TranscriptionAsyncClient":"Azure.Ai.Speech.Transcription","com.azure.ai.speech.transcription.TranscriptionAsyncClient.transcribe":"Azure.Ai.Speech.Transcription.transcribe","com.azure.ai.speech.transcription.TranscriptionAsyncClient.transcribeWithResponse":"Azure.Ai.Speech.Transcription.transcribe","com.azure.ai.speech.transcription.TranscriptionClient":"Azure.Ai.Speech.Transcription","com.azure.ai.speech.transcription.TranscriptionClient.transcribe":"Azure.Ai.Speech.Transcription.transcribe","com.azure.ai.speech.transcription.TranscriptionClient.transcribeWithResponse":"Azure.Ai.Speech.Transcription.transcribe","com.azure.ai.speech.transcription.TranscriptionClientBuilder":"Azure.Ai.Speech.Transcription","com.azure.ai.speech.transcription.models.AudioFileDetails":null,"com.azure.ai.speech.transcription.models.ChannelCombinedPhrases":"Azure.Ai.Speech.Transcription.ChannelCombinedPhrases","com.azure.ai.speech.transcription.models.EnhancedModeProperties":"Azure.Ai.Speech.Transcription.EnhancedModeProperties","com.azure.ai.speech.transcription.models.PhraseListProperties":"Azure.Ai.Speech.Transcription.PhraseListProperties","com.azure.ai.speech.transcription.models.ProfanityFilterMode":"Azure.Ai.Speech.Transcription.ProfanityFilterMode","com.azure.ai.speech.transcription.models.TranscribeRequestContent":"Azure.Ai.Speech.Transcription.TranscribeRequestContent","com.azure.ai.speech.transcription.models.TranscribedPhrase":"Azure.Ai.Speech.Transcription.TranscribedPhrase","com.azure.ai.speech.transcription.models.TranscribedWord":"Azure.Ai.Speech.Transcription.TranscribedWord","com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions":"Azure.Ai.Speech.Transcription.TranscriptionDiarizationOptions","com.azure.ai.speech.transcription.models.TranscriptionOptions":"Azure.Ai.Speech.Transcription.TranscriptionOptions","com.azure.ai.speech.transcription.models.TranscriptionResult":"Azure.Ai.Speech.Transcription.TranscriptionResult"},"generatedFiles":["src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java","src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java","src/main/java/com/azure/ai/speech/transcription/TranscriptionClientBuilder.java","src/main/java/com/azure/ai/speech/transcription/TranscriptionServiceVersion.java","src/main/java/com/azure/ai/speech/transcription/implementation/MultipartFormDataHelper.java","src/main/java/com/azure/ai/speech/transcription/implementation/TranscriptionClientImpl.java","src/main/java/com/azure/ai/speech/transcription/implementation/package-info.java","src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java","src/main/java/com/azure/ai/speech/transcription/models/ChannelCombinedPhrases.java","src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeProperties.java","src/main/java/com/azure/ai/speech/transcription/models/PhraseListProperties.java","src/main/java/com/azure/ai/speech/transcription/models/ProfanityFilterMode.java","src/main/java/com/azure/ai/speech/transcription/models/TranscribeRequestContent.java","src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java","src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java","src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java","src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java","src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java","src/main/java/com/azure/ai/speech/transcription/models/package-info.java","src/main/java/com/azure/ai/speech/transcription/package-info.java","src/main/java/module-info.java"]} \ No newline at end of file diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/azure-ai-speech-transcription.properties b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/azure-ai-speech-transcription.properties new file mode 100644 index 000000000000..ca812989b4f2 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/azure-ai-speech-transcription.properties @@ -0,0 +1,2 @@ +name=${project.artifactId} +version=${project.version} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java new file mode 100644 index 000000000000..8954d87fe60b --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java @@ -0,0 +1,246 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +// BEGIN: com.azure.ai.speech.transcription.advanced.imports +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.ChannelCombinedPhrases; +import com.azure.ai.speech.transcription.models.ProfanityFilterMode; +import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscribedPhrase; +import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.http.policy.ExponentialBackoffOptions; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.http.policy.RetryOptions; +import com.azure.core.util.BinaryData; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.Duration; +import java.util.Arrays; +// END: com.azure.ai.speech.transcription.advanced.imports + +/** + * Sample demonstrates advanced features of Azure AI Speech Transcription including: + * - Custom client configuration (logging, retry policies) + * - API Key and Azure AD authentication options + * - Advanced transcription options (locale, profanity filtering, speaker diarization) + * - Detailed result processing with word-level timings and speaker information + */ +public class AdvancedTranscriptionSample { + /** + * Main method to run the advanced transcription sample. + * + * @param args command line arguments (not used) + */ + public static void main(String[] args) { + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + if (endpoint == null) { + System.err.println("Please set SPEECH_ENDPOINT environment variable"); + System.err.println("\nFor authentication, choose one of:"); + System.err.println(" Option 1: set SPEECH_API_KEY=your-api-key"); + System.err.println(" Option 2: Configure Azure AD credentials (DefaultAzureCredential)"); + return; + } + + System.out.println("Azure AI Speech Transcription - Advanced Features Sample"); + System.out.println("=========================================================\n"); + + // Example 1: Create client with custom configuration + demonstrateCustomClientConfiguration(endpoint, apiKey); + + // Example 2: Advanced transcription options + demonstrateAdvancedTranscriptionOptions(endpoint, apiKey); + + // Example 3: Detailed result processing + demonstrateDetailedResultProcessing(endpoint, apiKey); + } + + /** + * Demonstrates creating a client with custom HTTP logging and retry policies. + */ + private static void demonstrateCustomClientConfiguration(String endpoint, String apiKey) { + System.out.println("Example 1: Custom Client Configuration"); + System.out.println("---------------------------------------"); + + // BEGIN: com.azure.ai.speech.transcription.advanced.custom-client-config + // Configure HTTP logging for debugging + HttpLogOptions logOptions = new HttpLogOptions() + .setLogLevel(HttpLogDetailLevel.HEADERS); // Log request/response headers + + // Configure retry policy with exponential backoff + RetryOptions retryOptions = new RetryOptions( + new ExponentialBackoffOptions() + .setMaxRetries(5) + .setBaseDelay(Duration.ofSeconds(1)) + .setMaxDelay(Duration.ofSeconds(60)) + ); + + // Option 1: Use API Key authentication + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .httpLogOptions(logOptions) + .retryOptions(retryOptions) + .buildClient(); + + // Option 2: Use Azure AD authentication (recommended for production) + // TokenCredential credential = new DefaultAzureCredentialBuilder().build(); + // TranscriptionClient client = new TranscriptionClientBuilder() + // .endpoint(endpoint) + // .credential(credential) + // .httpLogOptions(logOptions) + // .retryOptions(retryOptions) + // .buildClient(); + // END: com.azure.ai.speech.transcription.advanced.custom-client-config + + System.out.println("✓ Client created with custom logging and retry configuration\n"); + } + + /** + * Demonstrates advanced transcription options including locale, profanity filtering, + * and speaker diarization. + */ + private static void demonstrateAdvancedTranscriptionOptions(String endpoint, String apiKey) { + System.out.println("Example 2: Advanced Transcription Options"); + System.out.println("------------------------------------------"); + + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + + try { + String audioFilePath = "sample-audio.wav"; + if (!Files.exists(Paths.get(audioFilePath))) { + System.out.println("⚠ Audio file not found: " + audioFilePath); + System.out.println(" Skipping this example.\n"); + return; + } + + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + // BEGIN: com.azure.ai.speech.transcription.advanced.transcription-options + // Configure advanced transcription options + TranscriptionOptions options = new TranscriptionOptions() + // Set specific locale(s) for transcription + .setLocales(Arrays.asList("en-US", "es-ES")) + // Control profanity handling: MASKED, REMOVED, RAW, or TAGS + .setProfanityFilterMode(ProfanityFilterMode.MASKED) + // Enable speaker diarization to identify different speakers + .setDiarizationOptions(new TranscriptionDiarizationOptions() + .setEnabled(true) + .setMaxSpeakers(5)); // Max number of speakers (2-36) + // END: com.azure.ai.speech.transcription.advanced.transcription-options + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + System.out.println("Configured options:"); + System.out.println(" - Locales: en-US, es-ES"); + System.out.println(" - Profanity filter: MASKED"); + System.out.println(" - Speaker diarization: up to 5 speakers"); + System.out.println("\nTranscribing..."); + + TranscriptionResult result = client.transcribe(requestContent); + + System.out.println("\n✓ Transcription completed with advanced options"); + System.out.println(" Duration: " + result.getDurationMilliseconds() + " ms\n"); + + } catch (IOException e) { + System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); + } catch (Exception e) { + System.err.println("✗ Error during transcription: " + e.getMessage() + "\n"); + } + } + + /** + * Demonstrates detailed processing of transcription results including + * word-level timings and speaker attribution. + */ + private static void demonstrateDetailedResultProcessing(String endpoint, String apiKey) { + System.out.println("Example 3: Detailed Result Processing"); + System.out.println("--------------------------------------"); + + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + + try { + String audioFilePath = "sample-audio.wav"; + if (!Files.exists(Paths.get(audioFilePath))) { + System.out.println("⚠ Audio file not found: " + audioFilePath); + System.out.println(" Skipping this example.\n"); + return; + } + + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + // Enable diarization for speaker identification + TranscriptionOptions options = new TranscriptionOptions() + .setDiarizationOptions(new TranscriptionDiarizationOptions().setEnabled(true)); + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + TranscriptionResult result = client.transcribe(requestContent); + + // BEGIN: com.azure.ai.speech.transcription.advanced.detailed-results + // Process combined phrases (sentence-level results) + if (result.getCombinedPhrases() != null) { + System.out.println("Combined Phrases (Sentence-level):"); + for (ChannelCombinedPhrases channelPhrase : result.getCombinedPhrases()) { + System.out.printf(" [Channel %d] %s%n", + channelPhrase.getChannel(), channelPhrase.getText()); + } + System.out.println(); + } + + // Process detailed phrases with word-level information + if (result.getPhrases() != null) { + System.out.println("Detailed Phrases (Word-level):"); + for (TranscribedPhrase phrase : result.getPhrases()) { + System.out.printf(" Speaker %d (%.2f-%.2fs): %s%n", + phrase.getSpeaker() != null ? phrase.getSpeaker() : 0, + phrase.getOffsetMilliseconds() / 1000.0, + (phrase.getOffsetMilliseconds() + phrase.getDurationMilliseconds()) / 1000.0, + phrase.getText()); + + // Show word-level timings + if (phrase.getWords() != null) { + System.out.println(" Word timings:"); + phrase.getWords().forEach(word -> + System.out.printf(" - \"%s\" [%.2fs]%n", + word.getText(), + word.getOffsetMilliseconds() / 1000.0) + ); + } + } + } + // END: com.azure.ai.speech.transcription.advanced.detailed-results + + System.out.println("\n✓ Detailed result processing completed\n"); + + } catch (IOException e) { + System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); + } catch (Exception e) { + System.err.println("✗ Error during transcription: " + e.getMessage() + "\n"); + } + } +} + diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java new file mode 100644 index 000000000000..d156e3f2d97d --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java @@ -0,0 +1,256 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +// BEGIN: com.azure.ai.speech.transcription.async.imports +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.util.BinaryData; +import reactor.core.publisher.Mono; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.Duration; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +// END: com.azure.ai.speech.transcription.async.imports + +/** + * Sample demonstrates asynchronous usage of Azure AI Speech Transcription using + * the TranscriptionAsyncClient with Project Reactor. + * + * This sample shows: + * - Creating a TranscriptionAsyncClient with API Key or Azure AD authentication + * - Using reactive programming with Mono + * - Different patterns: subscribe(), block(), and timeout() + * - Handling async errors with doOnError() + */ +public class AsyncTranscriptionSample { + /** + * Main method to run the async transcription sample. + * + * @param args command line arguments (not used) + */ + public static void main(String[] args) { + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + if (endpoint == null) { + System.err.println("Please set SPEECH_ENDPOINT environment variable"); + System.err.println("\nFor authentication, choose one of:"); + System.err.println(" Option 1: set SPEECH_API_KEY=your-api-key"); + System.err.println(" Option 2: Configure Azure AD credentials (DefaultAzureCredential)"); + return; + } + + System.out.println("Azure AI Speech Transcription - Async Sample"); + System.out.println("=============================================\n"); + + // Example 1: Using subscribe() with reactive callbacks + demonstrateSubscribePattern(endpoint, apiKey); + + // Example 2: Using block() to wait for completion + demonstrateBlockPattern(endpoint, apiKey); + + // Example 3: Using timeout and error handling + demonstrateTimeoutAndErrorHandling(endpoint, apiKey); + } + + /** + * Demonstrates the subscribe() pattern for non-blocking async operations. + * This is the recommended approach for truly asynchronous code. + */ + private static void demonstrateSubscribePattern(String endpoint, String apiKey) { + System.out.println("Example 1: Subscribe Pattern (Non-blocking)"); + System.out.println("--------------------------------------------"); + + // Create async client with API Key authentication + // BEGIN: com.azure.ai.speech.transcription.async.create-client.apikey + TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildAsyncClient(); + // END: com.azure.ai.speech.transcription.async.create-client.apikey + + // Alternative: Create async client with Azure AD authentication + // BEGIN: com.azure.ai.speech.transcription.async.create-client.azuread + // TokenCredential credential = new DefaultAzureCredentialBuilder().build(); + // TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() + // .endpoint(endpoint) + // .credential(credential) + // .buildAsyncClient(); + // END: com.azure.ai.speech.transcription.async.create-client.azuread + + try { + String audioFilePath = "sample-audio.wav"; + if (!Files.exists(Paths.get(audioFilePath))) { + System.out.println("⚠ Audio file not found: " + audioFilePath); + System.out.println(" Skipping this example.\n"); + return; + } + + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + TranscriptionOptions options = new TranscriptionOptions(); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + System.out.println("Starting async transcription with subscribe()..."); + + // BEGIN: com.azure.ai.speech.transcription.async.subscribe-pattern + // Use CountDownLatch to wait for async operation in this sample + // In real applications, you wouldn't need this - the reactive chain would continue + CountDownLatch latch = new CountDownLatch(1); + + // Subscribe to the Mono with success and error callbacks + asyncClient.transcribe(requestContent) + .doOnSubscribe(subscription -> + System.out.println(" → Subscribed to transcription operation")) + .doOnNext(result -> + System.out.println(" → Received result")) + .subscribe( + // onNext: Called when result is available + result -> { + System.out.println("\n✓ Transcription completed!"); + System.out.println(" Duration: " + result.getDurationMilliseconds() + " ms"); + if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { + result.getCombinedPhrases().forEach(phrase -> + System.out.println(" Text: " + phrase.getText()) + ); + } + latch.countDown(); + }, + // onError: Called if an error occurs + error -> { + System.err.println("✗ Error during transcription: " + error.getMessage()); + latch.countDown(); + }, + // onComplete: Called when the Mono completes + () -> System.out.println(" → Operation completed\n") + ); + + // Wait for completion (only for this sample - not typical in reactive code) + latch.await(60, TimeUnit.SECONDS); + // END: com.azure.ai.speech.transcription.async.subscribe-pattern + + } catch (Exception e) { + System.err.println("✗ Error: " + e.getMessage() + "\n"); + } + } + + /** + * Demonstrates the block() pattern which converts async to sync. + * Use this when you need to integrate with synchronous code. + */ + private static void demonstrateBlockPattern(String endpoint, String apiKey) { + System.out.println("Example 2: Block Pattern (Sync over Async)"); + System.out.println("-------------------------------------------"); + + TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildAsyncClient(); + + try { + String audioFilePath = "sample-audio.wav"; + if (!Files.exists(Paths.get(audioFilePath))) { + System.out.println("⚠ Audio file not found: " + audioFilePath); + System.out.println(" Skipping this example.\n"); + return; + } + + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + TranscriptionOptions options = new TranscriptionOptions(); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + System.out.println("Starting async transcription with block()..."); + + // BEGIN: com.azure.ai.speech.transcription.async.block-pattern + // block() waits for the operation to complete and returns the result + // This is useful when integrating async client with synchronous code + TranscriptionResult result = asyncClient.transcribe(requestContent).block(); + // END: com.azure.ai.speech.transcription.async.block-pattern + + if (result != null) { + System.out.println("\n✓ Transcription completed!"); + System.out.println(" Duration: " + result.getDurationMilliseconds() + " ms\n"); + } + + } catch (Exception e) { + System.err.println("✗ Error: " + e.getMessage() + "\n"); + } + } + + /** + * Demonstrates timeout configuration and comprehensive error handling. + */ + private static void demonstrateTimeoutAndErrorHandling(String endpoint, String apiKey) { + System.out.println("Example 3: Timeout and Error Handling"); + System.out.println("--------------------------------------"); + + TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildAsyncClient(); + + try { + String audioFilePath = "sample-audio.wav"; + if (!Files.exists(Paths.get(audioFilePath))) { + System.out.println("⚠ Audio file not found: " + audioFilePath); + System.out.println(" Skipping this example.\n"); + return; + } + + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + TranscriptionOptions options = new TranscriptionOptions(); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + System.out.println("Starting async transcription with timeout and error handling..."); + + // BEGIN: com.azure.ai.speech.transcription.async.timeout-error-handling + Mono transcriptionMono = asyncClient.transcribe(requestContent) + // Set a timeout for the operation + .timeout(Duration.ofMinutes(2)) + // Handle errors + .doOnError(error -> { + System.err.println(" → Error occurred: " + error.getClass().getSimpleName()); + System.err.println(" → Message: " + error.getMessage()); + }) + // Provide fallback behavior on error (optional) + .onErrorResume(error -> { + System.err.println(" → Attempting fallback behavior..."); + return Mono.empty(); // Return empty result as fallback + }); + + // Execute and wait for result + TranscriptionResult result = transcriptionMono.block(); + // END: com.azure.ai.speech.transcription.async.timeout-error-handling + + if (result != null) { + System.out.println("\n✓ Transcription completed successfully!"); + } else { + System.out.println("\n⚠ No result (possibly due to error fallback)\n"); + } + + } catch (Exception e) { + System.err.println("✗ Error: " + e.getMessage() + "\n"); + } + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java new file mode 100644 index 000000000000..901c9ee69bd2 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java @@ -0,0 +1,153 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +// BEGIN: com.azure.ai.speech.transcription.basic.imports +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.credential.TokenCredential; +import com.azure.core.util.BinaryData; +import com.azure.identity.DefaultAzureCredentialBuilder; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +// END: com.azure.ai.speech.transcription.basic.imports + +/** + * Sample demonstrates the most basic usage of Azure AI Speech Transcription client to transcribe + * an audio file with default settings. + * + * This sample shows: + * - Creating a TranscriptionClient with endpoint and API key (or Azure AD token) + * - Reading an audio file from disk + * - Transcribing the audio with default options + * - Accessing transcription results + */ +public class BasicTranscriptionSample { + /** + * Main method to run the basic transcription sample. + * + * @param args command line arguments (not used) + */ + public static void main(String[] args) { + // PREREQUISITE: Set environment variables for authentication + // + // Option 1: API Key Authentication + // set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/ + // set SPEECH_API_KEY=your-api-key + // + // Option 2: Azure AD Authentication (recommended for production) + // set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/ + // Ensure you have configured Azure AD credentials (managed identity, service principal, etc.) + + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + if (endpoint == null) { + System.err.println("Please set SPEECH_ENDPOINT environment variable"); + System.err.println("Example:"); + System.err.println(" set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/"); + System.err.println("\nFor authentication, choose one of:"); + System.err.println(" Option 1: set SPEECH_API_KEY=your-api-key"); + System.err.println(" Option 2: Configure Azure AD credentials (DefaultAzureCredential)"); + return; + } + + // Create the transcription client with appropriate authentication + TranscriptionClient client; + + if (apiKey != null && !apiKey.isEmpty()) { + // BEGIN: com.azure.ai.speech.transcription.basic.create-client.apikey + // Option 1: Use API Key authentication + client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + // END: com.azure.ai.speech.transcription.basic.create-client.apikey + System.out.println("Using API Key authentication"); + } else { + // BEGIN: com.azure.ai.speech.transcription.basic.create-client.azuread + // Option 2: Use Azure AD authentication (recommended for production) + TokenCredential credential = new DefaultAzureCredentialBuilder().build(); + client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(credential) + .buildClient(); + // END: com.azure.ai.speech.transcription.basic.create-client.azuread + System.out.println("Using Azure AD authentication"); + } + + System.out.println("Azure AI Speech Transcription - Basic Sample"); + System.out.println("==============================================\n"); + + try { + // For this sample, you need an audio file. Common formats include: + // - WAV (16 kHz, 16-bit, mono PCM recommended) + // - MP3, OGG, FLAC, etc. + // Maximum file size: 250 MB + // Maximum duration: 2 hours + + String audioFilePath = "sample-audio.wav"; + if (!Files.exists(Paths.get(audioFilePath))) { + System.err.println("Audio file not found: " + audioFilePath); + System.err.println("Please provide a valid audio file path."); + return; + } + + // BEGIN: com.azure.ai.speech.transcription.basic.read-audio-file + // Read the audio file + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + System.out.println("Audio file loaded: " + audioFilePath); + System.out.println("File size: " + audioData.length + " bytes\n"); + // END: com.azure.ai.speech.transcription.basic.read-audio-file + + // BEGIN: com.azure.ai.speech.transcription.basic.transcribe + // Create audio file details + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + // Create transcription options (using defaults) + TranscriptionOptions options = new TranscriptionOptions(); + + // Create the transcribe request + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + System.out.println("Starting transcription..."); + + // Transcribe the audio + TranscriptionResult result = client.transcribe(requestContent); + // END: com.azure.ai.speech.transcription.basic.transcribe + + // BEGIN: com.azure.ai.speech.transcription.basic.process-results + // Display results + System.out.println("\nTranscription Results:"); + System.out.println("----------------------"); + System.out.println("Duration: " + result.getDurationMilliseconds() + " ms"); + + if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { + System.out.println("\nTranscribed Text:"); + result.getCombinedPhrases().forEach(phrase -> { + System.out.println(" Channel " + phrase.getChannel() + ": " + phrase.getText()); + }); + } else { + System.out.println("No transcription results found."); + } + // END: com.azure.ai.speech.transcription.basic.process-results + + System.out.println("\nTranscription completed successfully!"); + + } catch (IOException e) { + System.err.println("Error reading audio file: " + e.getMessage()); + } catch (Exception e) { + System.err.println("Error during transcription: " + e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java new file mode 100644 index 000000000000..6bb44a60b4f6 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java @@ -0,0 +1,349 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +// BEGIN: com.azure.ai.speech.transcription.enhancedmode.imports +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.EnhancedModeProperties; +import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.util.BinaryData; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; +// END: com.azure.ai.speech.transcription.enhancedmode.imports + +/** + * Sample demonstrates how to use EnhancedModeProperties to improve transcription quality + * with features like custom prompts, translation, and task-specific configurations. + * + * This sample shows: + * - Enabling enhanced mode for improved transcription accuracy + * - Using custom prompts to guide transcription with domain-specific terminology + * - Configuring translation to transcribe audio in one language and translate to another + * - Setting task-specific configurations for different use cases + */ +public class EnhancedModeSample { + /** + * Main method to run the enhanced mode sample. + * + * @param args command line arguments (not used) + */ + public static void main(String[] args) { + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + if (endpoint == null || apiKey == null) { + System.err.println("Please set SPEECH_ENDPOINT and SPEECH_API_KEY environment variables"); + System.err.println("Example:"); + System.err.println(" set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/"); + System.err.println(" set SPEECH_API_KEY=your-api-key"); + return; + } + + System.out.println("Azure AI Speech Transcription - Enhanced Mode Sample"); + System.out.println("=====================================================\n"); + + // Example 1: Basic enhanced mode + demonstrateBasicEnhancedMode(endpoint, apiKey); + + // Example 2: Enhanced mode with custom prompts + demonstrateEnhancedModeWithPrompts(endpoint, apiKey); + + // Example 3: Enhanced mode with translation + demonstrateEnhancedModeWithTranslation(endpoint, apiKey); + + // Example 4: Enhanced mode with task-specific configuration + demonstrateTaskSpecificEnhancedMode(endpoint, apiKey); + } + + /** + * Demonstrates basic usage of enhanced mode to improve transcription quality. + */ + private static void demonstrateBasicEnhancedMode(String endpoint, String apiKey) { + System.out.println("Example 1: Basic Enhanced Mode"); + System.out.println("-------------------------------"); + + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + + try { + String audioFilePath = "sample-audio.wav"; + if (!Files.exists(Paths.get(audioFilePath))) { + System.out.println("⚠ Audio file not found: " + audioFilePath); + System.out.println(" Skipping this example.\n"); + return; + } + + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + // BEGIN: com.azure.ai.speech.transcription.enhancedmode.basic + // Enable enhanced mode for improved transcription quality + EnhancedModeProperties enhancedMode = new EnhancedModeProperties() + .setEnabled(true); + + TranscriptionOptions options = new TranscriptionOptions() + .setLocales(Arrays.asList("en-US")) + .setEnhancedMode(enhancedMode); + // END: com.azure.ai.speech.transcription.enhancedmode.basic + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + System.out.println("Transcribing with enhanced mode enabled..."); + + TranscriptionResult result = client.transcribe(requestContent); + + System.out.println("✓ Enhanced mode enabled"); + System.out.println("Duration: " + result.getDurationMilliseconds() + " ms"); + if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { + System.out.println("Transcription: " + result.getCombinedPhrases().get(0).getText()); + } + System.out.println(); + + } catch (IOException e) { + System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); + } catch (Exception e) { + System.err.println("✗ Error during transcription: " + e.getMessage() + "\n"); + } + } + + /** + * Demonstrates using enhanced mode with custom prompts to guide transcription. + * Prompts help improve accuracy for domain-specific terminology, names, or context. + */ + private static void demonstrateEnhancedModeWithPrompts(String endpoint, String apiKey) { + System.out.println("Example 2: Enhanced Mode with Custom Prompts"); + System.out.println("---------------------------------------------"); + + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + + try { + String audioFilePath = "medical-consultation.wav"; + if (!Files.exists(Paths.get(audioFilePath))) { + System.out.println("⚠ Audio file not found: " + audioFilePath); + System.out.println(" Skipping this example.\n"); + return; + } + + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + // BEGIN: com.azure.ai.speech.transcription.enhancedmode.prompts + // Use prompts to guide transcription with domain-specific terminology + EnhancedModeProperties enhancedMode = new EnhancedModeProperties() + .setEnabled(true) + .setPrompt(Arrays.asList( + "Medical consultation discussing hypertension and diabetes", + "Common medications: metformin, lisinopril, atorvastatin", + "Patient symptoms and treatment plan" + )); + + TranscriptionOptions options = new TranscriptionOptions() + .setLocales(Arrays.asList("en-US")) + .setEnhancedMode(enhancedMode); + // END: com.azure.ai.speech.transcription.enhancedmode.prompts + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + System.out.println("Transcribing with custom prompts..."); + + TranscriptionResult result = client.transcribe(requestContent); + + System.out.println("✓ Enhanced mode with custom prompts"); + System.out.println("Prompts used:"); + for (String prompt : enhancedMode.getPrompt()) { + System.out.println(" - " + prompt); + } + if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { + System.out.println("\nTranscription: " + result.getCombinedPhrases().get(0).getText()); + } + System.out.println(); + + } catch (IOException e) { + System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); + } catch (Exception e) { + System.err.println("✗ Error during transcription: " + e.getMessage() + "\n"); + } + } + + /** + * Demonstrates using enhanced mode with translation to transcribe and translate + * audio from one language to another. + */ + private static void demonstrateEnhancedModeWithTranslation(String endpoint, String apiKey) { + System.out.println("Example 3: Enhanced Mode with Translation"); + System.out.println("------------------------------------------"); + + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + + try { + String audioFilePath = "spanish-audio.wav"; + if (!Files.exists(Paths.get(audioFilePath))) { + System.out.println("⚠ Audio file not found: " + audioFilePath); + System.out.println(" Skipping this example.\n"); + return; + } + + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + // BEGIN: com.azure.ai.speech.transcription.enhancedmode.translation + // Configure enhanced mode to transcribe Spanish audio and translate to English + EnhancedModeProperties enhancedMode = new EnhancedModeProperties() + .setEnabled(true) + .setTargetLanguage("en-US"); // Translate to English + + TranscriptionOptions options = new TranscriptionOptions() + .setLocales(Arrays.asList("es-ES")) // Source language: Spanish + .setEnhancedMode(enhancedMode); + // END: com.azure.ai.speech.transcription.enhancedmode.translation + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + System.out.println("Transcribing and translating..."); + + TranscriptionResult result = client.transcribe(requestContent); + + System.out.println("✓ Enhanced mode with translation"); + System.out.println("Source language: es-ES"); + System.out.println("Target language: " + enhancedMode.getTargetLanguage()); + if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { + System.out.println("\nTranscription (translated): " + result.getCombinedPhrases().get(0).getText()); + } + System.out.println(); + + } catch (IOException e) { + System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); + } catch (Exception e) { + System.err.println("✗ Error during transcription: " + e.getMessage() + "\n"); + } + } + + /** + * Demonstrates using enhanced mode with task-specific configuration. + * Different tasks may benefit from different enhanced mode settings. + */ + private static void demonstrateTaskSpecificEnhancedMode(String endpoint, String apiKey) { + System.out.println("Example 4: Task-Specific Enhanced Mode"); + System.out.println("---------------------------------------"); + + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + + try { + String audioFilePath = "business-meeting.wav"; + if (!Files.exists(Paths.get(audioFilePath))) { + System.out.println("⚠ Audio file not found: " + audioFilePath); + System.out.println(" Skipping this example.\n"); + return; + } + + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + // BEGIN: com.azure.ai.speech.transcription.enhancedmode.taskspecific + // Configure enhanced mode for a specific task type (e.g., meeting transcription) + EnhancedModeProperties enhancedMode = new EnhancedModeProperties() + .setEnabled(true) + .setTask("meeting") // Task type: meeting, interview, presentation, etc. + .setPrompt(Arrays.asList( + "Business meeting about Q4 revenue projections", + "Participants: CEO, CFO, Sales Director", + "Topics: budget, forecasts, market trends" + )); + + TranscriptionOptions options = new TranscriptionOptions() + .setLocales(Arrays.asList("en-US")) + .setEnhancedMode(enhancedMode); + // END: com.azure.ai.speech.transcription.enhancedmode.taskspecific + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + System.out.println("Transcribing with task-specific configuration..."); + + TranscriptionResult result = client.transcribe(requestContent); + + System.out.println("✓ Enhanced mode with task-specific configuration"); + System.out.println("Task type: " + enhancedMode.getTask()); + System.out.println("Enabled: " + enhancedMode.isEnabled()); + if (result.getPhrases() != null && !result.getPhrases().isEmpty()) { + System.out.println("\nTranscription phrases:"); + result.getPhrases().forEach(phrase -> + System.out.println(" [" + phrase.getOffsetMilliseconds() + "ms] " + phrase.getText()) + ); + } + System.out.println(); + + } catch (IOException e) { + System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); + } catch (Exception e) { + System.err.println("✗ Error during transcription: " + e.getMessage() + "\n"); + } + } + + /** + * Demonstrates combining multiple enhanced mode features for optimal results. + */ + // BEGIN: com.azure.ai.speech.transcription.enhancedmode.complete + private static TranscriptionResult transcribeWithFullEnhancedMode( + TranscriptionClient client, + byte[] audioData, + String filename + ) throws Exception { + // Create audio file details + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(filename); + + // Configure comprehensive enhanced mode settings + EnhancedModeProperties enhancedMode = new EnhancedModeProperties() + .setEnabled(true) + .setTask("interview") + .setTargetLanguage("en-US") + .setPrompt(Arrays.asList( + "Technical interview about cloud architecture", + "Topics: Azure, microservices, Kubernetes, DevOps", + "Key terms: containerization, scalability, CI/CD" + )); + + // Create transcription options with enhanced mode + TranscriptionOptions options = new TranscriptionOptions() + .setLocales(Arrays.asList("en-US")) + .setEnhancedMode(enhancedMode); + + // Create request and transcribe + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + return client.transcribe(requestContent); + } + // END: com.azure.ai.speech.transcription.enhancedmode.complete +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java new file mode 100644 index 000000000000..40b331f0d945 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java @@ -0,0 +1,368 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +// BEGIN: com.azure.ai.speech.transcription.error.imports +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.credential.TokenCredential; +import com.azure.core.exception.ClientAuthenticationException; +import com.azure.core.exception.HttpResponseException; +import com.azure.core.http.HttpResponse; +import com.azure.core.util.BinaryData; +import com.azure.identity.DefaultAzureCredentialBuilder; +import com.azure.identity.CredentialUnavailableException; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +// END: com.azure.ai.speech.transcription.error.imports + +/** + * Sample demonstrates proper error handling patterns when using Azure AI Speech Transcription. + * + * This sample shows how to handle: + * - Authentication errors (invalid API key, Azure AD token errors, or endpoint) + * - Invalid audio format errors + * - File not found errors + * - Service-side errors (rate limiting, service unavailable) + * - Network errors + */ +public class ErrorHandlingSample { + /** + * Main method to run the error handling sample. + * + * @param args command line arguments (not used) + */ + public static void main(String[] args) { + System.out.println("Azure AI Speech Transcription - Error Handling Sample"); + System.out.println("======================================================\n"); + + // Example 1: Handling API Key authentication errors + demonstrateAuthenticationErrorHandling(); + + // Example 2: Handling Azure AD authentication errors + demonstrateAzureAdAuthenticationErrorHandling(); + + // Example 3: Handling file I/O errors + demonstrateFileErrorHandling(); + + // Example 4: Handling service errors + demonstrateServiceErrorHandling(); + + // Example 5: Comprehensive error handling + demonstrateComprehensiveErrorHandling(); + } + + /** + * Demonstrates handling API Key authentication-related errors. + */ + private static void demonstrateAuthenticationErrorHandling() { + System.out.println("Example 1: API Key Authentication Error Handling"); + System.out.println("-------------------------------------------------"); + + // Intentionally use invalid credentials to demonstrate error handling + String invalidEndpoint = "https://invalid-endpoint.cognitiveservices.azure.com/"; + String invalidApiKey = "invalid-api-key"; + + // BEGIN: com.azure.ai.speech.transcription.error.authentication.apikey + try { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(invalidEndpoint) + .credential(new KeyCredential(invalidApiKey)) + .buildClient(); + + // This will fail with authentication error + byte[] dummyAudio = new byte[1024]; + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(dummyAudio)); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(new TranscriptionOptions()); + + client.transcribe(requestContent); + + } catch (ClientAuthenticationException e) { + // Specific exception for authentication failures + System.err.println("✗ Authentication failed!"); + System.err.println(" Error: " + e.getMessage()); + System.err.println(" → Please verify your API key and endpoint are correct"); + System.err.println(" → Ensure your Azure resource is active and not expired\n"); + } catch (Exception e) { + System.err.println("✗ Unexpected error: " + e.getMessage() + "\n"); + } + // END: com.azure.ai.speech.transcription.error.authentication.apikey + } + + /** + * Demonstrates handling Azure AD authentication-related errors. + */ + private static void demonstrateAzureAdAuthenticationErrorHandling() { + System.out.println("Example 2: Azure AD Authentication Error Handling"); + System.out.println("--------------------------------------------------"); + + String endpoint = System.getenv("SPEECH_ENDPOINT"); + if (endpoint == null) { + endpoint = "https://example.cognitiveservices.azure.com/"; + } + + // BEGIN: com.azure.ai.speech.transcription.error.authentication.azuread + try { + TokenCredential credential = new DefaultAzureCredentialBuilder().build(); + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(credential) + .buildClient(); + + // Attempt to transcribe (may fail if Azure AD not configured) + byte[] dummyAudio = new byte[1024]; + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(dummyAudio)); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(new TranscriptionOptions()); + + client.transcribe(requestContent); + + } catch (CredentialUnavailableException e) { + // No Azure AD credential sources are available + System.err.println("✗ Azure AD credentials unavailable!"); + System.err.println(" Error: " + e.getMessage()); + System.err.println(" → Ensure you have configured at least one credential source:"); + System.err.println(" - Managed Identity (for Azure-hosted apps)"); + System.err.println(" - Azure CLI (run 'az login')"); + System.err.println(" - Environment variables (AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET)"); + System.err.println(" - Visual Studio Code or IntelliJ authentication\n"); + } catch (ClientAuthenticationException e) { + // Authentication token invalid or expired + System.err.println("✗ Azure AD authentication failed!"); + System.err.println(" Error: " + e.getMessage()); + System.err.println(" → Verify your identity has 'Cognitive Services User' role assigned"); + System.err.println(" → Check if your token has expired or is invalid"); + System.err.println(" → Ensure Azure AD authentication is enabled on the resource\n"); + } catch (Exception e) { + System.err.println("✗ Unexpected error: " + e.getMessage() + "\n"); + } + // END: com.azure.ai.speech.transcription.error.authentication.azuread + } + + /** + * Demonstrates handling file I/O errors. + */ + private static void demonstrateFileErrorHandling() { + System.out.println("Example 3: File Error Handling"); + System.out.println("-------------------------------"); + + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + if (endpoint == null || apiKey == null) { + System.out.println("⚠ SPEECH_ENDPOINT or SPEECH_API_KEY not set, skipping example\n"); + return; + } + + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + + // Try to load a non-existent file + String audioFilePath = "non-existent-file.wav"; + + // BEGIN: com.azure.ai.speech.transcription.error.file-io + try { + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(new TranscriptionOptions()); + + client.transcribe(requestContent); + + } catch (IOException e) { + // Handle file I/O errors + System.err.println("✗ File error occurred!"); + System.err.println(" Error: " + e.getMessage()); + System.err.println(" → Verify the audio file path is correct"); + System.err.println(" → Ensure you have read permissions for the file"); + System.err.println(" → Check that the file exists\n"); + } catch (Exception e) { + System.err.println("✗ Unexpected error: " + e.getMessage() + "\n"); + } + // END: com.azure.ai.speech.transcription.error.file-io + } + + /** + * Demonstrates handling service-side errors. + */ + private static void demonstrateServiceErrorHandling() { + System.out.println("Example 3: Service Error Handling"); + System.out.println("----------------------------------"); + + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + if (endpoint == null || apiKey == null) { + System.out.println("⚠ SPEECH_ENDPOINT or SPEECH_API_KEY not set, skipping example\n"); + return; + } + + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + + try { + // Create invalid audio data to trigger service error + byte[] invalidAudio = new byte[10]; // Too small to be valid audio + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(invalidAudio)) + .setFilename("invalid.wav"); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(new TranscriptionOptions()); + + client.transcribe(requestContent); + + // BEGIN: com.azure.ai.speech.transcription.error.service-errors + } catch (HttpResponseException e) { + // Handle HTTP response errors from the service + System.err.println("✗ Service error occurred!"); + System.err.println(" Status code: " + e.getResponse().getStatusCode()); + System.err.println(" Error: " + e.getMessage()); + + HttpResponse response = e.getResponse(); + int statusCode = response.getStatusCode(); + + if (statusCode == 400) { + System.err.println(" → Bad Request: Check your audio format and request parameters"); + } else if (statusCode == 401) { + System.err.println(" → Unauthorized: Verify your API key"); + } else if (statusCode == 403) { + System.err.println(" → Forbidden: Check your subscription permissions"); + } else if (statusCode == 429) { + System.err.println(" → Rate Limited: Too many requests, please retry later"); + } else if (statusCode >= 500) { + System.err.println(" → Server Error: The service is experiencing issues, please retry"); + } + System.err.println(); + // END: com.azure.ai.speech.transcription.error.service-errors + } catch (Exception e) { + System.err.println("✗ Unexpected error: " + e.getMessage() + "\n"); + } + } + + /** + * Demonstrates comprehensive error handling with all best practices. + */ + private static void demonstrateComprehensiveErrorHandling() { + System.out.println("Example 4: Comprehensive Error Handling"); + System.out.println("----------------------------------------"); + + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + if (endpoint == null || apiKey == null) { + System.err.println("✗ Configuration error: Environment variables not set"); + System.err.println(" → Please set SPEECH_ENDPOINT and SPEECH_API_KEY"); + System.err.println(); + return; + } + + TranscriptionClient client = null; + + try { + // Step 1: Create client + client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + System.out.println("✓ Client created successfully"); + + // Step 2: Read audio file with validation + String audioFilePath = "sample-audio.wav"; + + if (!Files.exists(Paths.get(audioFilePath))) { + throw new IllegalArgumentException("Audio file not found: " + audioFilePath); + } + + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + System.out.println("✓ Audio file loaded (" + audioData.length + " bytes)"); + + // Step 3: Validate audio size + final int maxFileSize = 250 * 1024 * 1024; // 250 MB + if (audioData.length > maxFileSize) { + throw new IllegalArgumentException( + "Audio file too large: " + audioData.length + " bytes (max: " + maxFileSize + ")"); + } + System.out.println("✓ Audio size validated"); + + // Step 4: Prepare transcription request + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + TranscriptionOptions options = new TranscriptionOptions(); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + System.out.println("✓ Request prepared"); + + // BEGIN: com.azure.ai.speech.transcription.error.retry-logic + // Step 5: Transcribe with retry logic + int maxRetries = 3; + int retryCount = 0; + TranscriptionResult result = null; + + while (retryCount < maxRetries) { + try { + System.out.println(" Attempting transcription (attempt " + (retryCount + 1) + "/" + maxRetries + ")..."); + result = client.transcribe(requestContent); + break; // Success, exit retry loop + } catch (HttpResponseException e) { + if (e.getResponse().getStatusCode() == 429 || e.getResponse().getStatusCode() >= 500) { + // Retryable error + retryCount++; + if (retryCount < maxRetries) { + long backoffMs = (long) (1000 * Math.pow(2, retryCount - 1)); // Exponential backoff + System.out.println(" → Retryable error, waiting " + backoffMs + "ms before retry..."); + Thread.sleep(backoffMs); + } else { + throw e; // Max retries reached + } + } else { + throw e; // Non-retryable error + } + } + } + // END: com.azure.ai.speech.transcription.error.retry-logic + + // Step 6: Process results + if (result != null) { + System.out.println("\n✓ Transcription completed successfully!"); + System.out.println(" Duration: " + result.getDurationMilliseconds() + " ms"); + if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { + System.out.println(" Phrases: " + result.getCombinedPhrases().size()); + } + } + + } catch (IllegalArgumentException e) { + System.err.println("\n✗ Validation error: " + e.getMessage()); + } catch (ClientAuthenticationException e) { + System.err.println("\n✗ Authentication error: " + e.getMessage()); + System.err.println(" → Check your API key and endpoint"); + } catch (HttpResponseException e) { + System.err.println("\n✗ Service error: " + e.getMessage()); + System.err.println(" → Status code: " + e.getResponse().getStatusCode()); + } catch (IOException e) { + System.err.println("\n✗ File I/O error: " + e.getMessage()); + } catch (InterruptedException e) { + System.err.println("\n✗ Interrupted during retry: " + e.getMessage()); + Thread.currentThread().interrupt(); + } catch (Exception e) { + System.err.println("\n✗ Unexpected error: " + e.getMessage()); + e.printStackTrace(); + } + + System.out.println(); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md new file mode 100644 index 000000000000..306cc5160299 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md @@ -0,0 +1,186 @@ +# Azure AI Speech Transcription Samples + +This directory contains runnable code samples that demonstrate how to use the Azure AI Speech Transcription client library for Java. + +## Prerequisites + +To run these samples, you need: + +1. **Azure Subscription**: An active Azure subscription +2. **Azure AI Speech Service Resource**: Create one in the [Azure Portal](https://portal.azure.com) +3. **Authentication**: Choose one of the following authentication methods: + + ### Option 1: API Key Authentication (Easier for Getting Started) + + Set these environment variables: + + ```bash + set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/ + set SPEECH_API_KEY=your-api-key + ``` + + ### Option 2: Azure AD Authentication (Recommended for Production) + + Set the endpoint and configure Azure AD credentials: + + ```bash + set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/ + ``` + + **And** configure one of the following credential sources: + - **Managed Identity**: For apps running in Azure (App Service, Azure Functions, VMs, etc.) + - **Azure CLI**: Run `az login` on your development machine + - **Environment Variables**: Set `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, and `AZURE_CLIENT_SECRET` + - **Visual Studio Code or IntelliJ**: Sign in through your IDE + + **Note**: You'll also need to assign the "Cognitive Services User" role to your identity: + + ```bash + az role assignment create --assignee \ + --role "Cognitive Services User" \ + --scope /subscriptions//resourceGroups//providers/Microsoft.CognitiveServices/accounts/ + ``` + + **Required dependency** for Azure AD authentication: + + ```xml + + com.azure + azure-identity + 1.13.0 + + ``` + +4. **Audio File**: Some samples require an audio file named `sample-audio.wav` in the working directory + +## Authentication Methods + +All samples in this directory support **both authentication methods**: + +- **API Key (KeyCredential)**: Uses the `SPEECH_API_KEY` environment variable +- **Azure AD (TokenCredential)**: Uses `DefaultAzureCredential` from azure-identity + +The samples will automatically detect which authentication method to use based on the environment variables you've set. If `SPEECH_API_KEY` is set, it will use API Key authentication; otherwise, it will attempt Azure AD authentication. + +## Available Samples + +### BasicTranscriptionSample.java + +**Champion scenario**: Simple audio transcription + +Demonstrates the most common use case - transcribing a single audio file with minimal configuration. + +**Key features**: + +- Creating a TranscriptionClient with API Key or Azure AD authentication +- Reading an audio file +- Transcribing with default options +- Processing results + +**Run**: + +```bash +cd sdk/cognitiveservices/azure-ai-speech-transcription +mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.BasicTranscriptionSample" +``` + +--- + +### AdvancedTranscriptionSample.java + +**Champion scenario**: Complex transcription with custom configuration + +Shows how to use advanced features for production scenarios. + +**Key features**: + +- Custom client configuration (logging, retry policies) +- Both API Key and Azure AD authentication examples +- Advanced transcription options (locale, profanity filtering) +- Speaker diarization (identifying different speakers) +- Detailed result processing with word-level timings + +**Run**: + +```bash +mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.AdvancedTranscriptionSample" +``` + +--- + +### AsyncTranscriptionSample.java + +**Champion scenario**: Asynchronous transcription with reactive programming + +Demonstrates non-blocking operations using TranscriptionAsyncClient and Project Reactor. + +**Key features**: + +- Creating a TranscriptionAsyncClient with both authentication methods +- Using reactive patterns (subscribe, block, timeout) +- Error handling in async operations +- Different async patterns for various use cases + +**Run**: + +```bash +mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.AsyncTranscriptionSample" +``` + +--- + +### ErrorHandlingSample.java + +**Champion scenario**: Robust error handling + +Shows how to properly handle errors and exceptions in production code. + +**Key features**: + +- API Key authentication error handling +- Azure AD authentication error handling (token expiration, missing credentials) +- File I/O error handling +- Service error handling (rate limiting, server errors) +- Retry logic with exponential backoff +- Comprehensive error handling pattern + +**Run**: + +```bash +mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.ErrorHandlingSample" +``` + +--- + +### ReadmeSamples.java + +Code snippets used in the main README.md and API documentation (JavaDoc). + +**Note**: This file is used by the `codesnippet-maven-plugin` to inject code into documentation. It's not meant to be run directly. + +## Supported Audio Formats + +The service supports various audio formats: + +- **WAV** (recommended: 16 kHz, 16-bit, mono PCM) +- **MP3** +- **OGG** +- **FLAC** +- And more + +**Constraints**: + +- Maximum file size: 250 MB +- Maximum duration: 2 hours + +## Getting Help + +- [Azure AI Speech Documentation](https://learn.microsoft.com/azure/ai-services/speech-service/) +- [SDK README](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/cognitiveservices/azure-ai-speech-transcription) +- [GitHub Issues](https://github.com/Azure/azure-sdk-for-java/issues) + +## Additional Resources + +- [Azure SDK for Java Guidelines](https://azure.github.io/azure-sdk/java_introduction.html) +- [Project Reactor Documentation](https://projectreactor.io/docs) +- [Azure SDK Blog](https://devblogs.microsoft.com/azure-sdk/) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java new file mode 100644 index 000000000000..d8e9da38380a --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java @@ -0,0 +1,352 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.EnhancedModeProperties; +import com.azure.ai.speech.transcription.models.ProfanityFilterMode; +import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; +import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.http.policy.ExponentialBackoffOptions; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.http.policy.RetryOptions; +import com.azure.core.util.BinaryData; + +import java.nio.file.Files; +import java.nio.file.Paths; + +public final class ReadmeSamples { + /** + * Sample for basic audio transcription. + */ + public void readmeSamples() { + // BEGIN: com.azure.ai.speech.transcription.readme + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + + try { + // Read audio file + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + + // Create audio file details + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + + // Create transcription options + TranscriptionOptions options = new TranscriptionOptions(); + + // Create transcribe request content + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + // Transcribe audio + TranscriptionResult result = client.transcribe(requestContent); + + // Process results + System.out.println("Duration: " + result.getDurationMilliseconds() + "ms"); + result.getCombinedPhrases().forEach(phrase -> { + System.out.println("Channel " + phrase.getChannel() + ": " + phrase.getText()); + }); + } catch (Exception e) { + System.err.println("Error during transcription: " + e.getMessage()); + } + // END: com.azure.ai.speech.transcription.readme + } + + /** + * Sample for creating a synchronous TranscriptionClient. + */ + public void createSyncClient() { + // BEGIN: com.azure.ai.speech.transcription.transcriptionclient.instantiation + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + // END: com.azure.ai.speech.transcription.transcriptionclient.instantiation + } + + /** + * Sample for creating an asynchronous TranscriptionAsyncClient. + */ + public void createAsyncClient() { + // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.instantiation + TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildAsyncClient(); + // END: com.azure.ai.speech.transcription.transcriptionasyncclient.instantiation + } + + /** + * Sample for transcribing audio with the synchronous client. + */ + public void transcribeAudioSync() throws Exception { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionclient.transcribe + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + + TranscriptionOptions options = new TranscriptionOptions(); + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + TranscriptionResult result = client.transcribe(requestContent); + + System.out.println("Duration: " + result.getDurationMilliseconds() + "ms"); + result.getCombinedPhrases().forEach(phrase -> { + System.out.println("Transcription: " + phrase.getText()); + }); + // END: com.azure.ai.speech.transcription.transcriptionclient.transcribe + } + + /** + * Sample for transcribing audio with the asynchronous client. + */ + public void transcribeAudioAsync() throws Exception { + TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildAsyncClient(); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + + TranscriptionOptions options = new TranscriptionOptions(); + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + asyncClient.transcribe(requestContent) + .subscribe(result -> { + System.out.println("Duration: " + result.getDurationMilliseconds() + "ms"); + result.getCombinedPhrases().forEach(phrase -> { + System.out.println("Transcription: " + phrase.getText()); + }); + }); + // END: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe + } + + /** + * Sample for configuring advanced transcription options. + */ + public void advancedTranscriptionOptions() throws Exception { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionoptions.advanced + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + + // Configure advanced options + TranscriptionOptions options = new TranscriptionOptions() + .setLocales(java.util.Arrays.asList("en-US", "es-ES")) // Specify candidate locales + .setProfanityFilterMode(ProfanityFilterMode.MASKED) // Mask profanity + .setDiarizationOptions(new TranscriptionDiarizationOptions() // Enable speaker diarization + .setEnabled(true) + .setMaxSpeakers(5)); + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + TranscriptionResult result = client.transcribe(requestContent); + + // Access detailed results + result.getPhrases().forEach(phrase -> { + System.out.println("Speaker " + phrase.getSpeaker() + ": " + phrase.getText()); + System.out.println("Confidence: " + phrase.getConfidence()); + System.out.println("Offset: " + phrase.getOffsetMilliseconds() + "ms"); + }); + // END: com.azure.ai.speech.transcription.transcriptionoptions.advanced + } + + /** + * Sample for building client with custom configuration. + */ + public void clientWithCustomConfiguration() { + // BEGIN: com.azure.ai.speech.transcription.transcriptionclientbuilder.configuration + HttpLogOptions logOptions = new HttpLogOptions() + .setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS); + + RetryOptions retryOptions = new RetryOptions(new ExponentialBackoffOptions() + .setMaxRetries(5) + .setBaseDelay(java.time.Duration.ofSeconds(1)) + .setMaxDelay(java.time.Duration.ofSeconds(60))); + + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .httpLogOptions(logOptions) + .retryOptions(retryOptions) + .buildClient(); + // END: com.azure.ai.speech.transcription.transcriptionclientbuilder.configuration + } + + /** + * Sample for processing detailed transcription results. + */ + public void processDetailedResults() throws Exception { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(new TranscriptionOptions()); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionresult.detailed + TranscriptionResult result = client.transcribe(requestContent); + + // Get overall duration + System.out.println("Total duration: " + result.getDurationMilliseconds() + "ms"); + + // Process each phrase with detailed information + result.getPhrases().forEach(phrase -> { + System.out.println("\nPhrase: " + phrase.getText()); + System.out.println(" Channel: " + phrase.getChannel()); + System.out.println(" Speaker: " + phrase.getSpeaker()); + System.out.println(" Locale: " + phrase.getLocale()); + System.out.println(" Confidence: " + phrase.getConfidence()); + System.out.println(" Timing: " + phrase.getOffsetMilliseconds() + "ms - " + + (phrase.getOffsetMilliseconds() + phrase.getDurationMilliseconds()) + "ms"); + + // Process individual words with timestamps + if (phrase.getWords() != null) { + phrase.getWords().forEach(word -> { + System.out.println(" Word: " + word.getText() + " @ " + + word.getOffsetMilliseconds() + "ms"); + }); + } + }); + // END: com.azure.ai.speech.transcription.transcriptionresult.detailed + } + + /** + * Sample for using enhanced mode to improve transcription quality. + */ + public void enhancedModeBasic() throws Exception { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + + // BEGIN: readme-sample-enhancedModeBasic + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + + // Enable enhanced mode for improved transcription quality + EnhancedModeProperties enhancedMode = new EnhancedModeProperties() + .setEnabled(true); + + TranscriptionOptions options = new TranscriptionOptions() + .setLocales(java.util.Arrays.asList("en-US")) + .setEnhancedMode(enhancedMode); + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + TranscriptionResult result = client.transcribe(requestContent); + // END: readme-sample-enhancedModeBasic + } + + /** + * Sample for using enhanced mode with custom prompts. + */ + public void enhancedModeWithPrompts() throws Exception { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + + // BEGIN: readme-sample-enhancedModeWithPrompts + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + + // Use prompts to guide transcription with domain-specific terminology + EnhancedModeProperties enhancedMode = new EnhancedModeProperties() + .setEnabled(true) + .setPrompt(java.util.Arrays.asList( + "Medical consultation discussing hypertension and diabetes", + "Common medications: metformin, lisinopril, atorvastatin", + "Patient symptoms and treatment plan" + )); + + TranscriptionOptions options = new TranscriptionOptions() + .setLocales(java.util.Arrays.asList("en-US")) + .setEnhancedMode(enhancedMode); + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + TranscriptionResult result = client.transcribe(requestContent); + // END: readme-sample-enhancedModeWithPrompts + } + + /** + * Sample for using enhanced mode with translation. + */ + public void enhancedModeWithTranslation() throws Exception { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + + // BEGIN: readme-sample-enhancedModeWithTranslation + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + + // Configure enhanced mode to transcribe Spanish audio and translate to English + EnhancedModeProperties enhancedMode = new EnhancedModeProperties() + .setEnabled(true) + .setTargetLanguage("en-US"); // Translate to English + + TranscriptionOptions options = new TranscriptionOptions() + .setLocales(java.util.Arrays.asList("es-ES")) // Source language: Spanish + .setEnhancedMode(enhancedMode); + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + TranscriptionResult result = client.transcribe(requestContent); + // END: readme-sample-enhancedModeWithTranslation + } +} + diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java new file mode 100644 index 000000000000..c13a8d5625f5 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java @@ -0,0 +1,238 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Source code snippets from this file are embedded in Transcription SDK JavaDoc (API documentation). + +package com.azure.ai.speech.transcription.javadoccodesnippets; + +import com.azure.ai.speech.transcription.TranscriptionAsyncClient; +import com.azure.ai.speech.transcription.TranscriptionClientBuilder; +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.ProfanityFilterMode; +import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.util.BinaryData; +import reactor.core.publisher.Mono; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.Duration; +import java.util.Arrays; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +/** + * Code snippets for {@link TranscriptionAsyncClient} JavaDoc documentation. + */ +public class TranscriptionAsyncClientJavaDocCodeSnippets { + + private static String endpoint = System.getenv("SPEECH_ENDPOINT"); + private static String key = System.getenv("SPEECH_API_KEY"); + + /** + * Sample for creating an asynchronous TranscriptionAsyncClient with API key authentication. + */ + public void createAsyncClientWithApiKey() { + // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.instantiation.apikey + TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(key)) + .buildAsyncClient(); + // END: com.azure.ai.speech.transcription.transcriptionasyncclient.instantiation.apikey + } + + /** + * Sample for transcribing audio asynchronously using subscribe pattern. + */ + public void transcribeAsyncWithSubscribe() throws Exception { + TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(key)) + .buildAsyncClient(); + + byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("sample.wav"); + TranscriptionOptions options = new TranscriptionOptions(); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.subscribe + CountDownLatch latch = new CountDownLatch(1); + + asyncClient.transcribe(requestContent) + .subscribe( + // onNext: Process result + result -> { + System.out.println("Duration: " + result.getDurationMilliseconds() + " ms"); + if (result.getCombinedPhrases() != null) { + result.getCombinedPhrases().forEach(phrase -> + System.out.println("Text: " + phrase.getText()) + ); + } + latch.countDown(); + }, + // onError: Handle error + error -> { + System.err.println("Error: " + error.getMessage()); + latch.countDown(); + }, + // onComplete: Completion handler + () -> System.out.println("Transcription completed") + ); + + latch.await(60, TimeUnit.SECONDS); + // END: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.subscribe + } + + /** + * Sample for transcribing audio asynchronously using block pattern. + */ + public void transcribeAsyncWithBlock() throws Exception { + TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(key)) + .buildAsyncClient(); + + byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("sample.wav"); + TranscriptionOptions options = new TranscriptionOptions(); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.block + // Use block() to convert async call to sync + TranscriptionResult result = asyncClient.transcribe(requestContent).block(); + + if (result != null) { + System.out.println("Duration: " + result.getDurationMilliseconds() + " ms"); + } + // END: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.block + } + + /** + * Sample for transcribing audio asynchronously with advanced options. + */ + public void transcribeAsyncWithOptions() throws Exception { + TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(key)) + .buildAsyncClient(); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.options + byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); + + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("sample.wav"); + + // Configure advanced transcription options + TranscriptionOptions options = new TranscriptionOptions() + .setLocales(Arrays.asList("en-US", "es-ES")) + .setProfanityFilterMode(ProfanityFilterMode.MASKED) + .setDiarizationOptions(new TranscriptionDiarizationOptions() + .setEnabled(true) + .setMaxSpeakers(5)); + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + // Transcribe asynchronously + Mono resultMono = asyncClient.transcribe(requestContent); + + // Process result + resultMono.subscribe(result -> { + if (result.getPhrases() != null) { + result.getPhrases().forEach(phrase -> { + System.out.printf("Speaker %d: %s%n", + phrase.getSpeaker(), phrase.getText()); + }); + } + }); + // END: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.options + } + + /** + * Sample for transcribing audio asynchronously with timeout and error handling. + */ + public void transcribeAsyncWithTimeoutAndErrorHandling() throws Exception { + TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(key)) + .buildAsyncClient(); + + byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("sample.wav"); + TranscriptionOptions options = new TranscriptionOptions(); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.timeout + Mono resultMono = asyncClient.transcribe(requestContent) + .timeout(Duration.ofMinutes(2)) + .doOnError(error -> System.err.println("Error: " + error.getMessage())) + .onErrorResume(error -> { + System.err.println("Fallback: Returning empty result"); + return Mono.empty(); + }); + + TranscriptionResult result = resultMono.block(); + // END: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.timeout + } + + /** + * Sample for processing detailed async transcription results. + */ + public void processDetailedAsyncResults() throws Exception { + TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(key)) + .buildAsyncClient(); + + byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); + TranscriptionOptions options = new TranscriptionOptions(); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.results.detailed + asyncClient.transcribe(requestContent) + .subscribe(result -> { + // Access combined phrases + if (result.getCombinedPhrases() != null) { + result.getCombinedPhrases().forEach(channelPhrase -> + System.out.printf("[Channel %d] %s%n", + channelPhrase.getChannel(), channelPhrase.getText()) + ); + } + + // Access detailed phrases with word-level timing + if (result.getPhrases() != null) { + result.getPhrases().forEach(phrase -> { + System.out.printf("Phrase (%.2f-%.2fs): %s%n", + phrase.getOffsetMilliseconds() / 1000.0, + (phrase.getOffsetMilliseconds() + phrase.getDurationMilliseconds()) / 1000.0, + phrase.getText()); + + if (phrase.getWords() != null) { + phrase.getWords().forEach(word -> + System.out.printf(" \"%s\" at %.2fs%n", + word.getText(), + word.getOffsetMilliseconds() / 1000.0) + ); + } + }); + } + }); + // END: com.azure.ai.speech.transcription.transcriptionasyncclient.results.detailed + } +} + diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java new file mode 100644 index 000000000000..bc79f1c807fe --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java @@ -0,0 +1,181 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Source code snippets from this file are embedded in Transcription SDK JavaDoc (API documentation). + +package com.azure.ai.speech.transcription.javadoccodesnippets; + +import com.azure.ai.speech.transcription.TranscriptionClient; +import com.azure.ai.speech.transcription.TranscriptionClientBuilder; +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.ProfanityFilterMode; +import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.credential.TokenCredential; +import com.azure.core.util.BinaryData; +import com.azure.identity.DefaultAzureCredentialBuilder; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; + +/** + * Code snippets for {@link TranscriptionClient} JavaDoc documentation. + */ +public class TranscriptionClientJavaDocCodeSnippets { + + private static String endpoint = System.getenv("SPEECH_ENDPOINT"); + private static String key = System.getenv("SPEECH_API_KEY"); + + /** + * Sample for creating a synchronous TranscriptionClient with API key authentication. + */ + public void createClientWithApiKey() { + // BEGIN: com.azure.ai.speech.transcription.transcriptionclient.instantiation.apikey + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(key)) + .buildClient(); + // END: com.azure.ai.speech.transcription.transcriptionclient.instantiation.apikey + } + + /** + * Sample for creating a synchronous TranscriptionClient with Azure AD authentication. + */ + public void createClientWithTokenCredential() { + // BEGIN: com.azure.ai.speech.transcription.transcriptionclient.instantiation.tokencredential + // Use DefaultAzureCredential for Azure AD authentication + TokenCredential credential = new DefaultAzureCredentialBuilder().build(); + + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(credential) + .buildClient(); + // END: com.azure.ai.speech.transcription.transcriptionclient.instantiation.tokencredential + } + + /** + * Sample for transcribing audio from a file with default options. + */ + public void transcribeFromFile() throws Exception { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(key)) + .buildClient(); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionclient.transcribe.file + // Read audio file + byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); + + // Create audio file details + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("sample.wav"); + + // Create transcription options with default settings + TranscriptionOptions options = new TranscriptionOptions(); + + // Create transcribe request + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + // Transcribe audio + TranscriptionResult result = client.transcribe(requestContent); + + // Process results + System.out.println("Duration: " + result.getDurationMilliseconds() + " ms"); + result.getCombinedPhrases().forEach(phrase -> { + System.out.println("Channel " + phrase.getChannel() + ": " + phrase.getText()); + }); + // END: com.azure.ai.speech.transcription.transcriptionclient.transcribe.file + } + + /** + * Sample for transcribing audio with advanced options. + */ + public void transcribeWithOptions() throws Exception { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(key)) + .buildClient(); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionclient.transcribe.options + byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); + + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("sample.wav"); + + // Configure advanced transcription options + TranscriptionOptions options = new TranscriptionOptions() + .setLocales(Arrays.asList("en-US", "es-ES")) + .setProfanityFilterMode(ProfanityFilterMode.MASKED) + .setDiarizationOptions(new TranscriptionDiarizationOptions() + .setEnabled(true) + .setMaxSpeakers(5)); + + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + + TranscriptionResult result = client.transcribe(requestContent); + + // Access detailed results + if (result.getPhrases() != null) { + result.getPhrases().forEach(phrase -> { + System.out.printf("Speaker %d: %s%n", + phrase.getSpeaker(), phrase.getText()); + }); + } + // END: com.azure.ai.speech.transcription.transcriptionclient.transcribe.options + } + + /** + * Sample for processing detailed transcription results with word-level timing. + */ + public void processDetailedResults() throws Exception { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(key)) + .buildClient(); + + byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); + TranscriptionOptions options = new TranscriptionOptions(); + TranscribeRequestContent requestContent = new TranscribeRequestContent() + .setAudio(audioFileDetails) + .setOptions(options); + TranscriptionResult result = client.transcribe(requestContent); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionclient.results.detailed + // Access sentence-level combined phrases + if (result.getCombinedPhrases() != null) { + result.getCombinedPhrases().forEach(channelPhrase -> { + System.out.printf("[Channel %d] %s%n", + channelPhrase.getChannel(), channelPhrase.getText()); + }); + } + + // Access word-level details with timing + if (result.getPhrases() != null) { + result.getPhrases().forEach(phrase -> { + System.out.printf("Phrase (%.2f-%.2fs): %s%n", + phrase.getOffsetMilliseconds() / 1000.0, + (phrase.getOffsetMilliseconds() + phrase.getDurationMilliseconds()) / 1000.0, + phrase.getText()); + + // Get word-level timing information + if (phrase.getWords() != null) { + phrase.getWords().forEach(word -> { + System.out.printf(" Word: \"%s\" at %.2fs%n", + word.getText(), + word.getOffsetMilliseconds() / 1000.0); + }); + } + }); + } + // END: com.azure.ai.speech.transcription.transcriptionclient.results.detailed + } +} + diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md new file mode 100644 index 000000000000..cbdc20d4635b --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md @@ -0,0 +1,172 @@ +# Azure AI Speech Transcription client library tests for Java + +This directory contains tests for the Azure AI Speech Transcription client library for Java. + +## Test Structure + +The tests are organized as follows: + +- **TranscriptionClientTestBase.java**: Base class containing common test infrastructure, helper methods, and validation logic +- **TranscriptionClientTest.java**: Tests for the synchronous `TranscriptionClient` +- **TranscriptionAsyncClientTest.java**: Tests for the asynchronous `TranscriptionAsyncClient` +- **generated/**: Auto-generated test templates (for reference only) + +## Prerequisites + +Before running the tests, you need: + +1. An Azure Cognitive Services Speech resource. Create one using the [Azure Portal](https://portal.azure.com/). +2. Java Development Kit (JDK) 8 or later +3. Maven 3.x or later +4. A sample audio file for testing (WAV, MP3, or OGG format, shorter than 2 hours, smaller than 250 MB) + +## Set Environment Variables + +Set the following environment variables to run live tests: + +### Windows (PowerShell) + +```powershell +$env:SPEECH_ENDPOINT = "https://.cognitiveservices.azure.com" +$env:SPEECH_API_KEY = "" +``` + +### Windows (Command Prompt) + +```cmd +set SPEECH_ENDPOINT=https://.cognitiveservices.azure.com +set SPEECH_API_KEY= +``` + +### Linux/macOS (Bash) + +```bash +export SPEECH_ENDPOINT="https://.cognitiveservices.azure.com" +export SPEECH_API_KEY="" +``` + +## Configure Test Proxy + +The Azure SDK for Java uses a test proxy for recording and playing back HTTP interactions. Configure the test mode by setting the `AZURE_TEST_MODE` environment variable: + +### Live Mode (against live service) + +```powershell +$env:AZURE_TEST_MODE = "LIVE" +``` + +This mode makes real HTTP calls to the Azure service. Use this when you want to test against the actual service. + +### Record Mode (record interactions) + +```powershell +$env:AZURE_TEST_MODE = "RECORD" +``` + +This mode makes real HTTP calls and records them for later playback. Recorded sessions are saved in the `session-records` directory. + +### Playback Mode (use recordings) + +```powershell +$env:AZURE_TEST_MODE = "PLAYBACK" +``` + +This mode uses previously recorded HTTP interactions instead of making real calls. This is the default mode and doesn't require credentials. + +## Running Tests + +### Run All Tests + +From the `sdk/cognitiveservices/azure-ai-speech-transcription` directory: + +```bash +mvn clean test +``` + +### Run Specific Test Class + +```bash +mvn test -Dtest=TranscriptionClientTest +``` + +or + +```bash +mvn test -Dtest=TranscriptionAsyncClientTest +``` + +### Run a Specific Test Method + +```bash +mvn test -Dtest=TranscriptionClientTest#testTranscribeSyncBasicFromFile +``` + +## Test Organization + +### Synchronous Tests (TranscriptionClientTest) + +Tests for the synchronous `TranscriptionClient`, including: + +- Basic transcription from file +- Transcription with language specification +- Transcription with multiple languages +- Transcription with speaker diarization +- Transcription with profanity filtering +- Transcription with word-level timestamps +- Tests using `transcribeWithResponse()` method +- Tests with custom RequestOptions + +### Asynchronous Tests (TranscriptionAsyncClientTest) + +Tests for the asynchronous `TranscriptionAsyncClient`, mirroring the synchronous tests but using reactive programming patterns with `Mono` and `Flux`. + +## Authentication + +The tests support two authentication methods: + +1. **Key-based authentication** (default): Uses the API key from `SPEECH_API_KEY` environment variable +2. **Token-based authentication**: Uses Azure Active Directory credentials via `DefaultAzureCredential` + +To test with token-based authentication, some tests use `createClient(false, true, sync)` where the first parameter is `false`. + +## Troubleshooting + +### Common Issues + +1. **Missing environment variables**: Ensure `SPEECH_ENDPOINT` and `SPEECH_API_KEY` are set correctly +2. **Missing sample audio file**: Make sure you have a `sample.wav` file in the test directory (WAV, MP3, or OGG format, shorter than 2 hours, smaller than 250 MB) +3. **Test proxy issues**: If playback tests fail, try running in LIVE or RECORD mode first +4. **Network issues**: Check your network connection and firewall settings + +### Enable Detailed Logging + +To enable detailed HTTP logging during tests, set the logging level in your `logback-test.xml` or via environment variables: + +```powershell +$env:AZURE_LOG_LEVEL = "verbose" +``` + +## Additional Resources + +- [Azure SDK for Java Test Documentation](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/core/azure-core-test/README.md) +- [TypeSpec Java QuickStart - Adding Tests](https://github.com/Azure/azure-sdk-for-java/wiki/TypeSpec-Java-QuickStart#adding-tests) +- [Azure Speech Service Documentation](https://learn.microsoft.com/azure/cognitive-services/speech-service/) +- [Azure SDK for Java Contributing Guide](https://github.com/Azure/azure-sdk-for-java/blob/main/CONTRIBUTING.md) + +## Test Coverage + +The current tests cover: + +- ✅ Client instantiation with different authentication methods +- ✅ Basic transcription functionality +- ✅ Transcription with various options (language, diarization, profanity filter, timestamps) +- ✅ Both synchronous and asynchronous clients +- ✅ Methods with and without `Response` wrappers +- ✅ Custom RequestOptions and headers + +Areas for future enhancement: + +- ⬜ Error handling scenarios (invalid input, network errors, etc.) +- ⬜ Performance tests +- ⬜ Concurrent request handling +- ⬜ Edge cases (very long audio, multiple channels, etc.) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java new file mode 100644 index 000000000000..ddebad1d4089 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java @@ -0,0 +1,280 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.models.ProfanityFilterMode; +import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.core.http.HttpHeaderName; +import com.azure.core.http.rest.RequestOptions; +import org.junit.jupiter.api.Test; +import reactor.test.StepVerifier; + +import java.time.Duration; +import java.util.Arrays; + +/** + * Tests for TranscriptionAsyncClient (asynchronous client). + */ +class TranscriptionAsyncClientTest extends TranscriptionClientTestBase { + + private final Boolean sync = false; // All tests in this file use the async client + + /*********************************************************************************** + * + * HAPPY PATH TESTS + * + ***********************************************************************************/ + + @Test + public void testTranscribeAsyncBasicFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions(); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeAsyncWithLanguageFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US")); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeAsyncWithMultipleLanguagesFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US", "es-ES", "fr-FR")); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeAsyncWithDiarizationFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionDiarizationOptions diarizationOptions + = new TranscriptionDiarizationOptions().setEnabled(true).setMaxSpeakers(5); + + TranscriptionOptions options = new TranscriptionOptions().setDiarizationOptions(diarizationOptions); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeAsyncWithProfanityFilterFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setProfanityFilterMode(ProfanityFilterMode.MASKED); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeAsyncWithChannelsFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setActiveChannels(Arrays.asList(0)); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeAsyncAllOptionsFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionDiarizationOptions diarizationOptions + = new TranscriptionDiarizationOptions().setEnabled(true).setMaxSpeakers(5); + + TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US")) + .setDiarizationOptions(diarizationOptions) + .setProfanityFilterMode(ProfanityFilterMode.MASKED) + .setActiveChannels(Arrays.asList(0)); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeAsyncBasicFromFileWithResponse() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions(); + RequestOptions requestOptions + = new RequestOptions().addHeader(HttpHeaderName.fromString("x-custom-header"), "custom-value"); + + doTranscription(methodName, sync, true, audioFile, options, requestOptions); + } + + @Test + public void testTranscribeAsyncWithAllOptionsFromFileWithResponse() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionDiarizationOptions diarizationOptions + = new TranscriptionDiarizationOptions().setEnabled(true).setMaxSpeakers(5); + + TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US", "es-ES")) + .setDiarizationOptions(diarizationOptions) + .setProfanityFilterMode(ProfanityFilterMode.REMOVED) + .setActiveChannels(Arrays.asList(0, 1)); + + RequestOptions requestOptions + = new RequestOptions().addHeader(HttpHeaderName.fromString("x-custom-header"), "custom-value") + .addQueryParam("test-param", "test-value"); + + doTranscription(methodName, sync, true, audioFile, options, requestOptions); + } + + @Test + public void testTranscribeAsyncWithAudioUrl() { + // Test with audio URL option + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US")) + .setAudioUrl("https://example.com/sample.wav"); + + // Note: This test is commented out because it requires: + // 1. A valid, publicly accessible URL in live/record mode + // 2. Proper recording of the service response + // 3. The audio file at the URL must be in a supported format + // To enable this test: + // - Provide a valid audio URL + // - Uncomment the line below + // - Run in RECORD mode to capture the interaction + // doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeAsyncWithProfanityModeMasked() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setProfanityFilterMode(ProfanityFilterMode.MASKED); + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeAsyncWithProfanityModeRemoved() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setProfanityFilterMode(ProfanityFilterMode.REMOVED); + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeAsyncWithProfanityModeTags() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setProfanityFilterMode(ProfanityFilterMode.TAGS); + doTranscription(methodName, sync, false, audioFile, options, null); + } + + /*********************************************************************************** + * + * ERROR HANDLING TESTS + * + ***********************************************************************************/ + + // Note: This test now passes due to temporary workaround in generated code. + // The null check was manually added to TranscriptionAsyncClient.transcribe() + // and should be removed when the TypeSpec generator is fixed to include parameter validation. + @Test + public void testTranscribeAsyncWithNullRequestContent() { + createClient(true, true, sync); + + // Test that null request content results in error + // Using StepVerifier to verify error behavior in async context + StepVerifier.create(getAsyncClient().transcribe(null)) + .expectError(NullPointerException.class) + .verify(Duration.ofSeconds(5)); + } + + @Test + public void testTranscribeAsyncWithEmptyAudioData() { + createClient(true, true, sync); + + // Test with empty audio data - this should result in a service error + // Note: Depending on service behavior, this may throw HttpResponseException + // The exact behavior should be validated based on actual service responses + // Example implementation: + // StepVerifier.create(getAsyncClient().transcribe(emptyRequestContent)) + // .expectError(HttpResponseException.class) + // .verify(Duration.ofSeconds(30)); + } + + @Test + public void testTranscribeAsyncWithInvalidLanguageCode() { + createClient(true, true, sync); + + // Test with invalid language code + TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("invalid-locale")); + + // Note: This test requires actual service call to verify behavior + // In PLAYBACK mode, this would replay the recorded error response + // Example implementation with StepVerifier: + // StepVerifier.create(getAsyncClient().transcribe(requestContentWithInvalidLocale)) + // .expectErrorMatches(throwable -> throwable instanceof HttpResponseException + // && ((HttpResponseException) throwable).getResponse().getStatusCode() == 400) + // .verify(Duration.ofSeconds(30)); + } + + @Test + public void testTranscribeAsyncCancellation() { + createClient(true, true, sync); + + // Test that async operations can be cancelled properly + // This verifies that the reactive streams support cancellation + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions(); + + // Note: Cancellation testing would typically involve subscribing and then cancelling + // Example pattern (commented out as it requires specific test setup): + // Disposable subscription = getAsyncClient().transcribe(requestContent).subscribe(); + // subscription.dispose(); + // Verify that resources are cleaned up appropriately + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java new file mode 100644 index 000000000000..35ee6aa83982 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java @@ -0,0 +1,207 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.models.ProfanityFilterMode; +import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.core.http.HttpHeaderName; +import com.azure.core.http.rest.RequestOptions; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * Tests for TranscriptionClient (synchronous client). + */ +class TranscriptionClientTest extends TranscriptionClientTestBase { + + private final Boolean sync = true; // All tests in this file use the sync client + + /*********************************************************************************** + * + * HAPPY PATH TESTS + * + ***********************************************************************************/ + + @Test + public void testTranscribeSyncBasicFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions(); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeSyncWithLanguageFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US")); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeSyncWithMultipleLanguagesFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US", "es-ES", "fr-FR")); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeSyncWithDiarizationFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionDiarizationOptions diarizationOptions + = new TranscriptionDiarizationOptions().setEnabled(true).setMaxSpeakers(5); + + TranscriptionOptions options = new TranscriptionOptions().setDiarizationOptions(diarizationOptions); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeSyncWithProfanityFilterFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setProfanityFilterMode(ProfanityFilterMode.MASKED); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeSyncWithChannelsFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setActiveChannels(Arrays.asList(0)); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeSyncAllOptionsFromFile() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionDiarizationOptions diarizationOptions + = new TranscriptionDiarizationOptions().setEnabled(true).setMaxSpeakers(5); + + TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US")) + .setDiarizationOptions(diarizationOptions) + .setProfanityFilterMode(ProfanityFilterMode.MASKED) + .setActiveChannels(Arrays.asList(0)); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + @Test + public void testTranscribeSyncBasicFromFileWithResponse() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions(); + RequestOptions requestOptions + = new RequestOptions().addHeader(HttpHeaderName.fromString("x-custom-header"), "custom-value"); + + doTranscription(methodName, sync, true, audioFile, options, requestOptions); + } + + @Test + public void testTranscribeSyncWithAllOptionsFromFileWithResponse() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionDiarizationOptions diarizationOptions + = new TranscriptionDiarizationOptions().setEnabled(true).setMaxSpeakers(5); + + TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US", "es-ES")) + .setDiarizationOptions(diarizationOptions) + .setProfanityFilterMode(ProfanityFilterMode.REMOVED) + .setActiveChannels(Arrays.asList(0, 1)); + + RequestOptions requestOptions + = new RequestOptions().addHeader(HttpHeaderName.fromString("x-custom-header"), "custom-value") + .addQueryParam("test-param", "test-value"); + + doTranscription(methodName, sync, true, audioFile, options, requestOptions); + } + + @Test + public void testTranscribeSyncWithMultipleChannels() { + // Test with multiple channel indices + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + TranscriptionOptions options = new TranscriptionOptions().setActiveChannels(Arrays.asList(0, 1)); + + doTranscription(methodName, sync, false, audioFile, options, null); + } + + /*********************************************************************************** + * + * ERROR HANDLING TESTS + * + ***********************************************************************************/ + + @Test + public void testTranscribeSyncWithNullRequestContent() { + createClient(true, true, sync); + + // Test that null request content throws appropriate exception + assertThrows(NullPointerException.class, () -> { + getClient().transcribe(null); + }, "Transcribe should throw NullPointerException when request content is null"); + } + + @Test + public void testTranscribeSyncWithEmptyAudioData() { + createClient(true, true, sync); + + // Test with empty audio data - this should result in a service error + // Note: Depending on service behavior, this may throw HttpResponseException + // The exact behavior should be validated based on actual service responses + } + + @Test + public void testTranscribeSyncWithInvalidLanguageCode() { + createClient(true, true, sync); + + // Test with invalid language code + TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("invalid-locale")); + + // Note: This test requires actual service call to verify behavior + // In PLAYBACK mode, this would replay the recorded error response + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java new file mode 100644 index 000000000000..d87a7b47dad7 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java @@ -0,0 +1,295 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.credential.TokenCredential; +import com.azure.core.http.HttpRequest; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.http.rest.RequestOptions; +import com.azure.core.http.rest.Response; +import com.azure.core.test.TestMode; +import com.azure.core.test.TestProxyTestBase; +import com.azure.core.util.BinaryData; +import com.azure.core.util.Configuration; +import com.azure.core.util.logging.ClientLogger; +import com.azure.identity.DefaultAzureCredentialBuilder; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Base class for TranscriptionClient tests. Contains helper methods and common test infrastructure. + * Supports both API Key (KeyCredential) and Azure AD (TokenCredential) authentication. + */ +class TranscriptionClientTestBase extends TestProxyTestBase { + private static final ClientLogger LOGGER = new ClientLogger(TranscriptionClientTestBase.class); + + final Boolean printResults = false; // Set to true to print results to console window + + // Sample audio file for testing + final String audioFile = "./src/test/java/com/azure/ai/speech/transcription/sample.wav"; + + // The clients that will be used for tests + private TranscriptionClient client = null; + private TranscriptionAsyncClient asyncClient = null; + + /** + * Sets up the test resources before each test. + */ + @BeforeEach + public void setupTest() { + // Reset clients before each test to ensure clean state + client = null; + asyncClient = null; + } + + /** + * Cleans up test resources after each test. + */ + @AfterEach + public void cleanupTest() { + // Clean up any resources if needed + // Note: The clients don't require explicit cleanup as they are managed by the test framework + } + + /** + * Creates a client for testing. + * + * @param useKeyAuth Whether to use key-based authentication (true) or token-based authentication (false) + * @param useRealKey Whether to use a real key from environment variables (true) or a fake key (false). + * Only applies when useKeyAuth is true. + * @param sync Whether to create a synchronous client (true) or asynchronous client (false) + */ + protected void createClient(Boolean useKeyAuth, Boolean useRealKey, Boolean sync) { + TestMode testMode = getTestMode(); + + // Define endpoint and auth credentials + String endpoint = "https://fake-resource-name.cognitiveservices.azure.com"; + String key = "00000000000000000000000000000000"; + + if (testMode == TestMode.LIVE || testMode == TestMode.RECORD) { + endpoint = Configuration.getGlobalConfiguration().get("SPEECH_ENDPOINT"); + assertTrue(endpoint != null && !endpoint.isEmpty(), "Endpoint URL is required to run live tests."); + + if (useKeyAuth && useRealKey) { + key = Configuration.getGlobalConfiguration().get("SPEECH_API_KEY"); + assertTrue(key != null && !key.isEmpty(), "API key is required to run live tests with KeyCredential."); + } + } + + // Create the client builder + TranscriptionClientBuilder transcriptionClientBuilder = new TranscriptionClientBuilder().endpoint(endpoint) + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS)); + + // Update the client builder with credentials and recording/playback policies + if (getTestMode() == TestMode.LIVE) { + if (useKeyAuth) { + transcriptionClientBuilder.credential(new KeyCredential(key)); + } else { + // Use Azure AD authentication (TokenCredential) + TokenCredential credential = new DefaultAzureCredentialBuilder().build(); + transcriptionClientBuilder.credential(credential); + } + } else if (getTestMode() == TestMode.RECORD) { + transcriptionClientBuilder.addPolicy(interceptorManager.getRecordPolicy()); + if (useKeyAuth) { + transcriptionClientBuilder.credential(new KeyCredential(key)); + } else { + TokenCredential credential = new DefaultAzureCredentialBuilder().build(); + transcriptionClientBuilder.credential(credential); + } + } else if (getTestMode() == TestMode.PLAYBACK) { + transcriptionClientBuilder.httpClient(interceptorManager.getPlaybackClient()); + // In playback mode, use a fake key regardless of authentication method + transcriptionClientBuilder.credential(new KeyCredential(key)); + } + + // Set recording filters + if (!interceptorManager.isLiveMode()) { + // Remove sanitizers that might interfere with transcription-specific headers + interceptorManager.removeSanitizers("AZSDK2003", "AZSDK2030", "AZSDK3430", "AZSDK3493"); + } + + if (sync) { + client = transcriptionClientBuilder.buildClient(); + } else { + asyncClient = transcriptionClientBuilder.buildAsyncClient(); + } + } + + /** + * Performs transcription and validates the result. + * + * @param testName A label that uniquely defines the test. Used in console printout. + * @param sync 'true' to use synchronous client, 'false' to use asynchronous client. + * @param transcribeWithResponse 'true' to use transcribeWithResponse(), 'false' to use transcribe(). + * @param audioFilePath Path to the audio file to transcribe + * @param options TranscriptionOptions (can be null) + * @param requestOptions RequestOptions (can be null) + */ + protected void doTranscription(String testName, Boolean sync, Boolean transcribeWithResponse, String audioFilePath, + TranscriptionOptions options, RequestOptions requestOptions) { + + try { + // Load audio file + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails + = new AudioFileDetails(BinaryData.fromBytes(audioData)).setFilename(new File(audioFilePath).getName()); + + TranscribeRequestContent requestContent + = new TranscribeRequestContent().setAudio(audioFileDetails).setOptions(options); + + if (sync) { + TranscriptionResult result = null; + if (!transcribeWithResponse) { + result = client.transcribe(requestContent); + } else { + // For transcribeWithResponse, we need to manually prepare the multipart request body + if (requestOptions == null) { + requestOptions = new RequestOptions(); + } + BinaryData multipartBody + = new com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper(requestOptions) + .serializeJsonField("definition", requestContent.getOptions()) + .serializeFileField("audio", + requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(), + requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(), + requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename()) + .end() + .getRequestBody(); + + Response response = client.transcribeWithResponse(multipartBody, requestOptions); + printHttpRequestAndResponse(response); + result = response.getValue().toObject(TranscriptionResult.class); + } + validateTranscriptionResult(testName, result); + } else { + TranscriptionResult result = null; + if (!transcribeWithResponse) { + result = asyncClient.transcribe(requestContent).block(); + } else { + // For transcribeWithResponse, we need to manually prepare the multipart request body + if (requestOptions == null) { + requestOptions = new RequestOptions(); + } + BinaryData multipartBody + = new com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper(requestOptions) + .serializeJsonField("definition", requestContent.getOptions()) + .serializeFileField("audio", + requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(), + requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(), + requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename()) + .end() + .getRequestBody(); + + Response response + = asyncClient.transcribeWithResponse(multipartBody, requestOptions).block(); + printHttpRequestAndResponse(response); + result = response.getValue().toObject(TranscriptionResult.class); + } + validateTranscriptionResult(testName, result); + } + } catch (Exception e) { + LOGGER.error("Error in test {}: {}", testName, e.getMessage()); + throw new RuntimeException(e); + } + } + + /** + * Validates the transcription result. + * + * @param testName The name of the test + * @param result The transcription result to validate + */ + protected void validateTranscriptionResult(String testName, TranscriptionResult result) { + if (printResults) { + System.out.println("\n===== Test: " + testName + " ====="); + System.out.println("Duration: " + result.getDurationMilliseconds() + "ms"); + if (result.getCombinedPhrases() != null) { + result.getCombinedPhrases().forEach(phrase -> { + System.out.println("Channel " + phrase.getChannel() + ": " + phrase.getText()); + }); + } + if (result.getPhrases() != null) { + result.getPhrases().forEach(phrase -> { + System.out.println("Phrase: " + phrase.getText() + " (confidence: " + phrase.getConfidence() + ")"); + }); + } + } + + // Basic validation + assertNotNull(result, "Transcription result should not be null"); + assertNotNull(result.getDurationMilliseconds(), "Duration should not be null"); + assertTrue(result.getDurationMilliseconds() > 0, "Duration should be greater than 0"); + assertNotNull(result.getCombinedPhrases(), "Combined phrases should not be null"); + assertFalse(result.getCombinedPhrases().isEmpty(), "Combined phrases should not be empty"); + assertNotNull(result.getPhrases(), "Phrases should not be null"); + assertFalse(result.getPhrases().isEmpty(), "Phrases should not be empty"); + + // Validate combined phrases + result.getCombinedPhrases().forEach(phrase -> { + assertNotNull(phrase.getText(), "Combined phrase text should not be null"); + assertFalse(phrase.getText().isEmpty(), "Combined phrase text should not be empty"); + }); + + // Validate phrases + result.getPhrases().forEach(phrase -> { + assertNotNull(phrase.getText(), "Phrase text should not be null"); + assertFalse(phrase.getText().isEmpty(), "Phrase text should not be empty"); + assertTrue(phrase.getConfidence() >= 0 && phrase.getConfidence() <= 1, + "Confidence should be between 0 and 1"); + assertTrue(phrase.getOffsetMilliseconds() >= 0, "Offset should be non-negative"); + assertTrue(phrase.getDurationMilliseconds() > 0, "Phrase duration should be positive"); + }); + } + + /** + * Prints HTTP request and response details for debugging. + * + * @param response The HTTP response + */ + protected void printHttpRequestAndResponse(Response response) { + if (printResults) { + HttpRequest request = response.getRequest(); + System.out.println("\n===== HTTP Request ====="); + System.out.println(request.getHttpMethod() + " " + request.getUrl()); + request.getHeaders().forEach(header -> System.out.println(header.getName() + ": " + header.getValue())); + + System.out.println("\n===== HTTP Response ====="); + System.out.println("Status Code: " + response.getStatusCode()); + response.getHeaders().forEach(header -> System.out.println(header.getName() + ": " + header.getValue())); + } + } + + /** + * Gets the synchronous client. + * + * @return The TranscriptionClient + */ + protected TranscriptionClient getClient() { + return client; + } + + /** + * Gets the asynchronous client. + * + * @return The TranscriptionAsyncClient + */ + protected TranscriptionAsyncClient getAsyncClient() { + return asyncClient; + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/generated/TranscriptionClientTestBase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/generated/TranscriptionClientTestBase.java new file mode 100644 index 000000000000..2e70366d4ec1 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/generated/TranscriptionClientTestBase.java @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package com.azure.ai.speech.transcription.generated; + +// The Java test files under 'generated' package are generated for your reference. +// If you wish to modify these files, please copy them out of the 'generated' package, and modify there. +// See https://aka.ms/azsdk/dpg/java/tests for guide on adding a test. + +import com.azure.ai.speech.transcription.TranscriptionClient; +import com.azure.ai.speech.transcription.TranscriptionClientBuilder; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.test.TestMode; +import com.azure.core.test.TestProxyTestBase; +import com.azure.core.test.utils.MockTokenCredential; +import com.azure.core.util.Configuration; +import com.azure.identity.DefaultAzureCredentialBuilder; + +class TranscriptionClientTestBase extends TestProxyTestBase { + protected TranscriptionClient transcriptionClient; + + @Override + protected void beforeTest() { + TranscriptionClientBuilder transcriptionClientbuilder = new TranscriptionClientBuilder() + .endpoint(Configuration.getGlobalConfiguration().get("ENDPOINT", "endpoint")) + .httpClient(getHttpClientOrUsePlayback(getHttpClients().findFirst().orElse(null))) + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BASIC)); + if (getTestMode() == TestMode.PLAYBACK) { + transcriptionClientbuilder.credential(new MockTokenCredential()); + } else if (getTestMode() == TestMode.RECORD) { + transcriptionClientbuilder.addPolicy(interceptorManager.getRecordPolicy()) + .credential(new DefaultAzureCredentialBuilder().build()); + } else if (getTestMode() == TestMode.LIVE) { + transcriptionClientbuilder.credential(new DefaultAzureCredentialBuilder().build()); + } + transcriptionClient = transcriptionClientbuilder.buildClient(); + + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/sample.wav b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/sample.wav new file mode 100644 index 0000000000000000000000000000000000000000..bf23d54b0c00ed3d980af954f9591a68d0d89550 GIT binary patch literal 764562 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π(xQ4@{lk0NJ4*fEIfRNFyJheI^NQ1PM6% zZ2=*41x({*0Utr2K+KQz!WZEu@ca06{3w12w}1)hjl>-TB7ATk?Zj&LwkC0j=1J&1MnS1&*VX zk%2#rXWO$)*|lJ@dVm9(G~mWof;rd^pkDAr*aUY+RA8$380;nH!K$!3*d^>a_6j?W z?ZrN0YCHhGKZMOdS->WaK@yPX@G^K5m~UPNraAu&Sf>rZHLU|&;z2O6y&0H5?cwfl zbGSxa3ZN~=0_t!rw;9X{f5urkDWAu80m}Cc;6BL&SFi^l^R@#b&jiS<5a3WA0mkqe zU=C&jZM_8`0M&w#zsOGp$Cd#;+2ALUSMYZ3C3hB3nA^BZoDWd4Q~9-k0UQs0?-(xv ze9U&>ZqERG-YzhO_&?ECQ8cs%%$xoTd?tX|@y7v~NyB}S>j;iEN0ZUb$P@T~;E0yO z!{F_3IFgPWgyZ2ekQq>0KHy#a7tmh|!FOvWdLfwk@8C)`;%@^wj{v;x3ejb_BUHfu z%{3MUp&!6so(V<4ouU1r+0YDlHk2s(BDxJGSFaR3hxWp6L?!%jK=!WZK*i-o^6Pk* zbJ9Dh%j8eOPYkBI(-$cb35PxfBmuu)5*$fnVAlaH|_>nyKo_80-i#1HJ|B(GiFrTY=9*Ux}*Ny;L~4j509uxjA53 z_+{FQ|1A8T37|nlw8ygaI-ChgQ9Y%5bh7|3Kg;hsX@%3NA(d<$1RXc z@E)id%z~ys3cy?7sb0&Mf!X0*xXbJ|_7xio2-_We9q=UX1ms#2;6PS^SdKDtJrW%Q79qA>#$L95$uM6gNsk$a@mt4;>X=(t|gwGeu%hBj;B7+Q@F;$ zRz9DT2sF|{5-Fdi?5*-DX2}%NRgwg8A^sRVm21%5uozT=A=He}^AXAyX{7BJ5=sfZZ+YYFg4VVcl#RYMkw2u^*G{gn;9daJJ12P9L0Q&c= z&|g^0SF(+n$+VveQ6@Tv-Ng2198_~^KG}>|78)1o8=4ZDOAMtB(jUoTL7gwc+klt` z-In%~ZO0m6^Q8@ygXQIT9jq2VuE-3#8MZ>*K<2@I!4bg0(+;rhyXb9Pktj##%%;#S z$%xRj;9#Pb^0Q;0Q}}(UR(f3g2-Mj*=oz#Vu9uvX7Rqh1FXAYqpKyycQZ>YPVh=Th zS;~&$C|01GkV`^OLNxJuu-CkhzDh{KP7JIQ27;5pZ=3Ike!zHl{J#}m%b6N!;fKNbSd!o*YdUOYevp) zX4i0gc^R0k-c(pDG!RrmGN2sWKs}HuYy_wxdP#jreeripKnBB3Kuj{iZ}6M2u#?}( zO=DX!MRXChm_(`mw1%~FbA)xGEa3b53-HPq#EFIgO8Ye2A31<*N8*tF@Dyl1sC*2+ z7qHd)d5+%(2+lSj5keyREUW|GzjdJ62f6dyMs5{10#x(0fGMvJo}~-C5)f!R!5zOt z)D(IPagZL)fV1FQ;2P`)h|YQ-xuOuHNvseOg^PeyKEc=UB_R1B9`Zs9;D_Li^cI>1 zCez=9UPCvaL(n@Y4{iXzfRdnvfY47C?tnM@Y2e2%WB0Pn*i+0F& zR9mtgDW)o^nZVP~kD5+MLL-3_<^pq<>nCgn-IZVX0LcK!a&ZH^7`u&jMW-MFNNPC6 zKj7MNp8##&9e50C=v<~d(}0O*S}`?DIEM&;@r0)$H^BR*2HAlehucC?fG#`>2;hN|Yv<8kqIw3mbKloqR3pWD(01xsT=?Xjo z*>F#Y2gwsZfEVEls7VLFf0OxoAju$%=Q)xixG=zZZ3do3E%Xr@0sjOa81?|3t5|rz zcji<0g@D5H0bb6Hd_@OiL$E~bIa-EvfuD)a3kgD=fCx(fF*=pqKz9Z%+Z+Bno>k6( zeW-J{H-@~yb$~yMXDC-|hlgFzzEu7zyDv_~>Vp_00pvx@#(M$h1}w(lPmCipI?&2L z#`n(K)mIxT;m*T-@&1wt()-dFsYuMA7m)xYbn2J#*02cgoy z{=lx_g%C!breMav{15aqMt}+v0PjCBa5y4Z3SJ=YCpjqDCq9M!Mi#;UgKmhjL`ESE zQ0?g;!Q(w2!A)XJ)K1{a*-XY#tLYkcjBp2v%XdyM@VsB7O`AQwnl}^L7R8huy^9VvE4)XC*QV zIv`|#b@5j44F_>^x&C~%upB(KfAVv=Lf}&fvcK4H?qBXF|A$Bc?Euf{3h*2~7R?2m zxLD)?IUX|j5u(GcVOPP=4D1=Y7&!)+g&llnj$tm)Q>ZdBimVPnp*Mlm{_VcYo;$AL zZilZgxd{YomgC)(EyJjYiik_PN2=k9;nL}t621m9K`bIG>_o1iqfrR<^S9VL%q`Ls zXzhREPa-#QfYXN8;Zx;C)mODgv0hpL+(P$6sl13?NZ+ADOdD<)p8(FsWNr!j0dzvz zkQ%TXDG$vgpHX!fDR)K~4-Z2-Vjr;*{0Z>6?8Q^?_h?5X748ju%V&j?yqoL97XU(k zIB*MW7aasucCg^$cC-HhPfZCM0q)c%!U8A{*@SAaENnaa0>O}pFbeO65}~8Od(caC zO<2M2V%1C~1qd3VSLjW!Cb%^8CiE9^7+llQR2Ci0h`C~+3zUU^7N^M*RogVN+W$0r z)G5kS(gJ)E{F)!gme3Mv4|$19puSKI=)dU!^jWGI)qoPH-pnv|3BL}qpyiS(`6lHa z)j)NvYNYbD?5x;=u7=}8PHqU>mbpfErGvmbbeA*}wSazW8N3}B6_^}&5*Qe48tO(Y zB|X$krW*K<4+(itOXL>DhzaQp`3Pk*bzRLhbr01^MZWxybcMJ977MuEAUL*_AWP>J z2RudW3qY9;rB!rux;=A%-N1F@#|X1T?LZpLS2DkGDYofhGxiI4|>v4p7~xO7a)TK-fTa zrEMUs<1u$hcmb_PRM=`h#!FZpMms(#tI$zm0T_Rm36W0xt^eMMv9b> z1)2lP!LCt^OoB%Pr`12gaz2B@**?r=peVMYMv_Cra_lvrq3&r!Laq?4|3lS-i7s6+SEep4WD|J4_S;-c>Gr9&^$sb{6 zfHSV7%c=VmPDjuvtz>?)ySVAx8omM449&nb;x7`d{FLIfvWqfH@dO<6di){sPIQYq zN&f-r_eyY;dIHaF3VD_;Vb^g@g#C~TJ%#;?e-&3tnu0n|U!EYZkoJ|l!r!5V@Iihr z-GpyZ&^|admdL^Zf7}^z8T6_n!(K;!Chyvi|D5 zk&{#VW&e@UDed31Rq5>$PKHG*Y}gUeAG9y13l#fo-o?Joffht-@-d+S>*2|CN9F~-!64iPRQki?^VlGre7WyYUrowB;-%uHV!H!Iwt3WzU4;e1b89;)^I z>Ax4e5&9h58Au7ZgAK`8a!*JaT24;o@}M1vLVQ!PQCA-MI{Hn_keGq`brI#-dx}!* z9G^+0hXw`$UdnyO{ngi<;He(WCl(empy99;S}w{EWZ=Dao4pC{c`-Ewc(<35Q$x{# z{=T)|Fwb1)GJBqNo~5fL#eCB=%6Qj&z+Ion=hVCkP(S~T9!L!H&vdtSy>hSe^$C!HBcWf^3ib%t0n~yWtezP{ zFQuA*Z~8LOCvYgRE|BJb<1x7Bcz(F|I;Hlh)_&GROFz>MQ>McivT+}wFVcUbycutD zK4nXM)=a zHM17@0h_Zr`a4*`%nBHM8QunN*tNj*!@btC+1<{S<+|?L>bmK;WP5F?G&L~qwG9dA z1*?ccn}?UB|C_%JoY!OZP8G3vB`L>Zs>A-4Iz%ySCbd2g;nuqJJ}fjdG&az|KR4Kk zIzTTY%KbZo`KDU{Fz?s(t3PdH7sZI-&09o9$oMUH#+C-!AdnY*8}v8|Pb zv!wXDaACrA(Rx|GcyG?foTFLm@`{R^7CEyTCLN8j>9VEWpfqkfVemY3n%%wq&;3(< zxNnGmd1ycNFO?bE9~en4lbB>%3hxNyiTk7{}lDlJ(=1t0ns z37o%=ynfF!?+~C(%%X+>kN8R=n>z~igU2Ci=|s(r$X+pT2i2Rd!3ffHVvyRR$B(c5Y<6&N=dt{H|JryaFt`f>VFxv@ldjg0<&4il0sGpfusEw_vOex=_z9&(ybij?d;-dS zC+~9K8(=E@+x^z_2s}wc$!)M* zGfYEFJxm#2F`e6+`HVoeqnE}95|v5A6OSg$ zk82#YQ+-lA6n-!0*ujCtj&b&Tu1D^PKtcJ_+1FF*edlTHe&tj+a9ft;hUutrwBba} zQ9w$BjHSlChEaxOqtRUHl{4x5FHtL5)A)u zBz0esHZCo)iCQdOiLMuXM24r4bAc6A7$4Nt)mZbWs}bdb5QcA`8o%G=Ua?b_xV?l^6mZFf4)xtqFsIyc)}+wNFan(7;5 zHLl9a-wi6)R^6}eUY%bZTRYLP-t^Q?hP+@eoha=U)jacf{=(eK{2mQjH|kdZRnFCP zXVPkY9nD^;2bBx&h-ZE@Kn1G&vECi-KAvyBZGrLrN1k0CxBnAym|8=}@^WmhoY%aI z>>SrMXb=@5#Rzd8q@kwzwz*fkQ0FJxKh`JKO4}RzKKpuGM{5hq zM-yahRcom(tP1|#URhP;uRc~it$HY+0HUowy#@3qp%|H>-jhV+$n$mi8|%+(j5neS zBsrPsq4?S1qm@cYTR4J=5AO9}4onL={LQ@~cWd8<;E7;k|5{IdZ}Z?1;xn75(jTTRPWl<08s1GaT@Itk%*H?)?@ZTh`*+J|^9qyS zs4g6_c7uPQo<;~12ON@{FrRpNvkIv>q#NL1*U<}R*_5t0sXMQ5IgRBaT3taMV z3yKIs=pk{1n#_iY2=u-DsWvR~cJ!h6$H{HdCZ(-Qiiy=kO$ghq>54JVKfUfd`tbsGy*%0qi|!%LS?*mL3oM&K%9^eNZ1xPG&(!7yKcT>C-#YF zKriEwyPjjNl`{*b<0gqY!IEiBv@WrXwG6f%wEb=CZY{Cgw`MqG&i#%?j{VMU?!B%C zuEU-U#3HBxIt0@yZba}2=42uHZQ8wzgBiBu_i?*pERm5~z5FA-4ZRG{78!xJat=sV zIx9TnyK>#R@4P}d!L?-1fP8?@Of#S@dDzDMYOqIZg!U4TlocrIDrc+isPi>-)%6wK zq{GBKx*9TY&*?leKeP}$hq?X*{tv(-blTs{|H4OkFMD>oQ`{5XHEy*>>*?m9Jga;U z{JjES0;>bf1JV94-?M{FQm}&m97+Zp$iN^=2H2n6bN(WXi@(XHD$l73Geu0R|5B65%q#D1xXGl{fYbrSc|{u{q%J5 zMd%Xf@Jd3CKv@6|ttV(QgIY`KNDC1Tl(sHp1u>KOK?uZW@-n@Gb?{?EH=q&dX#AV_ zr6gDSQo3GxUeaE&O}rVmVoLlFeic6qG@ldVBnb}w|9L>+e-{Vv@%RVqAM`G=0U3|5 zpv#wmtVhz2mvBeWO-Tm|-U~PznF1Gqh~5M&32Tj=!o>Jb%!jSVzvKDhH{vsrK2n#Y9mqHADp5*0 zi?w)XOo6>Z2cbU1hI$91d&o?8hRH!kE*a1 z*euXnnv9*tV(>Be5WELoj3?l2@%Fe6JA@6u8e(73`yf$cF3_#!!vg5f+CdN4D>4Aj z{#B3&&|0(wq)cdlYBUk#Tis z*O)uX8Mq{%F={}!trN(68N?lDmau2Jz3dD2A^U-y#oYh|%TDko88?{q01?*VJYhfoiAKj^b2AuT}4$9!ZE5`$bsyhwNS z9ID2?Vt?WT@GZCvzl-PM|HDaqF@7IAf|Y?|>4~PI_t73`Go%dGgFdYYUI?9smI7D! zVNo(v52Ob>fPObg=mjz#_6v|OgpUR8)El#6C8G(D<5ibDO^hSbh$y0lm`+_`3qOV}5^+0!{b3j)U z2iN2a+7exgoCm2V{o&gnt0fX@1Bs!DAWh+-=nhDR_yp2Ss`zTY81$5@K!4~0P$!)r z>)H?0c1}0|(oTATd+szy%>f>LuAKeF4wSNU;<@6>fZl0>+0iVJG$6y5 zi+4$8NWO?M@lbF?d+}%B>Kwr$FfFzV%|Tm%eAWL@KhhQ?(rS^@a3S0f4nVyiA4t5O z0NlS>AlZ61$TSuU7Jd`IlMnJAg(EMTD}gB3j--hDrYxPXS3r7qIjAPRSveRlZu$Rnbb0$ZkuD#1F99 z=q%)K_#+^`%0N!`L#PDKN1h@_kX>*$C>|uDP5}(bcwP$fH2gpTSAhHN7fAbdiv9<^ zhXz3(KthHR@C8L60pqi1Boq#1LOVpKgo7Zn{Ee_u_>aHAHDQ0!z369DE!l_aMcp9N z$(4kfP=q3alK_8`7hD)X0N~3AigVHpcp36P7=h{tHf{&E5M)>EXD4z6 z!Wp2}{D3+G3giR?l4*bfxeBD)tN=;r$AHq^47v|}2e}7>u|3#kEE1?={or+?-NF)} ztf!0Ci0mLkQUtkx7Ny|_b0JXK`+}UlSL8P$gBTXN6&w;=8QAJ~`UdzWc}IEfx?j4z z?pyA+uC~rH`&Zj3>oaS8=UU$=asaQus=(f%XINDD&+vc4{}+~{T>-MSwx~*!Cl$?< zyHqvmcbXyE*V;{5LOo59FX@Ip6s_P6({^$XnF-F_8>%f6%k>4CK@_O#hd?$w$)5%3 z-hNP5KJYh$_RuN#6VeK6BW^DpEIT1PBO5GhC~YHlgA~d3@K(_I?gagUTEk*EC^{iD zI64Z70_gXF|?kZQwuu8sA~>dCzI^{Sj9e=S7Fk@xWdKIuIvq-K;;&sisqg z5rz|Hk&6rPYy}pp7Dug&t%>_5J}16)>{0!|$g2?}B3gy_4_gHE*uh~z-AmnhU8(ki z`n2MRWG2#@Z%Z8y?DWQaDmPRmP z^mn(gueWB|${abK&p2mVxH8rgo-R#&*Wb z;3_pSEU3L(lTq#eeWQGM+3KG{*_*0Cw&BD(JR%ZKA62)!=tj~0g3dWJQqlN>`e=Q> z7;VCj!a9U`fI8X0 z6AVecB~MWTTMIvwj?&abjEgRfDc5fZzoL3CF(5Ib|G-M~FxOIeDf$L&gEt~u0a^PL z?E@-;8h$A><#vFTw1-*5Efdy4*WtQwCn1&*hpe8p4&2(@OqzC>S#ye|)cn{q)%dw~ zMopjU)s@F9!pb+7J^uNiEVpvGWp1zzMumS)>sqL2RMALOG$e0bx-EW?en{j&{r$MS zU!jRHi;h?PDEKMvQE&0|LmOke3#!0m^sy|mA z_}!@D4NiemYC%t~rK z)rC!k>Pw~pKWDFaDDgtPSKmvwK=u&k*pXBLxtzr4Xm%M7=4k*1%?39|O5t5lDOlsR z<<7DrxxvCycrX4$`c7^KKISvnUBO6h_gS4gY>8IH`pfFKEd}-Hmt~cyv^Kx`;qL?G zUw*a!m0#BVr|ZY$pO=62uUcViLt3O2F;O`k8t9r9H91>vOZKVc*RdthAh0<(E-NFi zHovCMs`QDm4b?a@p0s#Wj=ENdX`K-#8 z>;zFRmMycZ*6S9Am1$FzFYrpCE+q@pdNMrSyz~6BV7p-JK!5KG$8Xccs^P!-e?R+m z;g|VelfKXUb+&Ry&7X!u;}YWw(=c0{f39#s)iQocj=QK~zQ)8r#Dajo;V>{ zmhmX3O>Tpne^Teh$kkHh40*s)YM*W`wuDUeO*+$`AP;2)a42^P-UG?2r@`*>ApH-} zImf|!r7mrFbldom31zXC$d~GNl0~qAf6Q69>3~|{`4)Tu`<{vc)NLPf5LHDt<}@NB z{5RH4vP^zgbyt(BeWz}r>@Q`}H=-BZO_2F{fmN}GDRXe0XQ=I~fdSr4>i4b6j#YH! z?cd$XfBo$JW5AD%W!EaERQ0WK)cjF9#hB~(i#j9g9bY$Za^q1g?lm*kZ=SU=acNvu z!u(WsPGP-3QG4zh$#g%l(GuU2bQCe?WzgP>c`>f;bUtP<5p90Fzicn1GXrN0V zhRhPB$hStM#=lO^O|FW4p&KO~0%kkhhc+TJuzq+c+6p?(^a=d~Ry<4mDS@kj_rY64 zkV@xr;UQABwmR}iG#p(V8K(V1z7*G@$I#BWPTUb+50ao1)J)%FN3k{4^3L4YTy5M^ zd#7q;#qqMGKYNs&E}viduDYbQ%pft2t$kj-s_JZIeAODm5#N6Ci-cx{C!6|OR5pH| zn;Z+N{-2;a2=6MbP9}c zi)?Ae%<5~u`~6;7)v5NZahrLM<)CH1siNlJ-yO=oR*b39TEZNx^S1%pRPS0xh!J1wwr7(Je`xU_xXQ-iZTvs0gvHh*f=JVvIVRC z9sO3{Xy47iWab*WRW4Fa0glGG*eEm!KcXm)P$Zm6o)>>5yh`>QKEv7QM$8CKDs1QD zna82C{*B(T?mrznE!n2m#u29fnd7W_`(67Z>wRNF&7P{&)g5Yk7+M+cm}HhQ7P&dg zBr<-f{bG(Gx~tcw?<)MW;9?dLcU;BcW%8bhtBa2OF{J6Ty5gi=nhfj;v;j7t=ddft z3{eF;ntdwTf;NOE5#i3OmgkOvK>|wGyw=Z&dMta)Oz=PP^`%^Jv^-5ULUs%p#EuNT z@RNbR$UW5VP(h$MF`QeBG!d7JTjTp61=pHgCt574i0BgUj5kF+(fpKWNDqobc!c-_ zJ`8OGedZT&|FU=K;!v%pnX{7va}Dr#ywiMP-UhBZw#KGI9A~(Je zkdqA|JD3u4nzJ#7LKnO_-qyiO)M)M+v=WD@AmzKYvZ-_jRtK3X5_2$pmRK6P7_t&K$vecBV5#q|`>w-gyJ~;o?BULEA9Wzs zRFmIu&ZsbdF!!=(*sb_$RAr(hlk&dg+wg9!?U@kHrQ z*(T){RWC(d*aC&)n4EDGx(6sAFMEjngB`^r((TEwfsp6Adw_R< zAM@|=jBv@FYwV}2gDihrYQZRvp7zl|0lsD$YIvu3724 zg5He}X1z#^)((?@SJ#iy$8SmfoV_vcV&1y!>XeT93#v7W6!mYdT02SoOfy_NMR^Z- zL2CR-ehoDbYA04oBq+nLVR}(M;Js+eeil7P2BLf6*}^*dOt8d%)?XGpLv~};AQjcj z%E|7*t;BhDI5ZJ-OPts{@d@cMi3p#7>hW0c-lbgvGhT5BQcG*0+g14q2K=RzzZvP%(M@&ceB^G53~QYuduUL$~?^UkMXUsj+wT+ z0yD>zDWyj`(m5TddCCYGpZbF~Ljfve;_h#M7sm>H791H(5 z>{S#T|17R&)b_C9VFN(!cD1;%XfTt(oac8Uhp;qwEvu)VlKrXIV7HP-x+yoan2YBT zHkml<|#;p%ml3R3#15tCN_&#f=uI)z_Ae} zYb7s`x0bDwHjr+XB#XCUBhfWTE`owScM~XEi095Sv*?}_U^EGPkO~w8>icg2%|F*Q z$f+Gbk=mgkm-mh+Ypi^`(0Y_~M9_5^O&YDB}HRtevIVIl=_A zjjW!U)~*Tr60s(ljo+O7Jf%-cRLYuEKK*N^A#-I$a{AP?0jWsxrMN~>hjoZ1MxCwN zC*LLJ5fqj}bA>MKIC4j@U!W-P-Y@nwb)R)ivR}40cPJc%M4G)T`yc@vm@u(NlgI`;m+dPVv3>pdOFwoWpA+ z%%jY$Ei`z}aPZU2w!jhX`rumW_IYyrLU1DKrCKrVxXz;Y$QAs#?xPYsU@`&(O}F{|n-&&ZaG|3a@pg~Dm}9yK=9&_CF7+6mh;EsKoXYmd}4 ztC7_luP&_CR}ZYdUR}55cFoe-t%haB>84laLhCMDdxye3(0`JwVxRJ1qP6e|yjs3U zvmq=d^0J%o^M@Y&Ne4m?pfk3yUbH9Q*BQi(_M4ii#>?1L7+NR zNWG%tSq+~Bc~L?fBa2q_RZ*G=VQ0df;as>jVpl}H$nuDO;U&6V8dTjz`H$=mF@hFB z7x*}qCuar~zJM#;vCw+Slx+C3W@>ep>Os}Es`gbxWvi-)>QME?n%%Wm4KIx@(;`bN zTeRb@bAfx54<}wRt%1V!2l6kbklh5k+BcCiqi@D8PuP-NoaRceo6#bpZf5VSgISBR zx@ARWC1f5>+m_TI?t0X^u6NJFs%}bnZp8VB zrjgdjxTxom&m)F}p8$^O=c*d{cFB3HEs_M0{46$!+8Lbf+wAVVfHb*So7^|fkC^_ZFiwY;I1X{LFb<%2cDe%w*xEOc-5_6o+)VD22W10IdG7Z=LA zs8wNeBTJ%VAw^Qohmqn}-A>u)`4y#|u7TH80-M%jAVw>gVETYWbIUqT3_ zVcxMW?kXQC+6Qk3Z|nb5S*D^N<_qbev1bBvqEOdxIqnglwAZqSdRDDg^c zjp!4X2}tw?^rVm~bcLG2pN7w&Z(xr9%v!lyAbGlnXdpZjzbdO%o>MDTYh*E?W3H1g zQq;)yNgjyTiMwD<(S4?v_zHB{%c0lApI~Z5BVUSlr^o1)xgf_F!0+_&jC8Mb-gk6$ zYynkD?;PPOa;JL^15RcPc$d_7baeIh9QC&KH}*dUzS8^d*B%vhQn50H$X=5+BQ7yE zFZph2WYUCqG~ss2)a*sMZ_?{T{v#d?KR^gLmum}1gB3`rc(Hgdbd|aY@-8P44f$RO zEPf{IrCOsh%9dg%G?80KZ>0}%zeHESR0B+C&&&%#-aOAbZ=&xGSSx>m_4r8i2k41& z+$3&`C>}G3d&%~zUg!kfQ&o;E20spe1(|Jq&^qWq#0Oml)L&;n^o0lJ_&)gOhIWxB zDT+K3iuDiiw0E~~jdlL#%yG~59QTm!Wv&9pe%no3Z@b(+-lnzhar)iA-1}WW9k=Zx zoX6c4JO@0Lu6FJ>)GZa7{j9;qymyI5;tZ)|*3-0i2~FY-C79Dzk$uVf>s0F zY5@5qln{L4JL?X)>H+Mo6TV35mNiwJlsA?BCGH^h<9qN%l6vx5NSjSp_SbN&cfI4gBUFSdKbGuhNGdxvHNA0^zW&P^9&$D`FIdYNw z&S?{)>qq_@H6h-Tl9}=$I!gXnc*WLZ!b1H#-93e&-oi_9oYJYBEtvt`;}fAq*dUxj zhhgiaS5>#Q4$W2RD}H>iv3HRT=I~kN=F3GfhST|J1q%yPOkYvYEzMtwH<_*$oiN&IuWoy-5a9RwOm6ygzl9)DPHSYsUqrzqd zoeff>)zq^1ra9MnRQM#F0!^-6GOePi>b}OSOAa`$3l3ZpG%aL8NDci$b*7}RxPxEG zu5;hF=h{{}5G zbBvoz-;75J!wZbL+T4M;{qnBmKQCBg&=x)@dSMrt=!mK1TPO1sE>)8>+Sg=#t=MuO zV*4WhyL+f1s6ZdCd!P(g{-}zPkN2G`u3R+AG~IgD5#Wgf8~ER<389T+he!7anHm@n zv^e-#K(2z8ET?~?`!HEdI>q|BJNMfv*fv@eCXHce-rYQhQRmtUPCzYPL;gy)2Dtbo z!3lv?bo&AX{Ym`+U5vVt(yMrl?69BcM79}}q|P~SI@>s6Z4<3|_5_d9Hy0z#cFs#q z!F9vcz){xH#?;z$ptzj*iYcZj(XiG~v1mzA>%#2?H^H^>!tkjeKmS7hxBSL=jdE}2 zy)w4u2L|0vC@$Z;;>?<>n?|&7)s3%EIbme{U(u-{65Sj12=zEsGj)5-9>sX^k*kia zi#61;(NxL!rC8={EAG@Z2m^s+M8C*@*zR$y!zXIYk}~u@@H)@Ln(h+c5brj20>8+2 z*fGico$*_tyYMT;+G{c*kH7Di`>e+iN4*QoT&H}*2_f`9Q;^|tp`_hqsDkokl|Yip*hj(v&!gFW4D#fn&gVJ&KMQr^?tKXSL_RW0xo1{$Xu-!o z14D<0&4~TG%GT6@bzWEUly6pLdDYK}H$yk-YXsiZ%rrc9)JaW-Exa@wkTr#N=m zHrt0g=XzLHiL91oQj<16Bq{7@@QUDTp?`!X>oe7z}{7I1L1F5vAw(N1ZI$l?=#ObpDwO! zN;j@3YEn4X(5Ap;C}&o)2h=@+&xD4?CnQxSrj+NfP3Y@`x*fG?;(bmH@(LUYjac|(;%1r_3Ax!A;u(DAjqVI=4($7<0 zkT!#eM|IyZ*LU_ewtB8WZ)Nbp>;0;)OOpZMSphJrnf5`6CFR;dsuReMTW)s-{|mSh@3vT z_wrj74mPG1-!ZSWOt*wuxZ>YTkBSZ&h8rwKspqmZR>K8UjdWKGNKLJuTJwF%;TmtN zUo7{1WVF76W}zZRa*6(#?jbt(vEp!K^mnH8+z4+~&jFX!k>F_KxajEX9>`aaT~P<> zrUn*-MBu(@V)(V7Q(CKHmUKVeiXRUJuv`b@9_8NY(z$DTD)pgJs)EdQ7I)G!{wClLTW4mBUHp|R6&7AoWP|A{`)rM0A zAM+>YX>)gfYn;13FR5Unp%^{fkYa^}vYxa&Gk;$^*0izM?&wO*RkTny4%{5OFlAxw zUNx4dw5mR?X49%Y%Oph>=qU{cZnrq9y%2;k%pxI=@&E&Ih}-9rc{f2(gK^za)RhF56Eb%JRRC$5wlJ<#KtEr>Dtlp&dDLBb9aSNB@tKhXeLu^CMjf>a9 z533jPhBAiJ1vv%5h6@F43VIcME*M~VWcW}RZ{&<_lg50?%$oO`-xW_OZe}g=v}a~1 z>uc`om&f0!(zUv$YVRuZQ>-a(DppAR8u4?`Y|U|GGhK$NwwfKnF6J)_BCqA=aKqUZ z-d(`<1$mR)i=1EGT7DLtE)k_Zr7}<%staEdRx6}oP$&J@fYoY^bh{A9g|NZi&aT&v zI_MR~xaxcE`Fe7*xoqyP(1gw{VdCGy43mylC{(SLqI{KNoT^y$7z|~{nQHVlQOhs# z)^lCAUj+Mnw5eB-&G5EB%)geeDfqphvf+wh3T9Xxj14hP4gr(XiQ-_CPz8KQocUF8 z59?LWG@@V0e}&dTnIz#m+K0)bUxRvy!t^xc9_1aAw@2tE`%LB9)kFu)!{ z{laH>Gh7CT*S^I*+tI=G#C_S5;@ie87O&E`kUzUs@}u;m?3H}2e7Y7%Lox%9WaL!EfSg@lotO&lS&c-wZHXG~#~aKTyl1 z8x+S>26eWkrOpsgF0iF8LA^!sR<=fx1|98{zD}Mct{cuDT(#W?-OWA0zWrQdu^UjY zze`q14MZ_n(OVuVn=MU}cE|nVU#I}l#aHJ?aOK$8%q&PXbsco~@onZiQ(tgrxQ}$B{E~8$>L=i6pU85g%Oof1 zd*T!RGkCdw^BrJUb8oq7d^2G>^_eLzt&Y!ENJdKYq~X#zOjUXSbqM+r<%C4OfX(!c zM|R~E?;X!h_d%Bg=xnLeW4~;BXufa zGfZ{lPX_vS`mX!V;GSY4cC1J zSLrd$22DM1Y)@BR2Rhd+A11pbSwc~f~iFx4QTUizJ6KJzQRi%J)J3I?7QwvenL;9#e6t+}Vb?EcN=<2uH18{wAl9T+G+0Fx>K7lBg@rS?(+HHZEk zI*PS{zpX({5<|e_vkj_ze}nVpF2`{+|Avd^M}jSe<{yF!WHZpUC%K*6aqc@V1bU0h zpwssmnte6Ekkbj6>0|K85yC;JHkX4n2=;X@7$~MgMXU=o8H&>ffx13NT?LzsKuLg1 z)X`Z~XZjmWF~{j6bU)^AW(v~>x_ixlCq5&QNGD5ANFM+r&q;Hne@WL!CxUCPx^x6M z=k&5rS)iz?)8m2c zJPBqF3mAD0GPj_emCCdLey|_dHnt;kydgaupKbz2&~YG9mNOHXkIVq@P;`@AhaVPW z209H&hCc#pz8KsM9i-KyJD}rmT>87Lzmx*8t`W*z}YYtdO|w!6Ap9l)Eve+1y_FmxGC@=nry-;}KPGGc?;XCcaYBt-P6S=v(Oeh3Gtre8a zDnU(g3H05&qP=#6GSe0@ips`0l8~Wa37N@Cz6jCk22?*cvz$-xbz`&GMqE#*whrQ| zavzaxpyOoRXLdT9%=TtGb5;1+hz3WX^{U{1ge1&We4_^<<`XcaJfg$y``}~QWMListE{o=rgmK* ztN);P1gJO(bafxx!!ll6c~>@sONX)(t1_ayVctI`iR$+grpAhXu- zQhqx(hg*&~wuk$Jo5-oSgWyz)VxOSLKM&oT<-U==I=&+BG4E(^BDgqKdv9?2rocQ zYbL!7{5Y5C9I)dwr9XjB>XEoo5}@YwFT!JD;^VSo4@VshT@(006R%#RTCe&A_f{_| za}~Mr+ZaKOk({HS3MuSw?n7W6U1iUA-t>+aCNc-4X|jn@TGE`JDh?M02<654lt>Mw z57Y1Hzks9eO(lt=_-gEIkKA>|u?E>{&)mIzHtvP60f@*;d{5wwdEX%RB$T$+Qq!5s zlK#@gh_JUMM=+*ZE3*73j2>4(+wKC~tr@M9^h89S3I4Ys%t`u3dN5+o6R-fOnQ-P9 z%~4IM7UDg=Jol%st#_5@sAq^b$@ktj7MyhNfS2pwLcW~sn5`A`n;W@CdE~xq-(Yaz z%q02;UZ=<6$@4D5%pgOUNUfo7(Nn-IQeC{y??S(SgKf$+;cwt72LO*-Tl!4$hPg>s zfL_vm;QAMX?{5-yTvA2#Ht<~dnbFHIl2f2&rp#t~?>@x2J_hM(VV~D*HR)wH2;L32X@=B0#RS0e7 zs=k+=HSSlgvOu}@0;glR=%99j>CPyo3g@`H;2t`NE7&Yrs2lVnx-MM@bLs`)Rg6Z) z!&~qLrBi15nxru}^Y%+$fgP?NQ$v1S+dA}U%&Ri*%2~^Pj_VnATRTQx4UAiE#W~G_ zfC*r9KCZk=zw&KyuCpcEs@vN+@46#>HMy>s%T-}+O3q0mWjm!EBm?OKq7*u?VT@VY zNwG`$Kv7M0j%v@=a?P`~v{tZvcIZ71d`r2bxX$l=577ROI zqJt`2m7x%2ZzQ+qB&s&FfiH`@s1868SD-jPl(o8RJ6GG|?NuBhuIZlJzRsMMzsJ2{ z7y4Ryr+Zp~Ri)6|p54tYM*YkrOO~S7-M|c>yCWB)El|tlm`zXvQKu}O{@Ns>Jb{aSfuDhn#o>;!Ot#dB*#__|&CScgg5FYW#7}=hrj-IXgNAJM2!k z=Kwc@+9K&Bdkc1CCF=Y+@_;(f59t0-+A}kAnZxuD>LdDqOz>!iq09x|mA*ObDa;Ed ziwD6ExDX11WxzrfE=iS)0K%7*G?3Pl{wZ0^Jft2Ar@8mOjouHQhn`UHeD5vq8E+5o zZeZw}BP*bi`?CAE=eqa0Z!;T#HK!o%2wQ{w=zHLkvg_FaTwlHs#u!JzWR=Eu}NBVU(=HSZW;=$?ONqRXQ}2IwN=VZ^=;RDYXxu45pXK-e~3q zt0T|E1jYUl^(o}G_M$uhoLeL03pCsGheF*yMED)mli&zo2^`#buiNQ|0{ ztP8xGK3_9rQdWe@`FGxv-pao15NWH-wr1Obt*kmY41GSUFBTl4I*jMrV3wuF%-M>O z-B^Ag#%~*h{o)O3BQ4NU<_VbHD$&)!?)DDjC_U7?uVAd%lxCq2ZG+Np26aZ_QiSNf z1pOG+K4N_Mw2%V<#i}^u>kd)g)hr7f6nr{(h+a_FkT&NZLRIjd)8*;PkE6?B%)XRK z74NbsUM;-h5IaERnD(;f@;kD0X)zeSyka5dp=H3A86}+O+d`fG890hAV;;DOo$u@8 z9qBQ<(>y)AD%Qt+7Fto4kgxU*>XGN*Ep^2@=t15vmn0RWCa@S)W?o}td!U3lHW9gn zw~_lCDSpPNbPzHKHCzTuVRqLEJe&;1Yl|@UcR-&z8*?8Hv(hxIJRV@DV3rlfT70*` zDb>mc|MzzH4)*T#RzPm#Ts8_Lin~~$c*Z@(%&Z1R{N-?#xnL;!mD+=x-W2LJ=3gz4 zyLdy~N4=o4nN7${{aexsOmXqdXF8V-XF4-WnElM3;P`aW!|44Ki@W(2s=Z{Ze2uze zfFx*Ea51oTlY1>M zd*-`<)++jLb0-C8J!39W1tVZJ+Qmq5lsFJEP>S_~Pr`j;l7_xj-Z4aDci2AAPGrR11lQUE%x7QG zNz4q4XJ5gRjhGYAWDCi9oMAHe2650OpAG9{z)U*J=xF(QA%da>#< zAAS?T58=0>{e8k*F^7N6pX7f=G$=qDU5eTESYUAbbKh~bxEL-F|FyYcSi8u_jDHb- z6YOf?$iJQnpVPy8)4?)n#vDHmqtJp9mGmsJHgaqm)5pN<^&BlY1T*A))ZbJXMx{NN z!^{z80P}@z2bJtC_+BM^XCP*p+nBD*6?}ICW`jq-_qdf-F&&vvOj~daUZFR@$3D`D z@Yfeiiewzt<9?OQg`Ij}-Z@_KC;Ypjbf9#h^cU%HX{uBw^+|a2O!<-r_$*!0K@tFa zj$&#sK8%a!V07Zc3c+Ap^9$qxwiYSy6l?^~ZkoWOe2e*J1eplWdd|JzZetB%12==~ z1}_Wd+b5`~__>R|L1-(Ao3a#}Z`<~T;d%Fym2a^*r!ljzk9RNzBH_A!q+MwAx>bm0_PSjC-fj zy=eh9SqlHZPQ^e!cmutU-i>yv1=rsZDBB)Ier$KFMm&a%yztQLn5+MR`RO_Ms|={h zA>hrdi+FkpzuX9){7N@s)-XqzRj_#kc=5_G-I=M(Fs3T=j2;dz*5Swvu?|p?ehW3- zE?8ySjtox^^$gJ^5_5H;p?((}zn8_0xYAmPU?$-s=E^~0MYM6P_+Ge!j8|GTV@>Ea zG=2|)Y4~rv4il3xKh4JbMc`!45UQf}%|L9Z2&V0Q;6uJ5WD0@eckrtI;543$4Du{Yb(1$Ih7GW)63a<87 zsI<3-%KQ&_o&#R=#b})iVB?-(NUVX;d;%UjV=j?|wW!p-_W8sw zDCZ+&^t}+ji66l^D92jQd2y-O6m=PlE3brgfu>?_tep-J2O$@}q1aKJ4z6Z5xRq;) zeewD?@SUcLMu8Oqz>L}*D)cvSrg!2kaX75iA6d;0aK@U{cbJniIAbBsl!L3Fp*(*H z8K{rJ=hzBb_vwi0U&UtBT&$;^!Rp^i|$dt$y) zOtnHBOG6IpUqEZs0Egv9s7GJsY2ju$pz*$GZ zVk@alXe}$zUIyUzwW$cqHnFII)>DOw#j8T(Gf%`iP7joJgt$&Tj`gM!xT-_Q)}Dd2 zxgSdUq90(J-q=P$1$~-0Rs0bagQhXIIpRLp;}d={2I( zX|OUlF&~QeL?_lz@8f)4eA9qmJp>QHUt+EpK$SraP}FVlBF@c=K~y*;pdRe_L}PQv2D9$L$bD`^#lYU>sTNcdcvCW!3Y&F;clCj#$YXa{y$kB32i1-0NVUcK zWJ}-{8labHg#V`Sy{_0(7uOb#v&G;TDR>=+^HDgLmMROri+cD^rlP<#ABWFs;n!&; zN2!bYtb%Wlt43x%RUg;Tn5u?v1)z3#WMK#6h|yFidSIc%HpM724otaGa?sFVp9kYA z171O-3$`8$GOz{>Z*}9_p!~!?fcvn% zfY&UJW5f|i+j)yf_7NUkfGrzd{|s!{ufz--{R`?h2YX2!{CfpX9N&w7a$I6>7|DWFmWG`Q`l|K6| zO7{7G>Hn0Rg`A5k*-M^Fe?{t(oYDVRdhGw-yVCFc|DOG|=dVTbnt@%gJp4cF`1cSi zk-ySszs<;=e+q>wAvXN)6_HQLA2|Zqh<}h;B%2bOx}?U)D^*F2ss4E`tzS}uq}Ir$ zEqO)0p)C15@dgsl)QJFlcS%R$@!0;c4#1IlIzTybq{)tmYL@F!JA^zi$z%kap~EnZz;yP$&q-7K%t4g}4}n-YWsovkaApEeVm7Y~>Km$(D?* zA|flG4kIy>hCZ9ZF5eP&EMucCEq0N(jQ0teF5o2zTZjM3$%uhmt*<1$19(!hk)D?LE@4(7p6tLz z-q}l@ZU1|=!n?`mHbdp3VGByE<&4u8z>+uq;D`J)4Q zB=1QKAXfM{QkGhVL=;kX@>?XCV9ikN%qT_pc;|mY(HbEBlX1 zj^#hL9Cbn>+rQD3#1?ATu<&Y7I5#u{!$zw5Ikw`@1 z5E*BXm_+>F{~glah;@nONo^4SDfJ=ZHzXeWElIAdv?m~TAf7>@CMnH-Hxg_7V+7Kt zl-km7S7HHTX@Arv<@VdtKko2bketUqUhu~-|7(9g^G`#?Q)!>>_bC4;!c`Ip{T2bq zW{D+;9sI9IdoQ&_Y3a#l!~&%J;F5tCk4*g@!tQAYW}TDe^elK>VHLk>Hj?`qyJrLU6c4x+HOjZP+|x? z5F7aW+tSf(=_ll~((CkF?Ej9E{6{T4Q)#3pEzj@IelI4G-5=#i9s1)rsnzh3T8uz{ z=I=M7(Z5BP%q>XWllUKw&mv3wqVzeeKk@=Fp$NId;- zBrT2Cr8Qn!d&FwQUjFz;UXwZ_&;HscwN-l6em@{JPB!xAFUNmhky4RbD)nvuJ5o-6 zDEn>scctPSWX?4VI#P0r9Lh6ImkQN6JL}lC&p(+$B~g<2hn~e{b#Yr^svnxR>~pKcfEIOZn@Al$)H9jCK4y z3h7Jy-sB&7`^N{Q)TG>Ge(Qhs_p_vY{*8<_9k2xPBVr9pNeuPB^Y?uGTHDIjz0ecK3$1&hn-%4U^J|4;Oj3q}SV_On~A@GP5 z0I~*9gfo|ph|DGSb>O=EJ+i%|ZzG@nJ2oQLCiW%YAa&{YE7B&&$c*>~>9hPB>8k@_ z0e_4m5vbI6{GL=g+w=d9^v|UA_{TEjwLdBmPyDZ!`eW$7k<0%ZfBW>K7J zZ!mu&Ynh)gbGwZ-xObSPyv17S2lzxziCSVxS$V9idtsG6(9}v0zha#`8|&O_vBp?Q z{KVG*f}{!V0zJb$%P-7)$!@&*$h?-0g*sOi$z^GxJYO0t*(n()&sHSLYfFYPiPBWr zPm(ksA!`9UcNAK?+r<__Eg+{NU`d-`<7VJ)={v9_)8PK=0B+}Wa4B4Mc^nq|ZO0T> zqUWtA#Z%VZ(bd=W0lLE*z3V+5_W@6?x23P0&+c1~dz4j}73$dFTYv@iQg&1}*47K^ z8G1Za8geV(gt|R=6!yxrv{LLr50-Jbz6Z2hhyv^BI_jwOZ~0WPu*{GIOMjG%r;p)o zT@vowMT#ASx?Fvr<_EbeLZ88cJG_6gY1})Yb_>8P8ZO?XeuA^=nX$ljRuYGZ^QeQk z^Y9#4q>H#;rlcQGxpc7PtKa4J~0ZoC;A3@x3No~0g}CmoZU zRqj{N2YKvR;{4)FcCB=ta@2Novq##G*&jNdJ6A&`?V)?7XP_s`WAnE0HDeR0bY0`P z1qn66nyZbf#UXbh2ZkqwSBbb1vQyJj?olk3PeK-Kp0HFU*Ibuu#yv9dpbBn@QL{$3 zT3(iFAW2gx6xaBXUL*gFY9mbID~m(9+xGM3Kine_Mf0GCSp}GnvD853f;3OkjB!ct zsS~vQ6yNA(RCgvv8mu@64dwSVg|+A%zyLlL6u@Sl2N%>-!OS-EP_DPG7++QHhOfW- znSH-?hBd$zZ(}W~W}*O7!P3$^(lpkHY)SK4TSZ5bGuPR{eZsQ=`ge`EpP)qaheWQs z5N$2PMF;A8>Y_q#M)i%nAF(r z*B(*~p?1@k6{38yi2M?MG}Tb74%FmUZj4iF`DQ=M<%u3P!1tB^gIb12JVlZxTOnH| zKcdkEepR298kzl2Dl1YnRn}D8W*P&V@d9Ynr)(#1j=O`AsV_cPs6XN|X1 z3P}nNU80K)z7#VgzICiKMvR;jd{5g!9jp9CiJmQNRmE%V0L3rJ$=S{^sc;x_IJy{fjX#<`o7N++0{V&97w@p2ps)LOfd9C&?b^Qo5SpruHkp0v~xm z`9b+Y`9*#OJiP6tt$`m+me`~pXo2hH>*l@bd5sLSOWrW|PWu6y!oJ7)xOkP(Q`FTs z!`Rcr6i+h#Zm3l-&rsetz;w$v!FU7=LE)C}maUfkmiv|*$3~h9jEz_l-Z8jK@RP9R z5yg@BW6C5PN?e*yF0pZ$sJN7nRCSQ5xwgNqxAu3 zc_wbdkn9h(p)a2O0s6Cn>=yQ#*n-Itz0ksagb1^P8zOF@pc2j(h?OPpB*&PSz%IOD z;-w#v2QXIgM%EKNy<_DYWf9Wa;H>>hccPENvkSRdJ}dM@7P{TeKODF1#kLSzTkBrS zCv(~2v&Q+xImTMX(?w&T1Je^K-78HQruxMNrXbTmQ-XP`&EuZM*5C({}iO`343X$rk=^AQUtJ*71 zD!Rz`N`_K;FeUuN-ttcKOh*1#n(K~pu=6ssgbvsTJH|P`bG>%$aR+)A`VO z1>?^8cJV2Cob|vLQ{b!}%0w~?fghGoXMpf+A!H-d{e-uZN9Hy-cREz|oz?}Gbn~R* zwx%@W#-f@VR^*rh;~};IdSWK- zP2a@5yJlKIhv4U7S0i3UzKq%&eITY+oG*S~ z!lU@tu?u3(L|2Y_8r~%|G+3iA8?aN`TQgEML_QL^(q*X>;XN|hw|jcJS*P8ha%9;u ztXr(nwyU;pwg|fbC8AfZd+t%5C!Qu=rLPtccdL*k(i7N}Cm2nPz^r%$^lf_xpOC@O zf{SNaAWz;Q-)4xjiKCzWj4jgE)!N501xyMriysxAD&9~$7aTaJ%`2?nC~`0HCbAh^ zW07I%%E~Fnt2=Ae0d@5ALXL;;hrm>>AhP(HrOHenC?4Bh~5Eojev z2CB^N?B%@e7~rVlh;sxx$~n@Y{+jMw>-q|H)`z|t+t;oX2K2d2=Um{yaPKy{FUOnt$NSomI`mTZdbQzjl)jQ;!e}s13 zaq%{<=6>~sc#pdKgCW|6eC+u)t96OBm$fhICKrrJKiLl3X#21BFvk%`Yp2)w*mc3Z z4-86)KvZ`EhPE$vh%4kG`L6sr{v1#(XP~pVAG*ia@Vp7gj=5ll-heECuIQT+knb~y z|AYUV_wqjqMZ$30F1rmRqyrV(@w$`N_qsmjwQHN<3XijTx zXMn3YCg zydMU9M0d;?#^XMH8nqVanq5GIoTc)S@8Y5o>0TJ6&7+qBCv%u~(+P|YWtj)X>shFM zkttx-GY_DU`i!{<{fYC)mpjO8X4093Od8Njn-HOU0QKI8egeMtZ9r9MF_*dwws$FX zPNR_n)&Th?QGyu?u~9&9&4=GD=I;W-zZRIQ8^G??N8Uy>GTmZPb6W(fkceEE>Oe;9 z7EgDs!|4g7LU182h5Eo123`#n6y*WVX(J5DH(7dJe3TDkDiVJ%4ZC4ZEJwQl>+tC zpI(CZq4ZPg1F%L{fGb!-J*TTlihvtu5cATJ6<9(16-vI%fxd8|PMV58i*11AXehn~ zaxWL7-K|0oTRj6$b;?x08B~xlb78 zgrZmv2nqpcythD)+`%tT0iO{DEz`xY$V6a*uAz1h0!30ANRE8i#E07N0Bp%l%;0KJ z?=gCfL#|9Ssvmk8f})58R&xTdRnxE@vKQm`nehJQ)Me@zWrMVo(quo`=*>9ib(is86kqLO|N^T0AFM`x@iS%l>%$6{PdqSzXC-Y2fY zeYP3E&h7@@R)VwN6Gve_dls2Z!I;hV0Y0M{bsa|;1oXxO)K(SDF)zYGF_@nZ1%~Jy z);-EY{jwG?L9c{M`1}EU`L*x>NH9{@I&nGL?@Xv6f5ABk|I&8Yxh9nZo85%g&K?{$ z2ea}Th&V^YpQs9SB(N;6Vc+4T=76Gog?X71v+yJM)pcqf^$9cRF0i^4n!f$1Ay|EC zkDe`048e+k2J3cmSn@>4?A;2?QX)z{0qt%N>S{UaB@>@#0qsLjH-}MbE%K3?qJE6% zA-AF|ui&?KtP0pgJywZz)Cn;X2=Xn!E6agAcIAFaXx- z4)1IT9MV}}$}*^%h&=D8Imj5@DgF%v-YeMftH&6ZWuXjxQ5O+7_5|RiCZf!jV22kd!591@1o7noTGVN@ zJq7hm>(gM#XYtFJ%- zB@Np?L2a+3{y^_BimFM!hjq{3&U+yA%dgS%aHTD&SLg?RLCn98Ywbz(MKnG^HAH-F z0Tt>gICdbNK$WFmi>HJUR4`)xOK}u(L$C54#EW$Fi-qD?V3%pCuULdUh9gvMx*yuq zN1+3yqr<2f;tH(QbQD*@7tSNcI}Ouoo{q>r zRBQ&1*d|O77o(Ib;FJ5|8Dr6!en%#~7Fg1j=${V*EB7Z5oO$TcqeYV-L2G&@_C+3Q z6t1=_Vv9w%&5skdQ1_7;a1QNy3F_!9Ms2@i{Vxv+*b@-j12Ov_iDu-kzjYzdDE!%F8KATzV6K|o}R zXd6wa_2Oi~$EU+j%LB2z2IHX@!bRkm@8#!X{1naqidDq1Kroj_Ho60&ja0mo2)`ry z^$+2_&<^&VfKm}0Oayevn<9tTOJ8IrN*u_b=_|d846B>cr^tbBBs(sPlTVQ!08jBX z`8m9*A@|7smW`HuLq@Mm`h#Q>GI+<)*|^S@;#i?CUzKaX4)pa#Cf-!{4p*?N9<m8WmN5?T~$Wa zU~2rDQlsMJGIyf)gx3n)7AUGc%KPdM+MVh``8tVDe8lzl&4AWY4`>!Un9-_(x;=qK zfyGdPxu#jG*e$sNPn=5a0K&N!U5olG4B*;$n%T08mgNo4F3NIe9?Tq(IVtm8rYtKo zv+z^e$LH_2y?ga`!MkH0yL~SBdfb%8)Q?K3^tk5oMvGh3XuYrLcQw0|yAm0vtFO2t zcS$Ew8u2r2k#rK{oPU|9LRsGNob9<;#`(^PVn9Gh{J2W>t39u7tI@Z5VTC)fmXLj# z1yb~&h>D-sb>3}WXpT8Qny(o%io%MX7XDr&0)U=XNG+W z&j`y@WY*8TllkVe@>9H>HIkuz_N~? ziayuRa%DaLGA+~fwYvSB@@!;45>;h=KP1QG~c3& z|Fp?1X{N5$8lE{|v=Km9aeYI;ry@P3}5zVeEzsOqk7hp zFYUk1{xUP`RsKcaRb66Sc(SbK-)Z;T4{fh;W zyG*fqlWw%OgCUCVlUZ1 zlLV%68QPlrCt$Qbdpz|h>;mO7{295g7n zY~U4jRXM{r*`>}lSf^NRO$5*S2=f|K`=ZB&)&+NS)j6iG?(8$)-sE=5uV4f#RL5{RuYB(4yh-^x^H&$1Fm>~7(eI6KUZHvQrm4>x ze`>J2Qgq~A#f6^@(zerUH0xe+b+ekfDDYqzu0j(=Z_* z@nwuWtg}8``8^v@oR-rtYw;I0r)FVI$4mY%#a#VwArT=70YA&jP_=zc?8Trg-?R(oPONuGA zuus9W+@9I1vYUQ8o)els$5`YY5Ts7}TB(1n%?(_QX4Z3;`#b1o>biMjHkHvgBjNL$ zuQ!Z?xQEJX+Dp2JftQ2M>o@Csy5hhe^hF_Eq6WpL#|#du8JMOKm`WaN@s@%S`D+Y? z#i8z(;`j2snj!kx`Z@sP$Mfr4HEnwH2-BJ3rIsG{Bd&ON6;}iMiQ=V&`}4lb$;}#* znVa=EOO;JoD@lF{&#JhxMoRq)&7@80)OZ|sNO{7=6g>EB_&DO@`p?bsD>?O&gWBE! zO#>eUH4l8MvuG=+BeaVHf`ikdu19x@I2-aQ;I^_h{lRs=xL46(gJ|mKYQTS!bX5Ns za7JG>u(9HekmC-wwt$8}w5fx+wymk_lrN0^&h4Yt ztKAWIqH5o|cbaTSYmu6ktPQCkY&6~ba^q7>M)}NJIgE8YHB*xrxIExUKvF;lO+EE9 z57WN7^lQ6 z6m}@QQS{XG)Oy%?8&UoPd)d9)W-%=>( ze_4L8G1FO=&Q>)H6oSmbGXp;<5_ySTYwVr>EN_nCwegWFdyp*bmD;1ZQnGH`6vNOV>Kn>`|-4md^S$%U#l#9B;oIev|yR(WlYb+l(K0tL|gi z+=$$uOwC#OGwPtgiiwgk$|k`faZAe7OMD&KC@@2M%X7!nGA}j9^X*sDXkT|lygoa` z9vT-?Pbbnv&R>nMa;N5u$<-FJ#mSBxUY(F3j^HCbW=lbV<7-sL?sxm%*3Vd9bX2*Z zY>nDOn^$VvtW9(yx`IzL$ex&`fA#iN{>KqH6N-NmuLhoscpT9sXqvjOw46ATe<2n~ zRhpFWhh=ih^)FK{^1ikLUBgk{a4-AJ*D<*V%#-?uN>6*iW=96dYW zB|XaNHayB{o4qJ^s_94HUd80Vq+nIh9Nk)ZRsO5(Y2l%~<+%$CyxHeS^LTvYxbePW z&bq~I^XGk?lJVfW_JGd_0CV!t&u zHuOxF&kPLLSJupxpJLvNg>;Z|sjg4RshAdJH5D!=P6^FXcILNR%NV*r?W0}6amz<; zk|Ip^o35)iOtpw<>6>fkO*IRH3XdE6Si0GC_VbSW&Jf2KOM!8D!JeGsUw+K$kySId z$k|=Dusl^azj2+G32Eo+rk8Q6BV9wj9se{SBMmXWn(YGjvmzqEswt4SkshV9=@;?} zIx%=_=f))-9&Z zMFmA6=F7HB=PA%YSudAI%GNj?``|)4h6&dXpNRZW5K+quh?b zJ$&8bc<VG1M(?XbbnQXRHcZwoNp1P5EJBcWGVSk6}w5F|lH%gK!l`wO}d~TgL*mcBy#TsQ9ZQ*VEz&`odTxi;8%qXM{d-LP- zqH;$9_|v6uzUP~!Z~TlZ4Qp>~AT|iBRhV=ks4aco9&Ng0R9J@DnmW6(gXs569Z}Er z@g{j6u)CN&nx-MuqgEySR6etOVtia^g!&h1nrEx+tHlOZ@IdDPcD?vQc*G9DeWOjT z#g4M}6x&tna$7Rk1?t)2%q>h^jgG=6hP?&5^S|afa)ms$@HdA});2Pxg0kApT9xW# z)s!bEMz&Db7dpEmTt;_$Zx!DOFhJL%=5hPnYaLVVk6b/giG-O$Hmoit%Qi*jU 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ⅆ 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

u>)@V&?Y{2Ngu*Td}cV0E2(S^lWB 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

xM;2qpC|3Z>Qj~U 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�K{TSnT)hHuT25`NneFi$tkk$M@%8Hz|>!3%1R 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 literal 0 HcmV?d00001 diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 000000000000..1f0955d450f0 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline From f60fa1271e53fd7dd77db9f4e4c5110ecab54ccc Mon Sep 17 00:00:00 2001 From: wangamber Date: Wed, 5 Nov 2025 15:23:31 -0800 Subject: [PATCH 02/45] update after renaming --- .../azure-ai-speech-transcription/README.md | 27 ++-- .../TranscriptionAsyncClient.java | 8 +- .../transcription/TranscriptionClient.java | 4 +- ...operties.java => EnhancedModeOptions.java} | 99 +++++++-------- ...Properties.java => PhraseListOptions.java} | 46 +++---- .../models/TranscribedPhrase.java | 89 +++++++------ .../transcription/models/TranscribedWord.java | 88 ++++++------- ...Content.java => TranscriptionContent.java} | 24 ++-- .../TranscriptionDiarizationOptions.java | 18 +-- .../models/TranscriptionOptions.java | 120 +++++++++--------- .../models/TranscriptionResult.java | 46 +++---- .../src/main/java/module-info.java | 1 + ...eech-transcription_apiview_properties.json | 6 +- ...zure-ai-speech-transcription_metadata.json | 2 +- .../AdvancedTranscriptionSample.java | 14 +- .../AsyncTranscriptionSample.java | 12 +- .../BasicTranscriptionSample.java | 6 +- .../transcription/EnhancedModeSample.java | 57 ++++----- .../transcription/ErrorHandlingSample.java | 14 +- .../speech/transcription/ReadmeSamples.java | 53 ++++---- ...riptionAsyncClientJavaDocCodeSnippets.java | 22 ++-- ...ranscriptionClientJavaDocCodeSnippets.java | 16 +-- .../TranscriptionClientTestBase.java | 16 +-- 23 files changed, 377 insertions(+), 411 deletions(-) rename sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/{EnhancedModeProperties.java => EnhancedModeOptions.java} (55%) rename sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/{PhraseListProperties.java => PhraseListOptions.java} (71%) rename sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/{TranscribeRequestContent.java => TranscriptionContent.java} (83%) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md index 90a7f2adbcb7..38e6da508efc 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md @@ -142,7 +142,7 @@ try { TranscriptionOptions options = new TranscriptionOptions(); // Create transcribe request content - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -150,7 +150,7 @@ try { TranscriptionResult result = client.transcribe(requestContent); // Process results - System.out.println("Duration: " + result.getDurationMilliseconds() + "ms"); + System.out.println("Duration: " + result.getDuration() + "ms"); result.getCombinedPhrases().forEach(phrase -> { System.out.println("Channel " + phrase.getChannel() + ": " + phrase.getText()); }); @@ -172,14 +172,13 @@ AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(au .setFilename("audio.wav"); // Enable enhanced mode for improved transcription quality -EnhancedModeProperties enhancedMode = new EnhancedModeProperties() - .setEnabled(true); +EnhancedModeOptions enhancedMode = new EnhancedModeOptions(); TranscriptionOptions options = new TranscriptionOptions() .setLocales(java.util.Arrays.asList("en-US")) - .setEnhancedMode(enhancedMode); + .setEnhancedModeOptions(enhancedMode); -TranscribeRequestContent requestContent = new TranscribeRequestContent() +TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -197,9 +196,8 @@ AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(au .setFilename("audio.wav"); // Use prompts to guide transcription with domain-specific terminology -EnhancedModeProperties enhancedMode = new EnhancedModeProperties() - .setEnabled(true) - .setPrompt(java.util.Arrays.asList( +EnhancedModeOptions enhancedMode = new EnhancedModeOptions() + .setPrompts(java.util.Arrays.asList( "Medical consultation discussing hypertension and diabetes", "Common medications: metformin, lisinopril, atorvastatin", "Patient symptoms and treatment plan" @@ -207,9 +205,9 @@ EnhancedModeProperties enhancedMode = new EnhancedModeProperties() TranscriptionOptions options = new TranscriptionOptions() .setLocales(java.util.Arrays.asList("en-US")) - .setEnhancedMode(enhancedMode); + .setEnhancedModeOptions(enhancedMode); -TranscribeRequestContent requestContent = new TranscribeRequestContent() +TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -227,15 +225,14 @@ AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(au .setFilename("audio.wav"); // Configure enhanced mode to transcribe Spanish audio and translate to English -EnhancedModeProperties enhancedMode = new EnhancedModeProperties() - .setEnabled(true) +EnhancedModeOptions enhancedMode = new EnhancedModeOptions() .setTargetLanguage("en-US"); // Translate to English TranscriptionOptions options = new TranscriptionOptions() .setLocales(java.util.Arrays.asList("es-ES")) // Source language: Spanish - .setEnhancedMode(enhancedMode); + .setEnhancedModeOptions(enhancedMode); -TranscribeRequestContent requestContent = new TranscribeRequestContent() +TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java index 594ec3799bd2..9b8474be709e 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java @@ -5,7 +5,7 @@ import com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper; import com.azure.ai.speech.transcription.implementation.TranscriptionClientImpl; -import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionResult; import com.azure.core.annotation.Generated; import com.azure.core.annotation.ReturnType; @@ -110,12 +110,8 @@ Mono> transcribeWithResponse(BinaryData body, RequestOption */ @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public Mono transcribe(TranscribeRequestContent body) { + public Mono transcribe(TranscriptionContent body) { // Generated convenience method for transcribeWithResponse - // TODO: TEMPORARY WORKAROUND - Remove this null check when TypeSpec generator is fixed - if (body == null) { - return Mono.error(new NullPointerException("Parameter 'body' is required and cannot be null.")); - } RequestOptions requestOptions = new RequestOptions(); return transcribeWithResponse( new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", body.getOptions()) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java index 1aed5187d941..3dcf92845394 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java @@ -5,7 +5,7 @@ import com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper; import com.azure.ai.speech.transcription.implementation.TranscriptionClientImpl; -import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionResult; import com.azure.core.annotation.Generated; import com.azure.core.annotation.ReturnType; @@ -107,7 +107,7 @@ Response transcribeWithResponse(BinaryData body, RequestOptions requ */ @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public TranscriptionResult transcribe(TranscribeRequestContent body) { + public TranscriptionResult transcribe(TranscriptionContent body) { // Generated convenience method for transcribeWithResponse RequestOptions requestOptions = new RequestOptions(); return transcribeWithResponse( diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeProperties.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java similarity index 55% rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeProperties.java rename to sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java index 349b265387ec..aa680921a5f6 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeProperties.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package com.azure.ai.speech.transcription.models; import com.azure.core.annotation.Fluent; @@ -16,10 +17,10 @@ * Enhanced mode properties for transcription. */ @Fluent -public final class EnhancedModeProperties implements JsonSerializable { - +public final class EnhancedModeOptions implements JsonSerializable { /* - * Enable enhanced mode for transcription. + * Enable enhanced mode for transcription. This is automatically set to true when task, targetLanguage, or prompt + * are specified. */ @Generated private Boolean enabled; @@ -40,18 +41,19 @@ public final class EnhancedModeProperties implements JsonSerializable prompt; + private List prompts; /** - * Creates an instance of EnhancedModeProperties class. + * Creates an instance of EnhancedModeOptions class. */ @Generated - public EnhancedModeProperties() { + public EnhancedModeOptions() { } /** - * Get the enabled property: Enable enhanced mode for transcription. - * + * Get the enabled property: Enable enhanced mode for transcription. This is automatically set to true when task, + * targetLanguage, or prompt are specified. + * * @return the enabled value. */ @Generated @@ -59,21 +61,9 @@ public Boolean isEnabled() { return this.enabled; } - /** - * Set the enabled property: Enable enhanced mode for transcription. - * - * @param enabled the enabled value to set. - * @return the EnhancedModeProperties object itself. - */ - @Generated - public EnhancedModeProperties setEnabled(Boolean enabled) { - this.enabled = enabled; - return this; - } - /** * Get the task property: Task type for enhanced mode. - * + * * @return the task value. */ @Generated @@ -83,19 +73,19 @@ public String getTask() { /** * Set the task property: Task type for enhanced mode. - * + * * @param task the task value to set. - * @return the EnhancedModeProperties object itself. + * @return the EnhancedModeOptions object itself. */ @Generated - public EnhancedModeProperties setTask(String task) { + public EnhancedModeOptions setTask(String task) { this.task = task; return this; } /** * Get the targetLanguage property: Target language for enhanced mode. - * + * * @return the targetLanguage value. */ @Generated @@ -105,35 +95,35 @@ public String getTargetLanguage() { /** * Set the targetLanguage property: Target language for enhanced mode. - * + * * @param targetLanguage the targetLanguage value to set. - * @return the EnhancedModeProperties object itself. + * @return the EnhancedModeOptions object itself. */ @Generated - public EnhancedModeProperties setTargetLanguage(String targetLanguage) { + public EnhancedModeOptions setTargetLanguage(String targetLanguage) { this.targetLanguage = targetLanguage; return this; } /** - * Get the prompt property: A list of user prompts. - * - * @return the prompt value. + * Get the prompts property: A list of user prompts. + * + * @return the prompts value. */ @Generated - public List getPrompt() { - return this.prompt; + public List getPrompts() { + return this.prompts; } /** - * Set the prompt property: A list of user prompts. - * - * @param prompt the prompt value to set. - * @return the EnhancedModeProperties object itself. + * Set the prompts property: A list of user prompts. + * + * @param prompts the prompts value to set. + * @return the EnhancedModeOptions object itself. */ @Generated - public EnhancedModeProperties setPrompt(List prompt) { - this.prompt = prompt; + public EnhancedModeOptions setPrompts(List prompts) { + this.prompts = prompts; return this; } @@ -144,42 +134,43 @@ public EnhancedModeProperties setPrompt(List prompt) { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeBooleanField("enabled", this.enabled); jsonWriter.writeStringField("task", this.task); jsonWriter.writeStringField("targetLanguage", this.targetLanguage); - jsonWriter.writeArrayField("prompt", this.prompt, (writer, element) -> writer.writeString(element)); + jsonWriter.writeArrayField("prompt", this.prompts, (writer, element) -> writer.writeString(element)); return jsonWriter.writeEndObject(); } /** - * Reads an instance of EnhancedModeProperties from the JsonReader. - * + * Reads an instance of EnhancedModeOptions from the JsonReader. + * * @param jsonReader The JsonReader being read. - * @return An instance of EnhancedModeProperties if the JsonReader was pointing to an instance of it, or null if it - * was pointing to JSON null. - * @throws IOException If an error occurs while reading the EnhancedModeProperties. + * @return An instance of EnhancedModeOptions if the JsonReader was pointing to an instance of it, or null if it was + * pointing to JSON null. + * @throws IOException If an error occurs while reading the EnhancedModeOptions. */ @Generated - public static EnhancedModeProperties fromJson(JsonReader jsonReader) throws IOException { + public static EnhancedModeOptions fromJson(JsonReader jsonReader) throws IOException { return jsonReader.readObject(reader -> { - EnhancedModeProperties deserializedEnhancedModeProperties = new EnhancedModeProperties(); + EnhancedModeOptions deserializedEnhancedModeOptions = new EnhancedModeOptions(); while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("enabled".equals(fieldName)) { - deserializedEnhancedModeProperties.enabled = reader.getNullable(JsonReader::getBoolean); + deserializedEnhancedModeOptions.enabled = reader.getNullable(JsonReader::getBoolean); } else if ("task".equals(fieldName)) { - deserializedEnhancedModeProperties.task = reader.getString(); + deserializedEnhancedModeOptions.task = reader.getString(); } else if ("targetLanguage".equals(fieldName)) { - deserializedEnhancedModeProperties.targetLanguage = reader.getString(); + deserializedEnhancedModeOptions.targetLanguage = reader.getString(); } else if ("prompt".equals(fieldName)) { - List prompt = reader.readArray(reader1 -> reader1.getString()); - deserializedEnhancedModeProperties.prompt = prompt; + List prompts = reader.readArray(reader1 -> reader1.getString()); + deserializedEnhancedModeOptions.prompts = prompts; } else { reader.skipChildren(); } } - return deserializedEnhancedModeProperties; + + return deserializedEnhancedModeOptions; }); } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListProperties.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java similarity index 71% rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListProperties.java rename to sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java index 1df7b6fea2e3..e5af91416efe 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListProperties.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package com.azure.ai.speech.transcription.models; import com.azure.core.annotation.Fluent; @@ -16,8 +17,7 @@ * Phrase list properties for transcription. */ @Fluent -public final class PhraseListProperties implements JsonSerializable { - +public final class PhraseListOptions implements JsonSerializable { /* * List of phrases for recognition. */ @@ -31,15 +31,15 @@ public final class PhraseListProperties implements JsonSerializable getPhrases() { /** * Set the phrases property: List of phrases for recognition. - * + * * @param phrases the phrases value to set. - * @return the PhraseListProperties object itself. + * @return the PhraseListOptions object itself. */ @Generated - public PhraseListProperties setPhrases(List phrases) { + public PhraseListOptions setPhrases(List phrases) { this.phrases = phrases; return this; } /** * Get the biasingWeight property: Biasing weight for phrase list (1.0 to 20.0). - * + * * @return the biasingWeight value. */ @Generated @@ -71,12 +71,12 @@ public Double getBiasingWeight() { /** * Set the biasingWeight property: Biasing weight for phrase list (1.0 to 20.0). - * + * * @param biasingWeight the biasingWeight value to set. - * @return the PhraseListProperties object itself. + * @return the PhraseListOptions object itself. */ @Generated - public PhraseListProperties setBiasingWeight(Double biasingWeight) { + public PhraseListOptions setBiasingWeight(Double biasingWeight) { this.biasingWeight = biasingWeight; return this; } @@ -94,30 +94,32 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { } /** - * Reads an instance of PhraseListProperties from the JsonReader. - * + * Reads an instance of PhraseListOptions from the JsonReader. + * * @param jsonReader The JsonReader being read. - * @return An instance of PhraseListProperties if the JsonReader was pointing to an instance of it, or null if it - * was pointing to JSON null. - * @throws IOException If an error occurs while reading the PhraseListProperties. + * @return An instance of PhraseListOptions if the JsonReader was pointing to an instance of it, or null if it was + * pointing to JSON null. + * @throws IOException If an error occurs while reading the PhraseListOptions. */ @Generated - public static PhraseListProperties fromJson(JsonReader jsonReader) throws IOException { + public static PhraseListOptions fromJson(JsonReader jsonReader) throws IOException { return jsonReader.readObject(reader -> { - PhraseListProperties deserializedPhraseListProperties = new PhraseListProperties(); + PhraseListOptions deserializedPhraseListOptions = new PhraseListOptions(); while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); + if ("phrases".equals(fieldName)) { List phrases = reader.readArray(reader1 -> reader1.getString()); - deserializedPhraseListProperties.phrases = phrases; + deserializedPhraseListOptions.phrases = phrases; } else if ("biasingWeight".equals(fieldName)) { - deserializedPhraseListProperties.biasingWeight = reader.getNullable(JsonReader::getDouble); + deserializedPhraseListOptions.biasingWeight = reader.getNullable(JsonReader::getDouble); } else { reader.skipChildren(); } } - return deserializedPhraseListProperties; + + return deserializedPhraseListOptions; }); } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java index 11f18461290c..2e39e17a95f9 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java @@ -31,18 +31,6 @@ public final class TranscribedPhrase implements JsonSerializable { - int offsetMilliseconds = 0; - int durationMilliseconds = 0; + int offset = 0; + int duration = 0; String text = null; double confidence = 0.0; Integer channel = null; @@ -206,9 +174,9 @@ public static TranscribedPhrase fromJson(JsonReader jsonReader) throws IOExcepti String fieldName = reader.getFieldName(); reader.nextToken(); if ("offsetMilliseconds".equals(fieldName)) { - offsetMilliseconds = reader.getInt(); + offset = reader.getInt(); } else if ("durationMilliseconds".equals(fieldName)) { - durationMilliseconds = reader.getInt(); + duration = reader.getInt(); } else if ("text".equals(fieldName)) { text = reader.getString(); } else if ("confidence".equals(fieldName)) { @@ -225,8 +193,7 @@ public static TranscribedPhrase fromJson(JsonReader jsonReader) throws IOExcepti reader.skipChildren(); } } - TranscribedPhrase deserializedTranscribedPhrase - = new TranscribedPhrase(offsetMilliseconds, durationMilliseconds, text, confidence); + TranscribedPhrase deserializedTranscribedPhrase = new TranscribedPhrase(offset, duration, text, confidence); deserializedTranscribedPhrase.channel = channel; deserializedTranscribedPhrase.speaker = speaker; deserializedTranscribedPhrase.words = words; @@ -234,4 +201,36 @@ public static TranscribedPhrase fromJson(JsonReader jsonReader) throws IOExcepti return deserializedTranscribedPhrase; }); } + + /* + * The start offset of the phrase in milliseconds. + */ + @Generated + private final int offset; + + /* + * The duration of the phrase in milliseconds. + */ + @Generated + private final int duration; + + /** + * Get the offset property: The start offset of the phrase in milliseconds. + * + * @return the offset value. + */ + @Generated + public int getOffset() { + return this.offset; + } + + /** + * Get the duration property: The duration of the phrase in milliseconds. + * + * @return the duration value. + */ + @Generated + public int getDuration() { + return this.duration; + } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java index 338fe177011b..f72929408cd4 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java @@ -23,30 +23,18 @@ public final class TranscribedWord implements JsonSerializable @Generated private final String text; - /* - * The start offset of the word in milliseconds. - */ - @Generated - private final int offsetMilliseconds; - - /* - * The duration of the word in milliseconds. - */ - @Generated - private final int durationMilliseconds; - /** * Creates an instance of TranscribedWord class. * * @param text the text value to set. - * @param offsetMilliseconds the offsetMilliseconds value to set. - * @param durationMilliseconds the durationMilliseconds value to set. + * @param offset the offset value to set. + * @param duration the duration value to set. */ @Generated - private TranscribedWord(String text, int offsetMilliseconds, int durationMilliseconds) { + private TranscribedWord(String text, int offset, int duration) { this.text = text; - this.offsetMilliseconds = offsetMilliseconds; - this.durationMilliseconds = durationMilliseconds; + this.offset = offset; + this.duration = duration; } /** @@ -59,26 +47,6 @@ public String getText() { return this.text; } - /** - * Get the offsetMilliseconds property: The start offset of the word in milliseconds. - * - * @return the offsetMilliseconds value. - */ - @Generated - public int getOffsetMilliseconds() { - return this.offsetMilliseconds; - } - - /** - * Get the durationMilliseconds property: The duration of the word in milliseconds. - * - * @return the durationMilliseconds value. - */ - @Generated - public int getDurationMilliseconds() { - return this.durationMilliseconds; - } - /** * {@inheritDoc} */ @@ -87,8 +55,8 @@ public int getDurationMilliseconds() { public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); jsonWriter.writeStringField("text", this.text); - jsonWriter.writeIntField("offsetMilliseconds", this.offsetMilliseconds); - jsonWriter.writeIntField("durationMilliseconds", this.durationMilliseconds); + jsonWriter.writeIntField("offsetMilliseconds", this.offset); + jsonWriter.writeIntField("durationMilliseconds", this.duration); return jsonWriter.writeEndObject(); } @@ -105,22 +73,54 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { public static TranscribedWord fromJson(JsonReader jsonReader) throws IOException { return jsonReader.readObject(reader -> { String text = null; - int offsetMilliseconds = 0; - int durationMilliseconds = 0; + int offset = 0; + int duration = 0; while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); if ("text".equals(fieldName)) { text = reader.getString(); } else if ("offsetMilliseconds".equals(fieldName)) { - offsetMilliseconds = reader.getInt(); + offset = reader.getInt(); } else if ("durationMilliseconds".equals(fieldName)) { - durationMilliseconds = reader.getInt(); + duration = reader.getInt(); } else { reader.skipChildren(); } } - return new TranscribedWord(text, offsetMilliseconds, durationMilliseconds); + return new TranscribedWord(text, offset, duration); }); } + + /* + * The start offset of the word in milliseconds. + */ + @Generated + private final int offset; + + /* + * The duration of the word in milliseconds. + */ + @Generated + private final int duration; + + /** + * Get the offset property: The start offset of the word in milliseconds. + * + * @return the offset value. + */ + @Generated + public int getOffset() { + return this.offset; + } + + /** + * Get the duration property: The duration of the word in milliseconds. + * + * @return the duration value. + */ + @Generated + public int getDuration() { + return this.duration; + } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribeRequestContent.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java similarity index 83% rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribeRequestContent.java rename to sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java index 07eeb4ec2e91..74a5dc411253 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribeRequestContent.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. + package com.azure.ai.speech.transcription.models; import com.azure.core.annotation.Fluent; @@ -10,8 +11,7 @@ * Request model for transcription operation. */ @Fluent -public final class TranscribeRequestContent { - +public final class TranscriptionContent { /* * Metadata for a transcription request. This field contains a JSON-serialized object of type * `TranscriptionOptions`. @@ -27,16 +27,16 @@ public final class TranscribeRequestContent { private AudioFileDetails audio; /** - * Creates an instance of TranscribeRequestContent class. + * Creates an instance of TranscriptionContent class. */ @Generated - public TranscribeRequestContent() { + public TranscriptionContent() { } /** * Get the options property: Metadata for a transcription request. This field contains a JSON-serialized object of * type `TranscriptionOptions`. - * + * * @return the options value. */ @Generated @@ -47,12 +47,12 @@ public TranscriptionOptions getOptions() { /** * Set the options property: Metadata for a transcription request. This field contains a JSON-serialized object of * type `TranscriptionOptions`. - * + * * @param options the options value to set. - * @return the TranscribeRequestContent object itself. + * @return the TranscriptionContent object itself. */ @Generated - public TranscribeRequestContent setOptions(TranscriptionOptions options) { + public TranscriptionContent setOptions(TranscriptionOptions options) { this.options = options; return this; } @@ -60,7 +60,7 @@ public TranscribeRequestContent setOptions(TranscriptionOptions options) { /** * Get the audio property: The content of the audio file to be transcribed. The audio file must be shorter than 2 * hours in audio duration and smaller than 250 MB in size. Optional if audioUrl is provided in the definition. - * + * * @return the audio value. */ @Generated @@ -71,12 +71,12 @@ public AudioFileDetails getAudio() { /** * Set the audio property: The content of the audio file to be transcribed. The audio file must be shorter than 2 * hours in audio duration and smaller than 250 MB in size. Optional if audioUrl is provided in the definition. - * + * * @param audio the audio value to set. - * @return the TranscribeRequestContent object itself. + * @return the TranscriptionContent object itself. */ @Generated - public TranscribeRequestContent setAudio(AudioFileDetails audio) { + public TranscriptionContent setAudio(AudioFileDetails audio) { this.audio = audio; return this; } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java index eae7b66f98a4..0399df8ec03b 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java @@ -18,7 +18,7 @@ public final class TranscriptionDiarizationOptions implements JsonSerializable { /* - * Gets or sets a value indicating whether speaker diarization is enabled. + * Enable speaker diarization. This is automatically set to true when maxSpeakers is specified. */ @Generated private Boolean enabled; @@ -37,7 +37,8 @@ public TranscriptionDiarizationOptions() { } /** - * Get the enabled property: Gets or sets a value indicating whether speaker diarization is enabled. + * Get the enabled property: Enable speaker diarization. This is automatically set to true when maxSpeakers is + * specified. * * @return the enabled value. */ @@ -46,18 +47,6 @@ public Boolean isEnabled() { return this.enabled; } - /** - * Set the enabled property: Gets or sets a value indicating whether speaker diarization is enabled. - * - * @param enabled the enabled value to set. - * @return the TranscriptionDiarizationOptions object itself. - */ - @Generated - public TranscriptionDiarizationOptions setEnabled(Boolean enabled) { - this.enabled = enabled; - return this; - } - /** * Get the maxSpeakers property: Gets or sets a hint for the maximum number of speakers for diarization. Must be * greater than 1 and less than 36. @@ -89,7 +78,6 @@ public TranscriptionDiarizationOptions setMaxSpeakers(Integer maxSpeakers) { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeBooleanField("enabled", this.enabled); jsonWriter.writeNumberField("maxSpeakers", this.maxSpeakers); return jsonWriter.writeEndObject(); } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java index 5fd6d90aec17..d6d05d51f0b7 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java @@ -46,18 +46,6 @@ public final class TranscriptionOptions implements JsonSerializable writer.writeInt(element)); - jsonWriter.writeJsonField("enhancedMode", this.enhancedMode); - jsonWriter.writeJsonField("phraseList", this.phraseList); + jsonWriter.writeJsonField("enhancedMode", this.enhancedModeOptions); + jsonWriter.writeJsonField("phraseList", this.phraseListOptions); return jsonWriter.writeEndObject(); } @@ -255,9 +199,9 @@ public static TranscriptionOptions fromJson(JsonReader jsonReader) throws IOExce List activeChannels = reader.readArray(reader1 -> reader1.getInt()); deserializedTranscriptionOptions.activeChannels = activeChannels; } else if ("enhancedMode".equals(fieldName)) { - deserializedTranscriptionOptions.enhancedMode = EnhancedModeProperties.fromJson(reader); + deserializedTranscriptionOptions.enhancedModeOptions = EnhancedModeOptions.fromJson(reader); } else if ("phraseList".equals(fieldName)) { - deserializedTranscriptionOptions.phraseList = PhraseListProperties.fromJson(reader); + deserializedTranscriptionOptions.phraseListOptions = PhraseListOptions.fromJson(reader); } else { reader.skipChildren(); } @@ -324,4 +268,60 @@ public TranscriptionOptions setActiveChannels(List activeChannels) { this.activeChannels = activeChannels; return this; } + + /* + * Enhanced mode properties. + */ + @Generated + private EnhancedModeOptions enhancedModeOptions; + + /* + * Phrase list properties. + */ + @Generated + private PhraseListOptions phraseListOptions; + + /** + * Get the enhancedModeOptions property: Enhanced mode properties. + * + * @return the enhancedModeOptions value. + */ + @Generated + public EnhancedModeOptions getEnhancedModeOptions() { + return this.enhancedModeOptions; + } + + /** + * Set the enhancedModeOptions property: Enhanced mode properties. + * + * @param enhancedModeOptions the enhancedModeOptions value to set. + * @return the TranscriptionOptions object itself. + */ + @Generated + public TranscriptionOptions setEnhancedModeOptions(EnhancedModeOptions enhancedModeOptions) { + this.enhancedModeOptions = enhancedModeOptions; + return this; + } + + /** + * Get the phraseListOptions property: Phrase list properties. + * + * @return the phraseListOptions value. + */ + @Generated + public PhraseListOptions getPhraseListOptions() { + return this.phraseListOptions; + } + + /** + * Set the phraseListOptions property: Phrase list properties. + * + * @param phraseListOptions the phraseListOptions value to set. + * @return the TranscriptionOptions object itself. + */ + @Generated + public TranscriptionOptions setPhraseListOptions(PhraseListOptions phraseListOptions) { + this.phraseListOptions = phraseListOptions; + return this; + } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java index 8c33f6fee92f..e57419c20a65 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java @@ -18,12 +18,6 @@ @Immutable public final class TranscriptionResult implements JsonSerializable { - /* - * The duration of the audio in milliseconds. - */ - @Generated - private final int durationMilliseconds; - /* * The full transcript for each channel. */ @@ -39,28 +33,18 @@ public final class TranscriptionResult implements JsonSerializable combinedPhrases, + private TranscriptionResult(int duration, List combinedPhrases, List phrases) { - this.durationMilliseconds = durationMilliseconds; + this.duration = duration; this.combinedPhrases = combinedPhrases; this.phrases = phrases; } - /** - * Get the durationMilliseconds property: The duration of the audio in milliseconds. - * - * @return the durationMilliseconds value. - */ - @Generated - public int getDurationMilliseconds() { - return this.durationMilliseconds; - } - /** * Get the combinedPhrases property: The full transcript for each channel. * @@ -88,7 +72,7 @@ public List getPhrases() { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeIntField("durationMilliseconds", this.durationMilliseconds); + jsonWriter.writeIntField("durationMilliseconds", this.duration); jsonWriter.writeArrayField("combinedPhrases", this.combinedPhrases, (writer, element) -> writer.writeJson(element)); jsonWriter.writeArrayField("phrases", this.phrases, (writer, element) -> writer.writeJson(element)); @@ -107,14 +91,14 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { @Generated public static TranscriptionResult fromJson(JsonReader jsonReader) throws IOException { return jsonReader.readObject(reader -> { - int durationMilliseconds = 0; + int duration = 0; List combinedPhrases = null; List phrases = null; while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); if ("durationMilliseconds".equals(fieldName)) { - durationMilliseconds = reader.getInt(); + duration = reader.getInt(); } else if ("combinedPhrases".equals(fieldName)) { combinedPhrases = reader.readArray(reader1 -> ChannelCombinedPhrases.fromJson(reader1)); } else if ("phrases".equals(fieldName)) { @@ -123,7 +107,23 @@ public static TranscriptionResult fromJson(JsonReader jsonReader) throws IOExcep reader.skipChildren(); } } - return new TranscriptionResult(durationMilliseconds, combinedPhrases, phrases); + return new TranscriptionResult(duration, combinedPhrases, phrases); }); } + + /* + * The duration of the audio in milliseconds. + */ + @Generated + private final int duration; + + /** + * Get the duration property: The duration of the audio in milliseconds. + * + * @return the duration value. + */ + @Generated + public int getDuration() { + return this.duration; + } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java index 29f86f2fb127..276e1549c9e8 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java @@ -8,5 +8,6 @@ exports com.azure.ai.speech.transcription; exports com.azure.ai.speech.transcription.models; + opens com.azure.ai.speech.transcription.models to com.azure.core; opens com.azure.ai.speech.transcription.models to com.azure.core, com.fasterxml.jackson.databind; } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json index 46eef16fd976..e70a697123f8 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json @@ -10,12 +10,12 @@ "com.azure.ai.speech.transcription.TranscriptionClientBuilder": "Azure.Ai.Speech.Transcription", "com.azure.ai.speech.transcription.models.AudioFileDetails": null, "com.azure.ai.speech.transcription.models.ChannelCombinedPhrases": "Azure.Ai.Speech.Transcription.ChannelCombinedPhrases", - "com.azure.ai.speech.transcription.models.EnhancedModeProperties": "Azure.Ai.Speech.Transcription.EnhancedModeProperties", - "com.azure.ai.speech.transcription.models.PhraseListProperties": "Azure.Ai.Speech.Transcription.PhraseListProperties", + "com.azure.ai.speech.transcription.models.EnhancedModeOptions": "Azure.Ai.Speech.Transcription.EnhancedModeProperties", + "com.azure.ai.speech.transcription.models.PhraseListOptions": "Azure.Ai.Speech.Transcription.PhraseListProperties", "com.azure.ai.speech.transcription.models.ProfanityFilterMode": "Azure.Ai.Speech.Transcription.ProfanityFilterMode", - "com.azure.ai.speech.transcription.models.TranscribeRequestContent": "Azure.Ai.Speech.Transcription.TranscribeRequestContent", "com.azure.ai.speech.transcription.models.TranscribedPhrase": "Azure.Ai.Speech.Transcription.TranscribedPhrase", "com.azure.ai.speech.transcription.models.TranscribedWord": "Azure.Ai.Speech.Transcription.TranscribedWord", + "com.azure.ai.speech.transcription.models.TranscriptionContent": "Azure.Ai.Speech.Transcription.TranscriptionContent", "com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions": "Azure.Ai.Speech.Transcription.TranscriptionDiarizationOptions", "com.azure.ai.speech.transcription.models.TranscriptionOptions": "Azure.Ai.Speech.Transcription.TranscriptionOptions", "com.azure.ai.speech.transcription.models.TranscriptionResult": "Azure.Ai.Speech.Transcription.TranscriptionResult" diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json index 6ddd770d8525..7ff97cdfa258 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json @@ -1 +1 @@ -{"flavor":"azure","apiVersion":"2025-10-15","crossLanguageDefinitions":{"com.azure.ai.speech.transcription.TranscriptionAsyncClient":"Azure.Ai.Speech.Transcription","com.azure.ai.speech.transcription.TranscriptionAsyncClient.transcribe":"Azure.Ai.Speech.Transcription.transcribe","com.azure.ai.speech.transcription.TranscriptionAsyncClient.transcribeWithResponse":"Azure.Ai.Speech.Transcription.transcribe","com.azure.ai.speech.transcription.TranscriptionClient":"Azure.Ai.Speech.Transcription","com.azure.ai.speech.transcription.TranscriptionClient.transcribe":"Azure.Ai.Speech.Transcription.transcribe","com.azure.ai.speech.transcription.TranscriptionClient.transcribeWithResponse":"Azure.Ai.Speech.Transcription.transcribe","com.azure.ai.speech.transcription.TranscriptionClientBuilder":"Azure.Ai.Speech.Transcription","com.azure.ai.speech.transcription.models.AudioFileDetails":null,"com.azure.ai.speech.transcription.models.ChannelCombinedPhrases":"Azure.Ai.Speech.Transcription.ChannelCombinedPhrases","com.azure.ai.speech.transcription.models.EnhancedModeProperties":"Azure.Ai.Speech.Transcription.EnhancedModeProperties","com.azure.ai.speech.transcription.models.PhraseListProperties":"Azure.Ai.Speech.Transcription.PhraseListProperties","com.azure.ai.speech.transcription.models.ProfanityFilterMode":"Azure.Ai.Speech.Transcription.ProfanityFilterMode","com.azure.ai.speech.transcription.models.TranscribeRequestContent":"Azure.Ai.Speech.Transcription.TranscribeRequestContent","com.azure.ai.speech.transcription.models.TranscribedPhrase":"Azure.Ai.Speech.Transcription.TranscribedPhrase","com.azure.ai.speech.transcription.models.TranscribedWord":"Azure.Ai.Speech.Transcription.TranscribedWord","com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions":"Azure.Ai.Speech.Transcription.TranscriptionDiarizationOptions","com.azure.ai.speech.transcription.models.TranscriptionOptions":"Azure.Ai.Speech.Transcription.TranscriptionOptions","com.azure.ai.speech.transcription.models.TranscriptionResult":"Azure.Ai.Speech.Transcription.TranscriptionResult"},"generatedFiles":["src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java","src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java","src/main/java/com/azure/ai/speech/transcription/TranscriptionClientBuilder.java","src/main/java/com/azure/ai/speech/transcription/TranscriptionServiceVersion.java","src/main/java/com/azure/ai/speech/transcription/implementation/MultipartFormDataHelper.java","src/main/java/com/azure/ai/speech/transcription/implementation/TranscriptionClientImpl.java","src/main/java/com/azure/ai/speech/transcription/implementation/package-info.java","src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java","src/main/java/com/azure/ai/speech/transcription/models/ChannelCombinedPhrases.java","src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeProperties.java","src/main/java/com/azure/ai/speech/transcription/models/PhraseListProperties.java","src/main/java/com/azure/ai/speech/transcription/models/ProfanityFilterMode.java","src/main/java/com/azure/ai/speech/transcription/models/TranscribeRequestContent.java","src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java","src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java","src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java","src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java","src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java","src/main/java/com/azure/ai/speech/transcription/models/package-info.java","src/main/java/com/azure/ai/speech/transcription/package-info.java","src/main/java/module-info.java"]} \ No newline at end of file +{"flavor":"azure","apiVersion":"2025-10-15","crossLanguageDefinitions":{"com.azure.ai.speech.transcription.TranscriptionAsyncClient":"Azure.Ai.Speech.Transcription","com.azure.ai.speech.transcription.TranscriptionAsyncClient.transcribe":"Azure.Ai.Speech.Transcription.transcribe","com.azure.ai.speech.transcription.TranscriptionAsyncClient.transcribeWithResponse":"Azure.Ai.Speech.Transcription.transcribe","com.azure.ai.speech.transcription.TranscriptionClient":"Azure.Ai.Speech.Transcription","com.azure.ai.speech.transcription.TranscriptionClient.transcribe":"Azure.Ai.Speech.Transcription.transcribe","com.azure.ai.speech.transcription.TranscriptionClient.transcribeWithResponse":"Azure.Ai.Speech.Transcription.transcribe","com.azure.ai.speech.transcription.TranscriptionClientBuilder":"Azure.Ai.Speech.Transcription","com.azure.ai.speech.transcription.models.AudioFileDetails":null,"com.azure.ai.speech.transcription.models.ChannelCombinedPhrases":"Azure.Ai.Speech.Transcription.ChannelCombinedPhrases","com.azure.ai.speech.transcription.models.EnhancedModeOptions":"Azure.Ai.Speech.Transcription.EnhancedModeProperties","com.azure.ai.speech.transcription.models.PhraseListOptions":"Azure.Ai.Speech.Transcription.PhraseListProperties","com.azure.ai.speech.transcription.models.ProfanityFilterMode":"Azure.Ai.Speech.Transcription.ProfanityFilterMode","com.azure.ai.speech.transcription.models.TranscribedPhrase":"Azure.Ai.Speech.Transcription.TranscribedPhrase","com.azure.ai.speech.transcription.models.TranscribedWord":"Azure.Ai.Speech.Transcription.TranscribedWord","com.azure.ai.speech.transcription.models.TranscriptionContent":"Azure.Ai.Speech.Transcription.TranscriptionContent","com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions":"Azure.Ai.Speech.Transcription.TranscriptionDiarizationOptions","com.azure.ai.speech.transcription.models.TranscriptionOptions":"Azure.Ai.Speech.Transcription.TranscriptionOptions","com.azure.ai.speech.transcription.models.TranscriptionResult":"Azure.Ai.Speech.Transcription.TranscriptionResult"},"generatedFiles":["src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java","src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java","src/main/java/com/azure/ai/speech/transcription/TranscriptionClientBuilder.java","src/main/java/com/azure/ai/speech/transcription/TranscriptionServiceVersion.java","src/main/java/com/azure/ai/speech/transcription/implementation/MultipartFormDataHelper.java","src/main/java/com/azure/ai/speech/transcription/implementation/TranscriptionClientImpl.java","src/main/java/com/azure/ai/speech/transcription/implementation/package-info.java","src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java","src/main/java/com/azure/ai/speech/transcription/models/ChannelCombinedPhrases.java","src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java","src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java","src/main/java/com/azure/ai/speech/transcription/models/ProfanityFilterMode.java","src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java","src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java","src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java","src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java","src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java","src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java","src/main/java/com/azure/ai/speech/transcription/models/package-info.java","src/main/java/com/azure/ai/speech/transcription/package-info.java","src/main/java/module-info.java"]} \ No newline at end of file diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java index 8954d87fe60b..b33dbc3f8dee 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java @@ -7,7 +7,7 @@ import com.azure.ai.speech.transcription.models.AudioFileDetails; import com.azure.ai.speech.transcription.models.ChannelCombinedPhrases; import com.azure.ai.speech.transcription.models.ProfanityFilterMode; -import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscribedPhrase; import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; import com.azure.ai.speech.transcription.models.TranscriptionOptions; @@ -143,7 +143,7 @@ private static void demonstrateAdvancedTranscriptionOptions(String endpoint, Str .setMaxSpeakers(5)); // Max number of speakers (2-36) // END: com.azure.ai.speech.transcription.advanced.transcription-options - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -156,7 +156,7 @@ private static void demonstrateAdvancedTranscriptionOptions(String endpoint, Str TranscriptionResult result = client.transcribe(requestContent); System.out.println("\n✓ Transcription completed with advanced options"); - System.out.println(" Duration: " + result.getDurationMilliseconds() + " ms\n"); + System.out.println(" Duration: " + result.getDuration() + " ms\n"); } catch (IOException e) { System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); @@ -194,7 +194,7 @@ private static void demonstrateDetailedResultProcessing(String endpoint, String TranscriptionOptions options = new TranscriptionOptions() .setDiarizationOptions(new TranscriptionDiarizationOptions().setEnabled(true)); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -217,8 +217,8 @@ private static void demonstrateDetailedResultProcessing(String endpoint, String for (TranscribedPhrase phrase : result.getPhrases()) { System.out.printf(" Speaker %d (%.2f-%.2fs): %s%n", phrase.getSpeaker() != null ? phrase.getSpeaker() : 0, - phrase.getOffsetMilliseconds() / 1000.0, - (phrase.getOffsetMilliseconds() + phrase.getDurationMilliseconds()) / 1000.0, + phrase.getOffset() / 1000.0, + (phrase.getOffset() + phrase.getDuration()) / 1000.0, phrase.getText()); // Show word-level timings @@ -227,7 +227,7 @@ private static void demonstrateDetailedResultProcessing(String endpoint, String phrase.getWords().forEach(word -> System.out.printf(" - \"%s\" [%.2fs]%n", word.getText(), - word.getOffsetMilliseconds() / 1000.0) + word.getOffset() / 1000.0) ); } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java index d156e3f2d97d..f52117c3ae8a 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java @@ -5,7 +5,7 @@ // BEGIN: com.azure.ai.speech.transcription.async.imports import com.azure.ai.speech.transcription.models.AudioFileDetails; -import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; import com.azure.core.credential.KeyCredential; @@ -98,7 +98,7 @@ private static void demonstrateSubscribePattern(String endpoint, String apiKey) .setFilename(audioFilePath); TranscriptionOptions options = new TranscriptionOptions(); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -119,7 +119,7 @@ private static void demonstrateSubscribePattern(String endpoint, String apiKey) // onNext: Called when result is available result -> { System.out.println("\n✓ Transcription completed!"); - System.out.println(" Duration: " + result.getDurationMilliseconds() + " ms"); + System.out.println(" Duration: " + result.getDuration() + " ms"); if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { result.getCombinedPhrases().forEach(phrase -> System.out.println(" Text: " + phrase.getText()) @@ -171,7 +171,7 @@ private static void demonstrateBlockPattern(String endpoint, String apiKey) { .setFilename(audioFilePath); TranscriptionOptions options = new TranscriptionOptions(); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -185,7 +185,7 @@ private static void demonstrateBlockPattern(String endpoint, String apiKey) { if (result != null) { System.out.println("\n✓ Transcription completed!"); - System.out.println(" Duration: " + result.getDurationMilliseconds() + " ms\n"); + System.out.println(" Duration: " + result.getDuration() + " ms\n"); } } catch (Exception e) { @@ -218,7 +218,7 @@ private static void demonstrateTimeoutAndErrorHandling(String endpoint, String a .setFilename(audioFilePath); TranscriptionOptions options = new TranscriptionOptions(); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java index 901c9ee69bd2..d0aa47a1c84b 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java @@ -5,7 +5,7 @@ // BEGIN: com.azure.ai.speech.transcription.basic.imports import com.azure.ai.speech.transcription.models.AudioFileDetails; -import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; import com.azure.core.credential.KeyCredential; @@ -115,7 +115,7 @@ public static void main(String[] args) { TranscriptionOptions options = new TranscriptionOptions(); // Create the transcribe request - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -129,7 +129,7 @@ public static void main(String[] args) { // Display results System.out.println("\nTranscription Results:"); System.out.println("----------------------"); - System.out.println("Duration: " + result.getDurationMilliseconds() + " ms"); + System.out.println("Duration: " + result.getDuration() + " ms"); if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { System.out.println("\nTranscribed Text:"); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java index 6bb44a60b4f6..33944967c4b4 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java @@ -5,8 +5,8 @@ // BEGIN: com.azure.ai.speech.transcription.enhancedmode.imports import com.azure.ai.speech.transcription.models.AudioFileDetails; -import com.azure.ai.speech.transcription.models.EnhancedModeProperties; -import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.EnhancedModeOptions; +import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; import com.azure.core.credential.KeyCredential; @@ -19,9 +19,9 @@ // END: com.azure.ai.speech.transcription.enhancedmode.imports /** - * Sample demonstrates how to use EnhancedModeProperties to improve transcription quality + * Sample demonstrates how to use EnhancedModeOptions to improve transcription quality * with features like custom prompts, translation, and task-specific configurations. - * + * * This sample shows: * - Enabling enhanced mode for improved transcription accuracy * - Using custom prompts to guide transcription with domain-specific terminology @@ -88,15 +88,14 @@ private static void demonstrateBasicEnhancedMode(String endpoint, String apiKey) // BEGIN: com.azure.ai.speech.transcription.enhancedmode.basic // Enable enhanced mode for improved transcription quality - EnhancedModeProperties enhancedMode = new EnhancedModeProperties() - .setEnabled(true); + EnhancedModeOptions enhancedMode = new EnhancedModeOptions(); TranscriptionOptions options = new TranscriptionOptions() .setLocales(Arrays.asList("en-US")) - .setEnhancedMode(enhancedMode); + .setEnhancedModeOptions(enhancedMode); // END: com.azure.ai.speech.transcription.enhancedmode.basic - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -105,7 +104,7 @@ private static void demonstrateBasicEnhancedMode(String endpoint, String apiKey) TranscriptionResult result = client.transcribe(requestContent); System.out.println("✓ Enhanced mode enabled"); - System.out.println("Duration: " + result.getDurationMilliseconds() + " ms"); + System.out.println("Duration: " + result.getDuration() + " ms"); if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { System.out.println("Transcription: " + result.getCombinedPhrases().get(0).getText()); } @@ -145,9 +144,8 @@ private static void demonstrateEnhancedModeWithPrompts(String endpoint, String a // BEGIN: com.azure.ai.speech.transcription.enhancedmode.prompts // Use prompts to guide transcription with domain-specific terminology - EnhancedModeProperties enhancedMode = new EnhancedModeProperties() - .setEnabled(true) - .setPrompt(Arrays.asList( + EnhancedModeOptions enhancedMode = new EnhancedModeOptions() + .setPrompts(Arrays.asList( "Medical consultation discussing hypertension and diabetes", "Common medications: metformin, lisinopril, atorvastatin", "Patient symptoms and treatment plan" @@ -155,10 +153,10 @@ private static void demonstrateEnhancedModeWithPrompts(String endpoint, String a TranscriptionOptions options = new TranscriptionOptions() .setLocales(Arrays.asList("en-US")) - .setEnhancedMode(enhancedMode); + .setEnhancedModeOptions(enhancedMode); // END: com.azure.ai.speech.transcription.enhancedmode.prompts - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -168,7 +166,7 @@ private static void demonstrateEnhancedModeWithPrompts(String endpoint, String a System.out.println("✓ Enhanced mode with custom prompts"); System.out.println("Prompts used:"); - for (String prompt : enhancedMode.getPrompt()) { + for (String prompt : enhancedMode.getPrompts()) { System.out.println(" - " + prompt); } if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { @@ -210,16 +208,15 @@ private static void demonstrateEnhancedModeWithTranslation(String endpoint, Stri // BEGIN: com.azure.ai.speech.transcription.enhancedmode.translation // Configure enhanced mode to transcribe Spanish audio and translate to English - EnhancedModeProperties enhancedMode = new EnhancedModeProperties() - .setEnabled(true) + EnhancedModeOptions enhancedMode = new EnhancedModeOptions() .setTargetLanguage("en-US"); // Translate to English TranscriptionOptions options = new TranscriptionOptions() .setLocales(Arrays.asList("es-ES")) // Source language: Spanish - .setEnhancedMode(enhancedMode); + .setEnhancedModeOptions(enhancedMode); // END: com.azure.ai.speech.transcription.enhancedmode.translation - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -269,10 +266,9 @@ private static void demonstrateTaskSpecificEnhancedMode(String endpoint, String // BEGIN: com.azure.ai.speech.transcription.enhancedmode.taskspecific // Configure enhanced mode for a specific task type (e.g., meeting transcription) - EnhancedModeProperties enhancedMode = new EnhancedModeProperties() - .setEnabled(true) + EnhancedModeOptions enhancedMode = new EnhancedModeOptions() .setTask("meeting") // Task type: meeting, interview, presentation, etc. - .setPrompt(Arrays.asList( + .setPrompts(Arrays.asList( "Business meeting about Q4 revenue projections", "Participants: CEO, CFO, Sales Director", "Topics: budget, forecasts, market trends" @@ -280,10 +276,10 @@ private static void demonstrateTaskSpecificEnhancedMode(String endpoint, String TranscriptionOptions options = new TranscriptionOptions() .setLocales(Arrays.asList("en-US")) - .setEnhancedMode(enhancedMode); + .setEnhancedModeOptions(enhancedMode); // END: com.azure.ai.speech.transcription.enhancedmode.taskspecific - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -296,8 +292,8 @@ private static void demonstrateTaskSpecificEnhancedMode(String endpoint, String System.out.println("Enabled: " + enhancedMode.isEnabled()); if (result.getPhrases() != null && !result.getPhrases().isEmpty()) { System.out.println("\nTranscription phrases:"); - result.getPhrases().forEach(phrase -> - System.out.println(" [" + phrase.getOffsetMilliseconds() + "ms] " + phrase.getText()) + result.getPhrases().forEach(phrase -> + System.out.println(" [" + phrase.getOffset() + "ms] " + phrase.getText()) ); } System.out.println(); @@ -323,11 +319,10 @@ private static TranscriptionResult transcribeWithFullEnhancedMode( .setFilename(filename); // Configure comprehensive enhanced mode settings - EnhancedModeProperties enhancedMode = new EnhancedModeProperties() - .setEnabled(true) + EnhancedModeOptions enhancedMode = new EnhancedModeOptions() .setTask("interview") .setTargetLanguage("en-US") - .setPrompt(Arrays.asList( + .setPrompts(Arrays.asList( "Technical interview about cloud architecture", "Topics: Azure, microservices, Kubernetes, DevOps", "Key terms: containerization, scalability, CI/CD" @@ -336,10 +331,10 @@ private static TranscriptionResult transcribeWithFullEnhancedMode( // Create transcription options with enhanced mode TranscriptionOptions options = new TranscriptionOptions() .setLocales(Arrays.asList("en-US")) - .setEnhancedMode(enhancedMode); + .setEnhancedModeOptions(enhancedMode); // Create request and transcribe - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java index 40b331f0d945..a6e9b7abfcf5 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java @@ -5,7 +5,7 @@ // BEGIN: com.azure.ai.speech.transcription.error.imports import com.azure.ai.speech.transcription.models.AudioFileDetails; -import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; import com.azure.core.credential.KeyCredential; @@ -79,7 +79,7 @@ private static void demonstrateAuthenticationErrorHandling() { // This will fail with authentication error byte[] dummyAudio = new byte[1024]; AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(dummyAudio)); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(new TranscriptionOptions()); @@ -120,7 +120,7 @@ private static void demonstrateAzureAdAuthenticationErrorHandling() { // Attempt to transcribe (may fail if Azure AD not configured) byte[] dummyAudio = new byte[1024]; AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(dummyAudio)); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(new TranscriptionOptions()); @@ -175,7 +175,7 @@ private static void demonstrateFileErrorHandling() { try { byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(new TranscriptionOptions()); @@ -219,7 +219,7 @@ private static void demonstrateServiceErrorHandling() { byte[] invalidAudio = new byte[10]; // Too small to be valid audio AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(invalidAudio)) .setFilename("invalid.wav"); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(new TranscriptionOptions()); @@ -302,7 +302,7 @@ private static void demonstrateComprehensiveErrorHandling() { AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename(audioFilePath); TranscriptionOptions options = new TranscriptionOptions(); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); System.out.println("✓ Request prepared"); @@ -339,7 +339,7 @@ private static void demonstrateComprehensiveErrorHandling() { // Step 6: Process results if (result != null) { System.out.println("\n✓ Transcription completed successfully!"); - System.out.println(" Duration: " + result.getDurationMilliseconds() + " ms"); + System.out.println(" Duration: " + result.getDuration() + " ms"); if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { System.out.println(" Phrases: " + result.getCombinedPhrases().size()); } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java index d8e9da38380a..f90f9e3bffa4 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java @@ -5,10 +5,10 @@ package com.azure.ai.speech.transcription; import com.azure.ai.speech.transcription.models.AudioFileDetails; -import com.azure.ai.speech.transcription.models.EnhancedModeProperties; +import com.azure.ai.speech.transcription.models.EnhancedModeOptions; import com.azure.ai.speech.transcription.models.ProfanityFilterMode; import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; -import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; import com.azure.core.credential.KeyCredential; @@ -44,7 +44,7 @@ public void readmeSamples() { TranscriptionOptions options = new TranscriptionOptions(); // Create transcribe request content - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -52,7 +52,7 @@ public void readmeSamples() { TranscriptionResult result = client.transcribe(requestContent); // Process results - System.out.println("Duration: " + result.getDurationMilliseconds() + "ms"); + System.out.println("Duration: " + result.getDuration() + "ms"); result.getCombinedPhrases().forEach(phrase -> { System.out.println("Channel " + phrase.getChannel() + ": " + phrase.getText()); }); @@ -103,13 +103,13 @@ public void transcribeAudioSync() throws Exception { TranscriptionOptions options = new TranscriptionOptions(); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); - System.out.println("Duration: " + result.getDurationMilliseconds() + "ms"); + System.out.println("Duration: " + result.getDuration() + "ms"); result.getCombinedPhrases().forEach(phrase -> { System.out.println("Transcription: " + phrase.getText()); }); @@ -133,13 +133,13 @@ public void transcribeAudioAsync() throws Exception { TranscriptionOptions options = new TranscriptionOptions(); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); asyncClient.transcribe(requestContent) .subscribe(result -> { - System.out.println("Duration: " + result.getDurationMilliseconds() + "ms"); + System.out.println("Duration: " + result.getDuration() + "ms"); result.getCombinedPhrases().forEach(phrase -> { System.out.println("Transcription: " + phrase.getText()); }); @@ -170,7 +170,7 @@ public void advancedTranscriptionOptions() throws Exception { .setEnabled(true) .setMaxSpeakers(5)); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -180,7 +180,7 @@ public void advancedTranscriptionOptions() throws Exception { result.getPhrases().forEach(phrase -> { System.out.println("Speaker " + phrase.getSpeaker() + ": " + phrase.getText()); System.out.println("Confidence: " + phrase.getConfidence()); - System.out.println("Offset: " + phrase.getOffsetMilliseconds() + "ms"); + System.out.println("Offset: " + phrase.getOffset() + "ms"); }); // END: com.azure.ai.speech.transcription.transcriptionoptions.advanced } @@ -219,7 +219,7 @@ public void processDetailedResults() throws Exception { byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("audio.wav"); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(new TranscriptionOptions()); @@ -227,7 +227,7 @@ public void processDetailedResults() throws Exception { TranscriptionResult result = client.transcribe(requestContent); // Get overall duration - System.out.println("Total duration: " + result.getDurationMilliseconds() + "ms"); + System.out.println("Total duration: " + result.getDuration() + "ms"); // Process each phrase with detailed information result.getPhrases().forEach(phrase -> { @@ -236,14 +236,14 @@ public void processDetailedResults() throws Exception { System.out.println(" Speaker: " + phrase.getSpeaker()); System.out.println(" Locale: " + phrase.getLocale()); System.out.println(" Confidence: " + phrase.getConfidence()); - System.out.println(" Timing: " + phrase.getOffsetMilliseconds() + "ms - " - + (phrase.getOffsetMilliseconds() + phrase.getDurationMilliseconds()) + "ms"); + System.out.println(" Timing: " + phrase.getOffset() + "ms - " + + (phrase.getOffset() + phrase.getDuration()) + "ms"); // Process individual words with timestamps if (phrase.getWords() != null) { phrase.getWords().forEach(word -> { System.out.println(" Word: " + word.getText() + " @ " - + word.getOffsetMilliseconds() + "ms"); + + word.getOffset() + "ms"); }); } }); @@ -266,14 +266,13 @@ public void enhancedModeBasic() throws Exception { .setFilename("audio.wav"); // Enable enhanced mode for improved transcription quality - EnhancedModeProperties enhancedMode = new EnhancedModeProperties() - .setEnabled(true); + EnhancedModeOptions enhancedMode = new EnhancedModeOptions(); TranscriptionOptions options = new TranscriptionOptions() .setLocales(java.util.Arrays.asList("en-US")) - .setEnhancedMode(enhancedMode); + .setEnhancedModeOptions(enhancedMode); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -297,9 +296,8 @@ public void enhancedModeWithPrompts() throws Exception { .setFilename("audio.wav"); // Use prompts to guide transcription with domain-specific terminology - EnhancedModeProperties enhancedMode = new EnhancedModeProperties() - .setEnabled(true) - .setPrompt(java.util.Arrays.asList( + EnhancedModeOptions enhancedMode = new EnhancedModeOptions() + .setPrompts(java.util.Arrays.asList( "Medical consultation discussing hypertension and diabetes", "Common medications: metformin, lisinopril, atorvastatin", "Patient symptoms and treatment plan" @@ -307,9 +305,9 @@ public void enhancedModeWithPrompts() throws Exception { TranscriptionOptions options = new TranscriptionOptions() .setLocales(java.util.Arrays.asList("en-US")) - .setEnhancedMode(enhancedMode); + .setEnhancedModeOptions(enhancedMode); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -333,15 +331,14 @@ public void enhancedModeWithTranslation() throws Exception { .setFilename("audio.wav"); // Configure enhanced mode to transcribe Spanish audio and translate to English - EnhancedModeProperties enhancedMode = new EnhancedModeProperties() - .setEnabled(true) + EnhancedModeOptions enhancedMode = new EnhancedModeOptions() .setTargetLanguage("en-US"); // Translate to English TranscriptionOptions options = new TranscriptionOptions() .setLocales(java.util.Arrays.asList("es-ES")) // Source language: Spanish - .setEnhancedMode(enhancedMode); + .setEnhancedModeOptions(enhancedMode); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java index c13a8d5625f5..c3d8ee6bc60a 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java @@ -8,7 +8,7 @@ import com.azure.ai.speech.transcription.TranscriptionClientBuilder; import com.azure.ai.speech.transcription.models.AudioFileDetails; import com.azure.ai.speech.transcription.models.ProfanityFilterMode; -import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; @@ -56,7 +56,7 @@ public void transcribeAsyncWithSubscribe() throws Exception { AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("sample.wav"); TranscriptionOptions options = new TranscriptionOptions(); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -67,7 +67,7 @@ public void transcribeAsyncWithSubscribe() throws Exception { .subscribe( // onNext: Process result result -> { - System.out.println("Duration: " + result.getDurationMilliseconds() + " ms"); + System.out.println("Duration: " + result.getDuration() + " ms"); if (result.getCombinedPhrases() != null) { result.getCombinedPhrases().forEach(phrase -> System.out.println("Text: " + phrase.getText()) @@ -101,7 +101,7 @@ public void transcribeAsyncWithBlock() throws Exception { AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("sample.wav"); TranscriptionOptions options = new TranscriptionOptions(); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -110,7 +110,7 @@ public void transcribeAsyncWithBlock() throws Exception { TranscriptionResult result = asyncClient.transcribe(requestContent).block(); if (result != null) { - System.out.println("Duration: " + result.getDurationMilliseconds() + " ms"); + System.out.println("Duration: " + result.getDuration() + " ms"); } // END: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.block } @@ -138,7 +138,7 @@ public void transcribeAsyncWithOptions() throws Exception { .setEnabled(true) .setMaxSpeakers(5)); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -170,7 +170,7 @@ public void transcribeAsyncWithTimeoutAndErrorHandling() throws Exception { AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("sample.wav"); TranscriptionOptions options = new TranscriptionOptions(); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -199,7 +199,7 @@ public void processDetailedAsyncResults() throws Exception { byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); TranscriptionOptions options = new TranscriptionOptions(); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -218,15 +218,15 @@ public void processDetailedAsyncResults() throws Exception { if (result.getPhrases() != null) { result.getPhrases().forEach(phrase -> { System.out.printf("Phrase (%.2f-%.2fs): %s%n", - phrase.getOffsetMilliseconds() / 1000.0, - (phrase.getOffsetMilliseconds() + phrase.getDurationMilliseconds()) / 1000.0, + phrase.getOffset() / 1000.0, + (phrase.getOffset() + phrase.getDuration()) / 1000.0, phrase.getText()); if (phrase.getWords() != null) { phrase.getWords().forEach(word -> System.out.printf(" \"%s\" at %.2fs%n", word.getText(), - word.getOffsetMilliseconds() / 1000.0) + word.getOffset() / 1000.0) ); } }); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java index bc79f1c807fe..1572a98d4b1c 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java @@ -8,7 +8,7 @@ import com.azure.ai.speech.transcription.TranscriptionClientBuilder; import com.azure.ai.speech.transcription.models.AudioFileDetails; import com.azure.ai.speech.transcription.models.ProfanityFilterMode; -import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; @@ -77,7 +77,7 @@ public void transcribeFromFile() throws Exception { TranscriptionOptions options = new TranscriptionOptions(); // Create transcribe request - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -85,7 +85,7 @@ public void transcribeFromFile() throws Exception { TranscriptionResult result = client.transcribe(requestContent); // Process results - System.out.println("Duration: " + result.getDurationMilliseconds() + " ms"); + System.out.println("Duration: " + result.getDuration() + " ms"); result.getCombinedPhrases().forEach(phrase -> { System.out.println("Channel " + phrase.getChannel() + ": " + phrase.getText()); }); @@ -115,7 +115,7 @@ public void transcribeWithOptions() throws Exception { .setEnabled(true) .setMaxSpeakers(5)); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); @@ -143,7 +143,7 @@ public void processDetailedResults() throws Exception { byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); TranscriptionOptions options = new TranscriptionOptions(); - TranscribeRequestContent requestContent = new TranscribeRequestContent() + TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); @@ -161,8 +161,8 @@ public void processDetailedResults() throws Exception { if (result.getPhrases() != null) { result.getPhrases().forEach(phrase -> { System.out.printf("Phrase (%.2f-%.2fs): %s%n", - phrase.getOffsetMilliseconds() / 1000.0, - (phrase.getOffsetMilliseconds() + phrase.getDurationMilliseconds()) / 1000.0, + phrase.getOffset() / 1000.0, + (phrase.getOffset() + phrase.getDuration()) / 1000.0, phrase.getText()); // Get word-level timing information @@ -170,7 +170,7 @@ public void processDetailedResults() throws Exception { phrase.getWords().forEach(word -> { System.out.printf(" Word: \"%s\" at %.2fs%n", word.getText(), - word.getOffsetMilliseconds() / 1000.0); + word.getOffset() / 1000.0); }); } }); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java index d87a7b47dad7..078c0fa06dbb 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java @@ -4,7 +4,7 @@ package com.azure.ai.speech.transcription; import com.azure.ai.speech.transcription.models.AudioFileDetails; -import com.azure.ai.speech.transcription.models.TranscribeRequestContent; +import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; import com.azure.core.credential.KeyCredential; @@ -150,8 +150,8 @@ protected void doTranscription(String testName, Boolean sync, Boolean transcribe AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)).setFilename(new File(audioFilePath).getName()); - TranscribeRequestContent requestContent - = new TranscribeRequestContent().setAudio(audioFileDetails).setOptions(options); + TranscriptionContent requestContent + = new TranscriptionContent().setAudio(audioFileDetails).setOptions(options); if (sync) { TranscriptionResult result = null; @@ -218,7 +218,7 @@ protected void doTranscription(String testName, Boolean sync, Boolean transcribe protected void validateTranscriptionResult(String testName, TranscriptionResult result) { if (printResults) { System.out.println("\n===== Test: " + testName + " ====="); - System.out.println("Duration: " + result.getDurationMilliseconds() + "ms"); + System.out.println("Duration: " + result.getDuration() + "ms"); if (result.getCombinedPhrases() != null) { result.getCombinedPhrases().forEach(phrase -> { System.out.println("Channel " + phrase.getChannel() + ": " + phrase.getText()); @@ -233,8 +233,8 @@ protected void validateTranscriptionResult(String testName, TranscriptionResult // Basic validation assertNotNull(result, "Transcription result should not be null"); - assertNotNull(result.getDurationMilliseconds(), "Duration should not be null"); - assertTrue(result.getDurationMilliseconds() > 0, "Duration should be greater than 0"); + assertNotNull(result.getDuration(), "Duration should not be null"); + assertTrue(result.getDuration() > 0, "Duration should be greater than 0"); assertNotNull(result.getCombinedPhrases(), "Combined phrases should not be null"); assertFalse(result.getCombinedPhrases().isEmpty(), "Combined phrases should not be empty"); assertNotNull(result.getPhrases(), "Phrases should not be null"); @@ -252,8 +252,8 @@ protected void validateTranscriptionResult(String testName, TranscriptionResult assertFalse(phrase.getText().isEmpty(), "Phrase text should not be empty"); assertTrue(phrase.getConfidence() >= 0 && phrase.getConfidence() <= 1, "Confidence should be between 0 and 1"); - assertTrue(phrase.getOffsetMilliseconds() >= 0, "Offset should be non-negative"); - assertTrue(phrase.getDurationMilliseconds() > 0, "Phrase duration should be positive"); + assertTrue(phrase.getOffset() >= 0, "Offset should be non-negative"); + assertTrue(phrase.getDuration() > 0, "Phrase duration should be positive"); }); } From 2f3482db104abf0a4f1cf49bd9e7de46947a09a6 Mon Sep 17 00:00:00 2001 From: wangamber Date: Wed, 5 Nov 2025 16:08:30 -0800 Subject: [PATCH 03/45] refactoring --- eng/versioning/version_client.txt | 1 + .../azure-ai-speech-transcription/pom.xml | 8 ++++---- .../src/main/java/module-info.java | 1 - .../transcription/AdvancedTranscriptionSample.java | 6 ++---- .../com/azure/ai/speech/transcription/ReadmeSamples.java | 1 - .../TranscriptionAsyncClientJavaDocCodeSnippets.java | 4 +--- .../TranscriptionClientJavaDocCodeSnippets.java | 4 +--- .../transcription/TranscriptionAsyncClientTest.java | 9 +++------ .../ai/speech/transcription/TranscriptionClientTest.java | 9 +++------ 9 files changed, 15 insertions(+), 28 deletions(-) diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index 272f49ddc1da..840c715a8127 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -52,6 +52,7 @@ com.azure:azure-ai-openai-realtime;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-openai-stainless;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-personalizer;1.0.0-beta.1;1.0.0-beta.2 com.azure:azure-ai-projects;1.0.0-beta.2;1.0.0-beta.3 +com.azure:azure-ai-speech-transcription;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-textanalytics;5.5.10;5.6.0-beta.1 com.azure:azure-ai-textanalytics-perf;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-translation-text;1.1.6;1.2.0-beta.1 diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml b/sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml index 53fad6f4ded0..99e27017a1a0 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml @@ -48,23 +48,23 @@ Code generated by Microsoft (R) TypeSpec Code Generator. com.azure azure-core - 1.57.0 + 1.56.1 com.azure azure-core-http-netty - 1.16.2 + 1.16.1 com.azure azure-core-test - 1.27.0-beta.13 + 1.27.0-beta.12 test com.azure azure-identity - 1.18.1 + 1.18.0 test diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java index 276e1549c9e8..29f86f2fb127 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java @@ -8,6 +8,5 @@ exports com.azure.ai.speech.transcription; exports com.azure.ai.speech.transcription.models; - opens com.azure.ai.speech.transcription.models to com.azure.core; opens com.azure.ai.speech.transcription.models to com.azure.core, com.fasterxml.jackson.databind; } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java index b33dbc3f8dee..ae615052d3ee 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java @@ -138,9 +138,7 @@ private static void demonstrateAdvancedTranscriptionOptions(String endpoint, Str // Control profanity handling: MASKED, REMOVED, RAW, or TAGS .setProfanityFilterMode(ProfanityFilterMode.MASKED) // Enable speaker diarization to identify different speakers - .setDiarizationOptions(new TranscriptionDiarizationOptions() - .setEnabled(true) - .setMaxSpeakers(5)); // Max number of speakers (2-36) + .setDiarizationOptions(new TranscriptionDiarizationOptions().setMaxSpeakers(5)); // Max number of speakers (2-36) // END: com.azure.ai.speech.transcription.advanced.transcription-options TranscriptionContent requestContent = new TranscriptionContent() @@ -192,7 +190,7 @@ private static void demonstrateDetailedResultProcessing(String endpoint, String // Enable diarization for speaker identification TranscriptionOptions options = new TranscriptionOptions() - .setDiarizationOptions(new TranscriptionDiarizationOptions().setEnabled(true)); + .setDiarizationOptions(new TranscriptionDiarizationOptions()); TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java index f90f9e3bffa4..11019197af1f 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java @@ -167,7 +167,6 @@ public void advancedTranscriptionOptions() throws Exception { .setLocales(java.util.Arrays.asList("en-US", "es-ES")) // Specify candidate locales .setProfanityFilterMode(ProfanityFilterMode.MASKED) // Mask profanity .setDiarizationOptions(new TranscriptionDiarizationOptions() // Enable speaker diarization - .setEnabled(true) .setMaxSpeakers(5)); TranscriptionContent requestContent = new TranscriptionContent() diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java index c3d8ee6bc60a..71d75fd9a68b 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java @@ -134,9 +134,7 @@ public void transcribeAsyncWithOptions() throws Exception { TranscriptionOptions options = new TranscriptionOptions() .setLocales(Arrays.asList("en-US", "es-ES")) .setProfanityFilterMode(ProfanityFilterMode.MASKED) - .setDiarizationOptions(new TranscriptionDiarizationOptions() - .setEnabled(true) - .setMaxSpeakers(5)); + .setDiarizationOptions(new TranscriptionDiarizationOptions().setMaxSpeakers(5)); TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java index 1572a98d4b1c..b4b81c3ac9cf 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java @@ -111,9 +111,7 @@ public void transcribeWithOptions() throws Exception { TranscriptionOptions options = new TranscriptionOptions() .setLocales(Arrays.asList("en-US", "es-ES")) .setProfanityFilterMode(ProfanityFilterMode.MASKED) - .setDiarizationOptions(new TranscriptionDiarizationOptions() - .setEnabled(true) - .setMaxSpeakers(5)); + .setDiarizationOptions(new TranscriptionDiarizationOptions().setMaxSpeakers(5)); TranscriptionContent requestContent = new TranscriptionContent() .setAudio(audioFileDetails) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java index ddebad1d4089..f66080fe246f 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java @@ -70,8 +70,7 @@ public void testTranscribeAsyncWithDiarizationFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionDiarizationOptions diarizationOptions - = new TranscriptionDiarizationOptions().setEnabled(true).setMaxSpeakers(5); + TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions().setMaxSpeakers(5); TranscriptionOptions options = new TranscriptionOptions().setDiarizationOptions(diarizationOptions); @@ -109,8 +108,7 @@ public void testTranscribeAsyncAllOptionsFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionDiarizationOptions diarizationOptions - = new TranscriptionDiarizationOptions().setEnabled(true).setMaxSpeakers(5); + TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions().setMaxSpeakers(5); TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US")) .setDiarizationOptions(diarizationOptions) @@ -141,8 +139,7 @@ public void testTranscribeAsyncWithAllOptionsFromFileWithResponse() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionDiarizationOptions diarizationOptions - = new TranscriptionDiarizationOptions().setEnabled(true).setMaxSpeakers(5); + TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions().setMaxSpeakers(5); TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US", "es-ES")) .setDiarizationOptions(diarizationOptions) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java index 35ee6aa83982..49599f5a792b 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java @@ -70,8 +70,7 @@ public void testTranscribeSyncWithDiarizationFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionDiarizationOptions diarizationOptions - = new TranscriptionDiarizationOptions().setEnabled(true).setMaxSpeakers(5); + TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions().setMaxSpeakers(5); TranscriptionOptions options = new TranscriptionOptions().setDiarizationOptions(diarizationOptions); @@ -109,8 +108,7 @@ public void testTranscribeSyncAllOptionsFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionDiarizationOptions diarizationOptions - = new TranscriptionDiarizationOptions().setEnabled(true).setMaxSpeakers(5); + TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions().setMaxSpeakers(5); TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US")) .setDiarizationOptions(diarizationOptions) @@ -141,8 +139,7 @@ public void testTranscribeSyncWithAllOptionsFromFileWithResponse() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionDiarizationOptions diarizationOptions - = new TranscriptionDiarizationOptions().setEnabled(true).setMaxSpeakers(5); + TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions().setMaxSpeakers(5); TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US", "es-ES")) .setDiarizationOptions(diarizationOptions) From f86ca0de70583c364e884da1ee700d9cea9644a3 Mon Sep 17 00:00:00 2001 From: wangamber Date: Wed, 5 Nov 2025 16:18:05 -0800 Subject: [PATCH 04/45] Updated dependency versions --- eng/versioning/version_client.txt | 3 +-- .../azure-ai-speech-transcription/pom.xml | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index d1debae24e97..87d00fa2c477 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -52,8 +52,7 @@ com.azure:azure-ai-openai-realtime;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-openai-stainless;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-personalizer;1.0.0-beta.1;1.0.0-beta.2 com.azure:azure-ai-projects;1.0.0-beta.2;1.0.0-beta.3 -com.azure:azure-ai-speech-transcription;1.0.0-beta.1;1.0.0-beta.1 -com.azure:azure-ai-textanalytics;5.5.10;5.6.0-beta.1 +com.azure:azure-ai-textanalytics;5.5.11;5.6.0-beta.1 com.azure:azure-ai-textanalytics-perf;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-translation-text;1.1.7;1.2.0-beta.1 com.azure:azure-ai-translation-document;1.0.6;1.1.0-beta.1 diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml b/sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml index 99e27017a1a0..53fad6f4ded0 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml @@ -48,23 +48,23 @@ Code generated by Microsoft (R) TypeSpec Code Generator. com.azure azure-core - 1.56.1 + 1.57.0 com.azure azure-core-http-netty - 1.16.1 + 1.16.2 com.azure azure-core-test - 1.27.0-beta.12 + 1.27.0-beta.13 test com.azure azure-identity - 1.18.0 + 1.18.1 test From aaa54cb99cc30efe988b6f41fab1f5bc072938df Mon Sep 17 00:00:00 2001 From: wangamber Date: Wed, 5 Nov 2025 16:53:18 -0800 Subject: [PATCH 05/45] fix spell check --- eng/versioning/version_client.txt | 1 + .../azure-ai-speech-transcription/.cspell.json | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/.cspell.json diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index 87d00fa2c477..2ea818f70355 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -51,6 +51,7 @@ com.azure:azure-ai-openai-assistants;1.0.0-beta.5;1.0.0-beta.6 com.azure:azure-ai-openai-realtime;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-openai-stainless;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-personalizer;1.0.0-beta.1;1.0.0-beta.2 +com.azure:azure-ai-speech-transcription;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-projects;1.0.0-beta.2;1.0.0-beta.3 com.azure:azure-ai-textanalytics;5.5.11;5.6.0-beta.1 com.azure:azure-ai-textanalytics-perf;1.0.0-beta.1;1.0.0-beta.1 diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/.cspell.json b/sdk/cognitiveservices/azure-ai-speech-transcription/.cspell.json new file mode 100644 index 000000000000..7396678d8be0 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/.cspell.json @@ -0,0 +1,12 @@ +{ + "version": "0.2", + "language": "en", + "words": [ + "Dexec", + "diarization", + "Diarization", + "azuread", + "BYOS" + ], + "ignorePaths": [] +} From 96e67467189c6e0e4db2bff83f8435d41a2c659b Mon Sep 17 00:00:00 2001 From: wangamber Date: Wed, 5 Nov 2025 17:06:28 -0800 Subject: [PATCH 06/45] Add spell check dictionary entries and version configuration --- .vscode/cspell.json | 4 ++++ .../azure-ai-speech-transcription/.cspell.json | 12 ------------ 2 files changed, 4 insertions(+), 12 deletions(-) delete mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/.cspell.json diff --git a/.vscode/cspell.json b/.vscode/cspell.json index 62a33b075301..72c7dc4ea466 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -223,13 +223,17 @@ "autodetection", "awps", "azconfig", + "azuread", "azsdk", "azsynapse", "azurecr", "azurestackhci", "backoff", "boringssl", + "BYOS", "BYOD", + "dexec", + "diarization", "Dgpg", "Dskip", "mvnw", diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/.cspell.json b/sdk/cognitiveservices/azure-ai-speech-transcription/.cspell.json deleted file mode 100644 index 7396678d8be0..000000000000 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/.cspell.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": "0.2", - "language": "en", - "words": [ - "Dexec", - "diarization", - "Diarization", - "azuread", - "BYOS" - ], - "ignorePaths": [] -} From 4fe7b255b6fc36dc7faa847771f70ff2d488e9e4 Mon Sep 17 00:00:00 2001 From: wangamber Date: Thu, 6 Nov 2025 14:12:27 -0800 Subject: [PATCH 07/45] test cusomization --- .../customization/pom.xml | 17 +++++ .../SpeechTranscriptionCustomization.java | 63 +++++++++++++++++++ .../models/EnhancedModeOptions.java | 20 +++--- .../models/PhraseListOptions.java | 14 ++--- .../models/TranscriptionContent.java | 10 +-- .../src/main/java/module-info.java | 1 + .../tsp-location.yaml | 4 ++ 7 files changed, 105 insertions(+), 24 deletions(-) create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/customization/pom.xml create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/pom.xml b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/pom.xml new file mode 100644 index 000000000000..fd0468d4b851 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + + com.azure + azure-code-customization-parent + 1.0.0-beta.1 + ../../../parents/azure-code-customization-parent + + + azure-ai-speech-transcription-customization + 1.0.0-beta.1 + jar + diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java new file mode 100644 index 000000000000..50a8177878cf --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import com.azure.autorest.customization.Customization; +import com.azure.autorest.customization.LibraryCustomization; +import com.azure.autorest.customization.PackageCustomization; +import com.github.javaparser.javadoc.Javadoc; +import org.slf4j.Logger; + +import java.time.Duration; + +import static com.github.javaparser.StaticJavaParser.parseBlock; +import static com.github.javaparser.javadoc.description.JavadocDescription.parseText; + +/** + * Code customization after code generation for Speech Transcription SDK. + */ +public class SpeechTranscriptionCustomization extends Customization { + + /** + * Creates an instance of SpeechTranscriptionCustomization. + */ + public SpeechTranscriptionCustomization() { + } + + @Override + public void customize(LibraryCustomization customization, Logger logger) { + logger.info("Customizing Speech Transcription SDK - changing Duration getters"); + PackageCustomization models = customization.getPackage("com.azure.ai.speech.transcription.models"); + + // Customize TranscriptionResult.getDuration() to return Duration instead of int + logger.info("Customizing TranscriptionResult.getDuration()"); + customizeDurationGetter(models, "TranscriptionResult"); + + // Customize TranscribedPhrase.getDuration() to return Duration instead of int + logger.info("Customizing TranscribedPhrase.getDuration()"); + customizeDurationGetter(models, "TranscribedPhrase"); + + // Customize TranscribedWord.getDuration() to return Duration instead of int + logger.info("Customizing TranscribedWord.getDuration()"); + customizeDurationGetter(models, "TranscribedWord"); + } + + /** + * Customize the getDuration() method to return Duration type instead of int. + * The backing field remains as int (milliseconds), but the getter converts it to Duration. + * + * @param packageCustomization the package customization + * @param className the name of the class to customize + */ + private void customizeDurationGetter(PackageCustomization packageCustomization, String className) { + packageCustomization.getClass(className).customizeAst(ast -> { + ast.addImport("java.time.Duration"); + ast.getClassByName(className) + .ifPresent(clazz -> clazz.getMethodsByName("getDuration").forEach(method -> { + method.setType("Duration") + .setBody(parseBlock("{ return Duration.ofMillis(this.duration); }")) + .setJavadocComment(new Javadoc(parseText("Get the duration property: The duration in milliseconds.")) + .addBlockTag("return", "the duration value as Duration.")); + })); + }); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java index aa680921a5f6..7f0395e4bac8 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.speech.transcription.models; import com.azure.core.annotation.Fluent; @@ -18,6 +17,7 @@ */ @Fluent public final class EnhancedModeOptions implements JsonSerializable { + /* * Enable enhanced mode for transcription. This is automatically set to true when task, targetLanguage, or prompt * are specified. @@ -53,7 +53,7 @@ public EnhancedModeOptions() { /** * Get the enabled property: Enable enhanced mode for transcription. This is automatically set to true when task, * targetLanguage, or prompt are specified. - * + * * @return the enabled value. */ @Generated @@ -63,7 +63,7 @@ public Boolean isEnabled() { /** * Get the task property: Task type for enhanced mode. - * + * * @return the task value. */ @Generated @@ -73,7 +73,7 @@ public String getTask() { /** * Set the task property: Task type for enhanced mode. - * + * * @param task the task value to set. * @return the EnhancedModeOptions object itself. */ @@ -85,7 +85,7 @@ public EnhancedModeOptions setTask(String task) { /** * Get the targetLanguage property: Target language for enhanced mode. - * + * * @return the targetLanguage value. */ @Generated @@ -95,7 +95,7 @@ public String getTargetLanguage() { /** * Set the targetLanguage property: Target language for enhanced mode. - * + * * @param targetLanguage the targetLanguage value to set. * @return the EnhancedModeOptions object itself. */ @@ -107,7 +107,7 @@ public EnhancedModeOptions setTargetLanguage(String targetLanguage) { /** * Get the prompts property: A list of user prompts. - * + * * @return the prompts value. */ @Generated @@ -117,7 +117,7 @@ public List getPrompts() { /** * Set the prompts property: A list of user prompts. - * + * * @param prompts the prompts value to set. * @return the EnhancedModeOptions object itself. */ @@ -142,7 +142,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of EnhancedModeOptions from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of EnhancedModeOptions if the JsonReader was pointing to an instance of it, or null if it was * pointing to JSON null. @@ -155,7 +155,6 @@ public static EnhancedModeOptions fromJson(JsonReader jsonReader) throws IOExcep while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); - if ("enabled".equals(fieldName)) { deserializedEnhancedModeOptions.enabled = reader.getNullable(JsonReader::getBoolean); } else if ("task".equals(fieldName)) { @@ -169,7 +168,6 @@ public static EnhancedModeOptions fromJson(JsonReader jsonReader) throws IOExcep reader.skipChildren(); } } - return deserializedEnhancedModeOptions; }); } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java index e5af91416efe..e269745eaf87 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.speech.transcription.models; import com.azure.core.annotation.Fluent; @@ -18,6 +17,7 @@ */ @Fluent public final class PhraseListOptions implements JsonSerializable { + /* * List of phrases for recognition. */ @@ -39,7 +39,7 @@ public PhraseListOptions() { /** * Get the phrases property: List of phrases for recognition. - * + * * @return the phrases value. */ @Generated @@ -49,7 +49,7 @@ public List getPhrases() { /** * Set the phrases property: List of phrases for recognition. - * + * * @param phrases the phrases value to set. * @return the PhraseListOptions object itself. */ @@ -61,7 +61,7 @@ public PhraseListOptions setPhrases(List phrases) { /** * Get the biasingWeight property: Biasing weight for phrase list (1.0 to 20.0). - * + * * @return the biasingWeight value. */ @Generated @@ -71,7 +71,7 @@ public Double getBiasingWeight() { /** * Set the biasingWeight property: Biasing weight for phrase list (1.0 to 20.0). - * + * * @param biasingWeight the biasingWeight value to set. * @return the PhraseListOptions object itself. */ @@ -95,7 +95,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { /** * Reads an instance of PhraseListOptions from the JsonReader. - * + * * @param jsonReader The JsonReader being read. * @return An instance of PhraseListOptions if the JsonReader was pointing to an instance of it, or null if it was * pointing to JSON null. @@ -108,7 +108,6 @@ public static PhraseListOptions fromJson(JsonReader jsonReader) throws IOExcepti while (reader.nextToken() != JsonToken.END_OBJECT) { String fieldName = reader.getFieldName(); reader.nextToken(); - if ("phrases".equals(fieldName)) { List phrases = reader.readArray(reader1 -> reader1.getString()); deserializedPhraseListOptions.phrases = phrases; @@ -118,7 +117,6 @@ public static PhraseListOptions fromJson(JsonReader jsonReader) throws IOExcepti reader.skipChildren(); } } - return deserializedPhraseListOptions; }); } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java index 74a5dc411253..e7b4a58a68de 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.speech.transcription.models; import com.azure.core.annotation.Fluent; @@ -12,6 +11,7 @@ */ @Fluent public final class TranscriptionContent { + /* * Metadata for a transcription request. This field contains a JSON-serialized object of type * `TranscriptionOptions`. @@ -36,7 +36,7 @@ public TranscriptionContent() { /** * Get the options property: Metadata for a transcription request. This field contains a JSON-serialized object of * type `TranscriptionOptions`. - * + * * @return the options value. */ @Generated @@ -47,7 +47,7 @@ public TranscriptionOptions getOptions() { /** * Set the options property: Metadata for a transcription request. This field contains a JSON-serialized object of * type `TranscriptionOptions`. - * + * * @param options the options value to set. * @return the TranscriptionContent object itself. */ @@ -60,7 +60,7 @@ public TranscriptionContent setOptions(TranscriptionOptions options) { /** * Get the audio property: The content of the audio file to be transcribed. The audio file must be shorter than 2 * hours in audio duration and smaller than 250 MB in size. Optional if audioUrl is provided in the definition. - * + * * @return the audio value. */ @Generated @@ -71,7 +71,7 @@ public AudioFileDetails getAudio() { /** * Set the audio property: The content of the audio file to be transcribed. The audio file must be shorter than 2 * hours in audio duration and smaller than 250 MB in size. Optional if audioUrl is provided in the definition. - * + * * @param audio the audio value to set. * @return the TranscriptionContent object itself. */ diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java index 29f86f2fb127..276e1549c9e8 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java @@ -8,5 +8,6 @@ exports com.azure.ai.speech.transcription; exports com.azure.ai.speech.transcription.models; + opens com.azure.ai.speech.transcription.models to com.azure.core; opens com.azure.ai.speech.transcription.models to com.azure.core, com.fasterxml.jackson.databind; } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml b/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml new file mode 100644 index 000000000000..f7dafe8d2abf --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml @@ -0,0 +1,4 @@ +directory: specification/cognitiveservices/Speech.Transcription +commit: 52b19e818c994198014b990288ad899b13551afb +repo: Azure/azure-rest-api-specs +additionalDirectories: From db7e5f402c8303377c760c3817d5d13a1fa7e848 Mon Sep 17 00:00:00 2001 From: wangamber Date: Thu, 6 Nov 2025 15:23:05 -0800 Subject: [PATCH 08/45] renamed setmodels to clarify --- .../models/TranscriptionOptions.java | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java index d6d05d51f0b7..4230b7644a66 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java @@ -33,13 +33,6 @@ public final class TranscriptionOptions implements JsonSerializable locales; - /* - * Maps some or all candidate locales to a model URI to be used for transcription. If no mapping is given, the - * default model for the locale is used. - */ - @Generated - private Map models; - /* * Mode of profanity filtering. */ @@ -101,30 +94,6 @@ public TranscriptionOptions setLocales(List locales) { return this; } - /** - * Get the models property: Maps some or all candidate locales to a model URI to be used for transcription. If no - * mapping is given, the default model for the locale is used. - * - * @return the models value. - */ - @Generated - public Map getModels() { - return this.models; - } - - /** - * Set the models property: Maps some or all candidate locales to a model URI to be used for transcription. If no - * mapping is given, the default model for the locale is used. - * - * @param models the models value to set. - * @return the TranscriptionOptions object itself. - */ - @Generated - public TranscriptionOptions setModels(Map models) { - this.models = models; - return this; - } - /** * Get the profanityFilterMode property: Mode of profanity filtering. * @@ -156,7 +125,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); jsonWriter.writeStringField("audioUrl", this.audioUrl); jsonWriter.writeArrayField("locales", this.locales, (writer, element) -> writer.writeString(element)); - jsonWriter.writeMapField("models", this.models, (writer, element) -> writer.writeString(element)); + jsonWriter.writeMapField("models", this.localeModelMapping, (writer, element) -> writer.writeString(element)); jsonWriter.writeStringField("profanityFilterMode", this.profanityFilterMode == null ? null : this.profanityFilterMode.toString()); jsonWriter.writeJsonField("diarization", this.diarizationOptions); @@ -187,8 +156,8 @@ public static TranscriptionOptions fromJson(JsonReader jsonReader) throws IOExce List locales = reader.readArray(reader1 -> reader1.getString()); deserializedTranscriptionOptions.locales = locales; } else if ("models".equals(fieldName)) { - Map models = reader.readMap(reader1 -> reader1.getString()); - deserializedTranscriptionOptions.models = models; + Map localeModelMapping = reader.readMap(reader1 -> reader1.getString()); + deserializedTranscriptionOptions.localeModelMapping = localeModelMapping; } else if ("profanityFilterMode".equals(fieldName)) { deserializedTranscriptionOptions.profanityFilterMode = ProfanityFilterMode.fromString(reader.getString()); @@ -324,4 +293,35 @@ public TranscriptionOptions setPhraseListOptions(PhraseListOptions phraseListOpt this.phraseListOptions = phraseListOptions; return this; } + + /* + * Maps some or all candidate locales to a model URI to be used for transcription. If no mapping is given, the + * default model for the locale is used. + */ + @Generated + private Map localeModelMapping; + + /** + * Get the localeModelMapping property: Maps some or all candidate locales to a model URI to be used for + * transcription. If no mapping is given, the default model for the locale is used. + * + * @return the localeModelMapping value. + */ + @Generated + public Map getLocaleModelMapping() { + return this.localeModelMapping; + } + + /** + * Set the localeModelMapping property: Maps some or all candidate locales to a model URI to be used for + * transcription. If no mapping is given, the default model for the locale is used. + * + * @param localeModelMapping the localeModelMapping value to set. + * @return the TranscriptionOptions object itself. + */ + @Generated + public TranscriptionOptions setLocaleModelMapping(Map localeModelMapping) { + this.localeModelMapping = localeModelMapping; + return this; + } } From 5e910a9bdb575abf147fe97f3dbab34cc0a94f06 Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 7 Nov 2025 11:33:10 -0800 Subject: [PATCH 09/45] map from int to duration --- .../customization/pom.xml | 31 +++++++++++++++++++ .../SpeechTranscriptionCustomization.java | 12 +++---- .../models/TranscribedPhrase.java | 9 +++--- .../transcription/models/TranscribedWord.java | 9 +++--- .../models/TranscriptionResult.java | 9 +++--- .../tsp-location.yaml | 2 +- 6 files changed, 53 insertions(+), 19 deletions(-) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/pom.xml b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/pom.xml index fd0468d4b851..3c3058bef116 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/pom.xml +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/pom.xml @@ -14,4 +14,35 @@ azure-ai-speech-transcription-customization 1.0.0-beta.1 jar + + + + ../../../.. + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + + + copy + none + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + attach-artifacts + none + + + + + diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java index 50a8177878cf..ec007137d14f 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java @@ -51,13 +51,13 @@ public void customize(LibraryCustomization customization, Logger logger) { private void customizeDurationGetter(PackageCustomization packageCustomization, String className) { packageCustomization.getClass(className).customizeAst(ast -> { ast.addImport("java.time.Duration"); - ast.getClassByName(className) - .ifPresent(clazz -> clazz.getMethodsByName("getDuration").forEach(method -> { - method.setType("Duration") - .setBody(parseBlock("{ return Duration.ofMillis(this.duration); }")) - .setJavadocComment(new Javadoc(parseText("Get the duration property: The duration in milliseconds.")) + ast.getClassByName(className).ifPresent(clazz -> clazz.getMethodsByName("getDuration").forEach(method -> { + method.setType("Duration") + .setBody(parseBlock("{ return Duration.ofMillis(this.duration); }")) + .setJavadocComment( + new Javadoc(parseText("Get the duration property: The duration in milliseconds.")) .addBlockTag("return", "the duration value as Duration.")); - })); + })); }); } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java index 2e39e17a95f9..56ebb70f80d1 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java @@ -10,6 +10,7 @@ import com.azure.json.JsonToken; import com.azure.json.JsonWriter; import java.io.IOException; +import java.time.Duration; import java.util.List; /** @@ -225,12 +226,12 @@ public int getOffset() { } /** - * Get the duration property: The duration of the phrase in milliseconds. + * Get the duration property: The duration in milliseconds. * - * @return the duration value. + * @return the duration value as Duration. */ @Generated - public int getDuration() { - return this.duration; + public Duration getDuration() { + return Duration.ofMillis(this.duration); } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java index f72929408cd4..c6dbdcac06d7 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java @@ -10,6 +10,7 @@ import com.azure.json.JsonToken; import com.azure.json.JsonWriter; import java.io.IOException; +import java.time.Duration; /** * Time-stamped word in the display form. @@ -115,12 +116,12 @@ public int getOffset() { } /** - * Get the duration property: The duration of the word in milliseconds. + * Get the duration property: The duration in milliseconds. * - * @return the duration value. + * @return the duration value as Duration. */ @Generated - public int getDuration() { - return this.duration; + public Duration getDuration() { + return Duration.ofMillis(this.duration); } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java index e57419c20a65..c3d871984935 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java @@ -10,6 +10,7 @@ import com.azure.json.JsonToken; import com.azure.json.JsonWriter; import java.io.IOException; +import java.time.Duration; import java.util.List; /** @@ -118,12 +119,12 @@ public static TranscriptionResult fromJson(JsonReader jsonReader) throws IOExcep private final int duration; /** - * Get the duration property: The duration of the audio in milliseconds. + * Get the duration property: The duration in milliseconds. * - * @return the duration value. + * @return the duration value as Duration. */ @Generated - public int getDuration() { - return this.duration; + public Duration getDuration() { + return Duration.ofMillis(this.duration); } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml b/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml index f7dafe8d2abf..662e98387bc9 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml @@ -1,4 +1,4 @@ directory: specification/cognitiveservices/Speech.Transcription -commit: 52b19e818c994198014b990288ad899b13551afb +commit: 8d0f5874791340795bf703782e906786063d79d1 repo: Azure/azure-rest-api-specs additionalDirectories: From 6ce612810152e44bc34475edd1c7a59fd202f0af Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 7 Nov 2025 15:05:42 -0800 Subject: [PATCH 10/45] add ci and pom.xml and retest customization --- .../src/main/java/module-info.java | 1 - .../speech/transcription/AdvancedTranscriptionSample.java | 2 +- .../com/azure/ai/speech/transcription/ReadmeSamples.java | 2 +- .../TranscriptionAsyncClientJavaDocCodeSnippets.java | 2 +- .../TranscriptionClientJavaDocCodeSnippets.java | 2 +- .../speech/transcription/TranscriptionClientTestBase.java | 4 ++-- sdk/cognitiveservices/ci.yml | 7 +++++++ sdk/cognitiveservices/pom.xml | 1 + 8 files changed, 14 insertions(+), 7 deletions(-) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java index 276e1549c9e8..434a8672d9f3 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java @@ -9,5 +9,4 @@ exports com.azure.ai.speech.transcription.models; opens com.azure.ai.speech.transcription.models to com.azure.core; - opens com.azure.ai.speech.transcription.models to com.azure.core, com.fasterxml.jackson.databind; } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java index ae615052d3ee..84a9a99c0fa6 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java @@ -216,7 +216,7 @@ private static void demonstrateDetailedResultProcessing(String endpoint, String System.out.printf(" Speaker %d (%.2f-%.2fs): %s%n", phrase.getSpeaker() != null ? phrase.getSpeaker() : 0, phrase.getOffset() / 1000.0, - (phrase.getOffset() + phrase.getDuration()) / 1000.0, + (phrase.getOffset() + phrase.getDuration().toMillis()) / 1000.0, phrase.getText()); // Show word-level timings diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java index 11019197af1f..5d5031625a16 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java @@ -236,7 +236,7 @@ public void processDetailedResults() throws Exception { System.out.println(" Locale: " + phrase.getLocale()); System.out.println(" Confidence: " + phrase.getConfidence()); System.out.println(" Timing: " + phrase.getOffset() + "ms - " - + (phrase.getOffset() + phrase.getDuration()) + "ms"); + + (phrase.getOffset() + phrase.getDuration().toMillis()) + "ms"); // Process individual words with timestamps if (phrase.getWords() != null) { diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java index 71d75fd9a68b..82a06a1dc09e 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java @@ -217,7 +217,7 @@ public void processDetailedAsyncResults() throws Exception { result.getPhrases().forEach(phrase -> { System.out.printf("Phrase (%.2f-%.2fs): %s%n", phrase.getOffset() / 1000.0, - (phrase.getOffset() + phrase.getDuration()) / 1000.0, + (phrase.getOffset() + phrase.getDuration().toMillis()) / 1000.0, phrase.getText()); if (phrase.getWords() != null) { diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java index b4b81c3ac9cf..3a1b971d1180 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java @@ -160,7 +160,7 @@ public void processDetailedResults() throws Exception { result.getPhrases().forEach(phrase -> { System.out.printf("Phrase (%.2f-%.2fs): %s%n", phrase.getOffset() / 1000.0, - (phrase.getOffset() + phrase.getDuration()) / 1000.0, + (phrase.getOffset() + phrase.getDuration().toMillis()) / 1000.0, phrase.getText()); // Get word-level timing information diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java index 078c0fa06dbb..d949a221e3b9 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java @@ -234,7 +234,7 @@ protected void validateTranscriptionResult(String testName, TranscriptionResult // Basic validation assertNotNull(result, "Transcription result should not be null"); assertNotNull(result.getDuration(), "Duration should not be null"); - assertTrue(result.getDuration() > 0, "Duration should be greater than 0"); + assertTrue(result.getDuration().toMillis() > 0, "Duration should be greater than 0"); assertNotNull(result.getCombinedPhrases(), "Combined phrases should not be null"); assertFalse(result.getCombinedPhrases().isEmpty(), "Combined phrases should not be empty"); assertNotNull(result.getPhrases(), "Phrases should not be null"); @@ -253,7 +253,7 @@ protected void validateTranscriptionResult(String testName, TranscriptionResult assertTrue(phrase.getConfidence() >= 0 && phrase.getConfidence() <= 1, "Confidence should be between 0 and 1"); assertTrue(phrase.getOffset() >= 0, "Offset should be non-negative"); - assertTrue(phrase.getDuration() > 0, "Phrase duration should be positive"); + assertTrue(phrase.getDuration().toMillis() > 0, "Phrase duration should be positive"); }); } diff --git a/sdk/cognitiveservices/ci.yml b/sdk/cognitiveservices/ci.yml index d940170ac575..c03a43a3881f 100644 --- a/sdk/cognitiveservices/ci.yml +++ b/sdk/cognitiveservices/ci.yml @@ -9,9 +9,11 @@ trigger: paths: include: - sdk/cognitiveservices/ci.yml + - sdk/cognitiveservices/azure-ai-speech-transcription/ - sdk/cognitiveservices/azure-resourcemanager-cognitiveservices/ exclude: - sdk/cognitiveservices/pom.xml + - sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml - sdk/cognitiveservices/azure-resourcemanager-cognitiveservices/pom.xml pr: branches: @@ -23,9 +25,11 @@ pr: paths: include: - sdk/cognitiveservices/ci.yml + - sdk/cognitiveservices/azure-ai-speech-transcription/ - sdk/cognitiveservices/azure-resourcemanager-cognitiveservices/ exclude: - sdk/cognitiveservices/pom.xml + - sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml - sdk/cognitiveservices/azure-resourcemanager-cognitiveservices/pom.xml extends: @@ -33,6 +37,9 @@ extends: parameters: ServiceDirectory: cognitiveservices Artifacts: + - name: azure-ai-speech-transcription + groupId: com.azure + safeName: azureaispeechtranscription - name: azure-resourcemanager-cognitiveservices groupId: com.azure.resourcemanager safeName: azureresourcemanagercognitiveservices diff --git a/sdk/cognitiveservices/pom.xml b/sdk/cognitiveservices/pom.xml index 1b7f5b7fe73e..f97294ff6d90 100644 --- a/sdk/cognitiveservices/pom.xml +++ b/sdk/cognitiveservices/pom.xml @@ -10,6 +10,7 @@ 1.0.0 + azure-ai-speech-transcription azure-resourcemanager-cognitiveservices From 61cd3c318ad4d439872cd8a49dc312068f0ea845 Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 7 Nov 2025 15:48:33 -0800 Subject: [PATCH 11/45] fix enable field --- .../SpeechTranscriptionCustomization.java | 20 +++++++++++++++++++ .../TranscriptionDiarizationOptions.java | 5 ++++- .../TranscriptionAsyncClientTest.java | 14 ------------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java index ec007137d14f..319c860790c6 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java @@ -39,6 +39,10 @@ public void customize(LibraryCustomization customization, Logger logger) { // Customize TranscribedWord.getDuration() to return Duration instead of int logger.info("Customizing TranscribedWord.getDuration()"); customizeDurationGetter(models, "TranscribedWord"); + + // Customize TranscriptionDiarizationOptions to properly serialize enabled field + logger.info("Customizing TranscriptionDiarizationOptions.toJson()"); + customizeDiarizationOptionsToJson(models); } /** @@ -60,4 +64,20 @@ private void customizeDurationGetter(PackageCustomization packageCustomization, })); }); } + + /** + * Customize the TranscriptionDiarizationOptions.toJson() method to properly serialize the enabled field. + * When maxSpeakers is set, enabled should be automatically set to true and serialized. + * + * @param packageCustomization the package customization + */ + private void customizeDiarizationOptionsToJson(PackageCustomization packageCustomization) { + packageCustomization.getClass("TranscriptionDiarizationOptions").customizeAst(ast -> { + ast.getClassByName("TranscriptionDiarizationOptions") + .ifPresent(clazz -> clazz.getMethodsByName("toJson").forEach(method -> { + method.setBody(parseBlock( + "{ jsonWriter.writeStartObject(); if (this.maxSpeakers != null) { jsonWriter.writeBooleanField(\"enabled\", true); jsonWriter.writeNumberField(\"maxSpeakers\", this.maxSpeakers); } return jsonWriter.writeEndObject(); }")); + })); + }); + } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java index 0399df8ec03b..831c546c31ed 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java @@ -78,7 +78,10 @@ public TranscriptionDiarizationOptions setMaxSpeakers(Integer maxSpeakers) { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeNumberField("maxSpeakers", this.maxSpeakers); + if (this.maxSpeakers != null) { + jsonWriter.writeBooleanField("enabled", true); + jsonWriter.writeNumberField("maxSpeakers", this.maxSpeakers); + } return jsonWriter.writeEndObject(); } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java index f66080fe246f..87eb58a660a7 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java @@ -214,20 +214,6 @@ public void testTranscribeAsyncWithProfanityModeTags() { * ***********************************************************************************/ - // Note: This test now passes due to temporary workaround in generated code. - // The null check was manually added to TranscriptionAsyncClient.transcribe() - // and should be removed when the TypeSpec generator is fixed to include parameter validation. - @Test - public void testTranscribeAsyncWithNullRequestContent() { - createClient(true, true, sync); - - // Test that null request content results in error - // Using StepVerifier to verify error behavior in async context - StepVerifier.create(getAsyncClient().transcribe(null)) - .expectError(NullPointerException.class) - .verify(Duration.ofSeconds(5)); - } - @Test public void testTranscribeAsyncWithEmptyAudioData() { createClient(true, true, sync); From 53bacf25b3fdbcb89b8af8e108c2192c2f5497f9 Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 7 Nov 2025 15:48:33 -0800 Subject: [PATCH 12/45] fix enable field --- .../SpeechTranscriptionCustomization.java | 20 +++++++++++++++++++ .../TranscriptionDiarizationOptions.java | 5 ++++- .../TranscriptionAsyncClientTest.java | 16 --------------- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java index ec007137d14f..319c860790c6 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java @@ -39,6 +39,10 @@ public void customize(LibraryCustomization customization, Logger logger) { // Customize TranscribedWord.getDuration() to return Duration instead of int logger.info("Customizing TranscribedWord.getDuration()"); customizeDurationGetter(models, "TranscribedWord"); + + // Customize TranscriptionDiarizationOptions to properly serialize enabled field + logger.info("Customizing TranscriptionDiarizationOptions.toJson()"); + customizeDiarizationOptionsToJson(models); } /** @@ -60,4 +64,20 @@ private void customizeDurationGetter(PackageCustomization packageCustomization, })); }); } + + /** + * Customize the TranscriptionDiarizationOptions.toJson() method to properly serialize the enabled field. + * When maxSpeakers is set, enabled should be automatically set to true and serialized. + * + * @param packageCustomization the package customization + */ + private void customizeDiarizationOptionsToJson(PackageCustomization packageCustomization) { + packageCustomization.getClass("TranscriptionDiarizationOptions").customizeAst(ast -> { + ast.getClassByName("TranscriptionDiarizationOptions") + .ifPresent(clazz -> clazz.getMethodsByName("toJson").forEach(method -> { + method.setBody(parseBlock( + "{ jsonWriter.writeStartObject(); if (this.maxSpeakers != null) { jsonWriter.writeBooleanField(\"enabled\", true); jsonWriter.writeNumberField(\"maxSpeakers\", this.maxSpeakers); } return jsonWriter.writeEndObject(); }")); + })); + }); + } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java index 0399df8ec03b..831c546c31ed 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java @@ -78,7 +78,10 @@ public TranscriptionDiarizationOptions setMaxSpeakers(Integer maxSpeakers) { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeNumberField("maxSpeakers", this.maxSpeakers); + if (this.maxSpeakers != null) { + jsonWriter.writeBooleanField("enabled", true); + jsonWriter.writeNumberField("maxSpeakers", this.maxSpeakers); + } return jsonWriter.writeEndObject(); } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java index f66080fe246f..0ea10430f0ec 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java @@ -9,9 +9,7 @@ import com.azure.core.http.HttpHeaderName; import com.azure.core.http.rest.RequestOptions; import org.junit.jupiter.api.Test; -import reactor.test.StepVerifier; -import java.time.Duration; import java.util.Arrays; /** @@ -214,20 +212,6 @@ public void testTranscribeAsyncWithProfanityModeTags() { * ***********************************************************************************/ - // Note: This test now passes due to temporary workaround in generated code. - // The null check was manually added to TranscriptionAsyncClient.transcribe() - // and should be removed when the TypeSpec generator is fixed to include parameter validation. - @Test - public void testTranscribeAsyncWithNullRequestContent() { - createClient(true, true, sync); - - // Test that null request content results in error - // Using StepVerifier to verify error behavior in async context - StepVerifier.create(getAsyncClient().transcribe(null)) - .expectError(NullPointerException.class) - .verify(Duration.ofSeconds(5)); - } - @Test public void testTranscribeAsyncWithEmptyAudioData() { createClient(true, true, sync); From 4650f87e928f374fcf90722e1431136f8b4842ce Mon Sep 17 00:00:00 2001 From: wangamber Date: Wed, 12 Nov 2025 16:16:31 -0800 Subject: [PATCH 13/45] move AudioFileDetails into TranscriptionOptions and add 2 constructor overloads --- .../azure-ai-speech-transcription/README.md | 72 ++++++++++-- .../SpeechTranscriptionCustomization.java | 110 ++++++++++++++++++ .../models/TranscriptionOptions.java | 50 +++++--- .../AdvancedTranscriptionSample.java | 6 +- .../AsyncTranscriptionSample.java | 12 +- .../BasicTranscriptionSample.java | 9 +- .../transcription/EnhancedModeSample.java | 15 +-- .../transcription/ErrorHandlingSample.java | 15 +-- .../speech/transcription/ReadmeSamples.java | 86 +++++++++++--- ...riptionAsyncClientJavaDocCodeSnippets.java | 15 +-- ...ranscriptionClientJavaDocCodeSnippets.java | 11 +- 11 files changed, 312 insertions(+), 89 deletions(-) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md index 38e6da508efc..4641d025f82e 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md @@ -139,11 +139,10 @@ try { .setFilename("audio.wav"); // Create transcription options - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); // Create transcribe request content TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); // Transcribe audio @@ -159,6 +158,66 @@ try { } ``` +### Transcribe using audio URL + +You can transcribe audio directly from a URL without downloading the file first: + +```java readme-sample-transcribeWithAudioUrl +TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + +// Create transcription options with audio URL +TranscriptionOptions options = new TranscriptionOptions("https://example.com/audio.wav"); + +// Create transcribe request content +TranscriptionContent requestContent = new TranscriptionContent() + .setOptions(options); + +// Transcribe audio +TranscriptionResult result = client.transcribe(requestContent); + +// Process results +result.getCombinedPhrases().forEach(phrase -> { + System.out.println(phrase.getText()); +}); +``` + +### Transcribe using AudioFileDetails constructor + +You can also create `TranscriptionOptions` directly with `AudioFileDetails`: + +```java readme-sample-transcribeWithAudioFileDetails +TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + +// Read audio file +byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + +// Create audio file details +AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav") + .setContentType("audio/wav"); + +// Create transcription options with AudioFileDetails +TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); + +// Create transcribe request content +TranscriptionContent requestContent = new TranscriptionContent() + .setOptions(options); + +// Transcribe audio +TranscriptionResult result = client.transcribe(requestContent); + +// Process results +result.getCombinedPhrases().forEach(phrase -> { + System.out.println(phrase.getText()); +}); +``` + ### Use enhanced mode for improved transcription quality Enhanced mode provides advanced features to improve transcription accuracy with custom prompts, translation capabilities, and task-specific optimizations. @@ -174,12 +233,11 @@ AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(au // Enable enhanced mode for improved transcription quality EnhancedModeOptions enhancedMode = new EnhancedModeOptions(); -TranscriptionOptions options = new TranscriptionOptions() +TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(java.util.Arrays.asList("en-US")) .setEnhancedModeOptions(enhancedMode); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); @@ -203,12 +261,11 @@ EnhancedModeOptions enhancedMode = new EnhancedModeOptions() "Patient symptoms and treatment plan" )); -TranscriptionOptions options = new TranscriptionOptions() +TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(java.util.Arrays.asList("en-US")) .setEnhancedModeOptions(enhancedMode); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); @@ -228,12 +285,11 @@ AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(au EnhancedModeOptions enhancedMode = new EnhancedModeOptions() .setTargetLanguage("en-US"); // Translate to English -TranscriptionOptions options = new TranscriptionOptions() +TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(java.util.Arrays.asList("es-ES")) // Source language: Spanish .setEnhancedModeOptions(enhancedMode); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java index 319c860790c6..968951be831f 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java @@ -4,12 +4,22 @@ import com.azure.autorest.customization.Customization; import com.azure.autorest.customization.LibraryCustomization; import com.azure.autorest.customization.PackageCustomization; +import com.azure.autorest.customization.ClassCustomization; +import com.github.javaparser.ast.Modifier; +import com.github.javaparser.ast.NodeList; +import com.github.javaparser.ast.body.BodyDeclaration; +import com.github.javaparser.ast.body.ConstructorDeclaration; +import com.github.javaparser.ast.stmt.BlockStmt; +import com.github.javaparser.ast.stmt.Statement; import com.github.javaparser.javadoc.Javadoc; +import com.github.javaparser.javadoc.JavadocBlockTag; +import com.github.javaparser.javadoc.description.JavadocDescription; import org.slf4j.Logger; import java.time.Duration; import static com.github.javaparser.StaticJavaParser.parseBlock; +import static com.github.javaparser.StaticJavaParser.parseStatement; import static com.github.javaparser.javadoc.description.JavadocDescription.parseText; /** @@ -43,6 +53,14 @@ public void customize(LibraryCustomization customization, Logger logger) { // Customize TranscriptionDiarizationOptions to properly serialize enabled field logger.info("Customizing TranscriptionDiarizationOptions.toJson()"); customizeDiarizationOptionsToJson(models); + + // Add AudioFileDetails field and constructors to TranscriptionOptions, make setAudioUrl private + logger.info("Customizing TranscriptionOptions to add AudioFileDetails support and String audioUrl constructor"); + customizeTranscriptionOptions(models); + + // Customize TranscriptionContent.getAudio() to retrieve audio from options when needed + logger.info("Customizing TranscriptionContent.getAudio() to support audio from TranscriptionOptions"); + customizeTranscriptionContent(models); } /** @@ -80,4 +98,96 @@ private void customizeDiarizationOptionsToJson(PackageCustomization packageCusto })); }); } + + /** + * Customize TranscriptionOptions to: + * 1. Add AudioFileDetails field + * 2. Add constructor with String audioUrl parameter + * 3. Add constructor with AudioFileDetails parameter + * 4. Make setAudioUrl() private instead of public + * + * @param packageCustomization the package customization + */ + private void customizeTranscriptionOptions(PackageCustomization packageCustomization) { + packageCustomization.getClass("TranscriptionOptions").customizeAst(ast -> { + ast.getClassByName("TranscriptionOptions").ifPresent(clazz -> { + // Add the AudioFileDetails field + clazz.addFieldWithInitializer( + "AudioFileDetails", + "audioFileDetails", + null, + com.github.javaparser.ast.Modifier.Keyword.PRIVATE + ); + + // Add constructor with String audioUrl parameter + ConstructorDeclaration audioUrlConstructor = clazz.addConstructor(Modifier.Keyword.PUBLIC); + audioUrlConstructor.addParameter("String", "audioUrl"); + audioUrlConstructor.setBody(parseBlock("{ this.audioUrl = audioUrl; }")); + audioUrlConstructor.setJavadocComment(new Javadoc(parseText( + "Creates an instance of TranscriptionOptions class with audio URL.")) + .addBlockTag("param", "audioUrl the URL of the audio to be transcribed")); + + // Add constructor with AudioFileDetails parameter + ConstructorDeclaration fileDetailsConstructor = clazz.addConstructor(Modifier.Keyword.PUBLIC); + fileDetailsConstructor.addParameter("AudioFileDetails", "fileDetails"); + fileDetailsConstructor.setBody(parseBlock("{ this.audioFileDetails = fileDetails; }")); + fileDetailsConstructor.setJavadocComment(new Javadoc(parseText( + "Creates an instance of TranscriptionOptions class with audio file details.")) + .addBlockTag("param", "fileDetails the audio file details")); + + // Make setAudioUrl() private + clazz.getMethodsByName("setAudioUrl").forEach(method -> { + method.getModifiers().clear(); + method.addModifier(Modifier.Keyword.PRIVATE); + }); + }); + }); + } + + /** + * Customize TranscriptionContent to: + * 1. Override getAudio() to return audio from options.audioFileDetails if audio field is null + * + * @param packageCustomization the package customization + */ + private void customizeTranscriptionContent(PackageCustomization packageCustomization) { + packageCustomization.getClass("TranscriptionContent").customizeAst(ast -> { + ast.getClassByName("TranscriptionContent").ifPresent(clazz -> { + // Replace the getAudio() method to check options.audioFileDetails + clazz.getMethodsByName("getAudio").forEach(method -> { + method.setBody(parseBlock( + "{ if (this.audio != null) { return this.audio; } " + + "if (this.options != null) { " + + "try { " + + "java.lang.reflect.Field field = this.options.getClass().getDeclaredField(\"audioFileDetails\"); " + + "field.setAccessible(true); " + + "return (AudioFileDetails) field.get(this.options); " + + "} catch (Exception e) { return null; } " + + "} return null; }")); + }); + }); + }); + } + + /** + * Find the position to insert constructors (after existing constructors). + * + * @param clazz the class declaration + * @return the position to insert constructors + */ + private int getConstructorPosition(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz) { + int constructorIndex = 0; + NodeList> members = clazz.getMembers(); + for (int i = 0; i < members.size(); i++) { + BodyDeclaration member = members.get(i); + if (member.isFieldDeclaration()) { + constructorIndex = i + 1; + } else if (member.isConstructorDeclaration()) { + constructorIndex = i + 1; + } else if (member.isMethodDeclaration()) { + return constructorIndex; + } + } + return constructorIndex; + } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java index 4230b7644a66..642b4e8a7dd8 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java @@ -57,19 +57,6 @@ public String getAudioUrl() { return this.audioUrl; } - /** - * Set the audioUrl property: The URL of the audio to be transcribed. The audio must be shorter than 2 hours in - * audio duration and smaller than 250 MB in size. If both Audio and AudioUrl are provided, Audio is used. - * - * @param audioUrl the audioUrl value to set. - * @return the TranscriptionOptions object itself. - */ - @Generated - public TranscriptionOptions setAudioUrl(String audioUrl) { - this.audioUrl = audioUrl; - return this; - } - /** * Get the locales property: A list of possible locales for the transcription. If not specified, the locale of the * speech in the audio is detected automatically from all supported locales. @@ -324,4 +311,41 @@ public TranscriptionOptions setLocaleModelMapping(Map localeMode this.localeModelMapping = localeModelMapping; return this; } + + // BEGIN: Manual customization - AudioFileDetails field and constructors + @SuppressWarnings("unused") + private AudioFileDetails audioFileDetails; + + /** + * Creates an instance of TranscriptionOptions class with audio file details. + * + * @param fileDetails the audio file details + */ + public TranscriptionOptions(AudioFileDetails fileDetails) { + this.audioFileDetails = fileDetails; + } + + /** + * Creates an instance of TranscriptionOptions class with audio URL. + * MANUAL EDIT: This constructor is manually added and preserved via partial-update. + * TypeSpec emitter filters constructors for schema-defined fields during code generation. + * + * @param audioUrl the URL of the audio to be transcribed + */ + public TranscriptionOptions(String audioUrl) { + this.audioUrl = audioUrl; + } + + /** + * Set the audioUrl property: The URL of the audio to be transcribed. The audio must be shorter than 2 hours in + * audio duration and smaller than 250 MB in size. If both Audio and AudioUrl are provided, Audio is used. + * + * @param audioUrl the audioUrl value to set. + * @return the TranscriptionOptions object itself. + */ + @Generated + private TranscriptionOptions setAudioUrl(String audioUrl) { + this.audioUrl = audioUrl; + return this; + } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java index 84a9a99c0fa6..0996d342ce5f 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java @@ -132,7 +132,7 @@ private static void demonstrateAdvancedTranscriptionOptions(String endpoint, Str // BEGIN: com.azure.ai.speech.transcription.advanced.transcription-options // Configure advanced transcription options - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) // Set specific locale(s) for transcription .setLocales(Arrays.asList("en-US", "es-ES")) // Control profanity handling: MASKED, REMOVED, RAW, or TAGS @@ -142,7 +142,6 @@ private static void demonstrateAdvancedTranscriptionOptions(String endpoint, Str // END: com.azure.ai.speech.transcription.advanced.transcription-options TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); System.out.println("Configured options:"); @@ -189,11 +188,10 @@ private static void demonstrateDetailedResultProcessing(String endpoint, String .setFilename(audioFilePath); // Enable diarization for speaker identification - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setDiarizationOptions(new TranscriptionDiarizationOptions()); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java index f52117c3ae8a..3b9686c3138a 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java @@ -97,9 +97,9 @@ private static void demonstrateSubscribePattern(String endpoint, String apiKey) AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename(audioFilePath); - TranscriptionOptions options = new TranscriptionOptions(); + // Use the AudioFileDetails constructor for cleaner code + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); System.out.println("Starting async transcription with subscribe()..."); @@ -170,9 +170,9 @@ private static void demonstrateBlockPattern(String endpoint, String apiKey) { AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename(audioFilePath); - TranscriptionOptions options = new TranscriptionOptions(); + // Use the AudioFileDetails constructor + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); System.out.println("Starting async transcription with block()..."); @@ -217,9 +217,9 @@ private static void demonstrateTimeoutAndErrorHandling(String endpoint, String a AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename(audioFilePath); - TranscriptionOptions options = new TranscriptionOptions(); + // Use the AudioFileDetails constructor + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); System.out.println("Starting async transcription with timeout and error handling..."); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java index d0aa47a1c84b..51d57e60bbf0 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java @@ -36,7 +36,7 @@ public class BasicTranscriptionSample { */ public static void main(String[] args) { // PREREQUISITE: Set environment variables for authentication - // + // // Option 1: API Key Authentication // set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/ // set SPEECH_API_KEY=your-api-key @@ -60,7 +60,7 @@ public static void main(String[] args) { // Create the transcription client with appropriate authentication TranscriptionClient client; - + if (apiKey != null && !apiKey.isEmpty()) { // BEGIN: com.azure.ai.speech.transcription.basic.create-client.apikey // Option 1: Use API Key authentication @@ -111,12 +111,11 @@ public static void main(String[] args) { AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename(audioFilePath); - // Create transcription options (using defaults) - TranscriptionOptions options = new TranscriptionOptions(); + // Create transcription options using the AudioFileDetails constructor + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); // Create the transcribe request TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); System.out.println("Starting transcription..."); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java index 33944967c4b4..def0f2ab8c31 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java @@ -90,13 +90,12 @@ private static void demonstrateBasicEnhancedMode(String endpoint, String apiKey) // Enable enhanced mode for improved transcription quality EnhancedModeOptions enhancedMode = new EnhancedModeOptions(); - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(Arrays.asList("en-US")) .setEnhancedModeOptions(enhancedMode); // END: com.azure.ai.speech.transcription.enhancedmode.basic TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); System.out.println("Transcribing with enhanced mode enabled..."); @@ -151,13 +150,12 @@ private static void demonstrateEnhancedModeWithPrompts(String endpoint, String a "Patient symptoms and treatment plan" )); - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(Arrays.asList("en-US")) .setEnhancedModeOptions(enhancedMode); // END: com.azure.ai.speech.transcription.enhancedmode.prompts TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); System.out.println("Transcribing with custom prompts..."); @@ -211,13 +209,12 @@ private static void demonstrateEnhancedModeWithTranslation(String endpoint, Stri EnhancedModeOptions enhancedMode = new EnhancedModeOptions() .setTargetLanguage("en-US"); // Translate to English - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(Arrays.asList("es-ES")) // Source language: Spanish .setEnhancedModeOptions(enhancedMode); // END: com.azure.ai.speech.transcription.enhancedmode.translation TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); System.out.println("Transcribing and translating..."); @@ -274,13 +271,12 @@ private static void demonstrateTaskSpecificEnhancedMode(String endpoint, String "Topics: budget, forecasts, market trends" )); - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(Arrays.asList("en-US")) .setEnhancedModeOptions(enhancedMode); // END: com.azure.ai.speech.transcription.enhancedmode.taskspecific TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); System.out.println("Transcribing with task-specific configuration..."); @@ -329,13 +325,12 @@ private static TranscriptionResult transcribeWithFullEnhancedMode( )); // Create transcription options with enhanced mode - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(Arrays.asList("en-US")) .setEnhancedModeOptions(enhancedMode); // Create request and transcribe TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); return client.transcribe(requestContent); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java index a6e9b7abfcf5..bb29b4106aee 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java @@ -80,8 +80,7 @@ private static void demonstrateAuthenticationErrorHandling() { byte[] dummyAudio = new byte[1024]; AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(dummyAudio)); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) - .setOptions(new TranscriptionOptions()); + .setOptions(new TranscriptionOptions(audioFileDetails)); client.transcribe(requestContent); @@ -121,8 +120,7 @@ private static void demonstrateAzureAdAuthenticationErrorHandling() { byte[] dummyAudio = new byte[1024]; AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(dummyAudio)); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) - .setOptions(new TranscriptionOptions()); + .setOptions(new TranscriptionOptions(audioFileDetails)); client.transcribe(requestContent); @@ -176,8 +174,7 @@ private static void demonstrateFileErrorHandling() { byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) - .setOptions(new TranscriptionOptions()); + .setOptions(new TranscriptionOptions(audioFileDetails)); client.transcribe(requestContent); @@ -220,8 +217,7 @@ private static void demonstrateServiceErrorHandling() { AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(invalidAudio)) .setFilename("invalid.wav"); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) - .setOptions(new TranscriptionOptions()); + .setOptions(new TranscriptionOptions(audioFileDetails)); client.transcribe(requestContent); @@ -301,9 +297,8 @@ private static void demonstrateComprehensiveErrorHandling() { // Step 4: Prepare transcription request AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename(audioFilePath); - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); System.out.println("✓ Request prepared"); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java index 5d5031625a16..78df19fa9e34 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java @@ -41,11 +41,10 @@ public void readmeSamples() { .setFilename("audio.wav"); // Create transcription options - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); // Create transcribe request content TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); // Transcribe audio @@ -101,10 +100,9 @@ public void transcribeAudioSync() throws Exception { AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("audio.wav"); - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); @@ -131,10 +129,9 @@ public void transcribeAudioAsync() throws Exception { AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("audio.wav"); - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); asyncClient.transcribe(requestContent) @@ -163,14 +160,13 @@ public void advancedTranscriptionOptions() throws Exception { .setFilename("audio.wav"); // Configure advanced options - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(java.util.Arrays.asList("en-US", "es-ES")) // Specify candidate locales .setProfanityFilterMode(ProfanityFilterMode.MASKED) // Mask profanity .setDiarizationOptions(new TranscriptionDiarizationOptions() // Enable speaker diarization .setMaxSpeakers(5)); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); @@ -219,8 +215,7 @@ public void processDetailedResults() throws Exception { AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("audio.wav"); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) - .setOptions(new TranscriptionOptions()); + .setOptions(new TranscriptionOptions(audioFileDetails)); // BEGIN: com.azure.ai.speech.transcription.transcriptionresult.detailed TranscriptionResult result = client.transcribe(requestContent); @@ -267,12 +262,11 @@ public void enhancedModeBasic() throws Exception { // Enable enhanced mode for improved transcription quality EnhancedModeOptions enhancedMode = new EnhancedModeOptions(); - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(java.util.Arrays.asList("en-US")) .setEnhancedModeOptions(enhancedMode); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); @@ -302,12 +296,11 @@ public void enhancedModeWithPrompts() throws Exception { "Patient symptoms and treatment plan" )); - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(java.util.Arrays.asList("en-US")) .setEnhancedModeOptions(enhancedMode); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); @@ -333,16 +326,77 @@ public void enhancedModeWithTranslation() throws Exception { EnhancedModeOptions enhancedMode = new EnhancedModeOptions() .setTargetLanguage("en-US"); // Translate to English - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(java.util.Arrays.asList("es-ES")) // Source language: Spanish .setEnhancedModeOptions(enhancedMode); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); // END: readme-sample-enhancedModeWithTranslation } + + /** + * Sample for transcribing audio using audio URL constructor. + */ + public void transcribeWithAudioUrl() { + // BEGIN: readme-sample-transcribeWithAudioUrl + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + + // Create transcription options with audio URL + TranscriptionOptions options = new TranscriptionOptions("https://example.com/audio.wav"); + + // Create transcribe request content + TranscriptionContent requestContent = new TranscriptionContent() + .setOptions(options); + + // Transcribe audio + TranscriptionResult result = client.transcribe(requestContent); + + // Process results + result.getCombinedPhrases().forEach(phrase -> { + System.out.println(phrase.getText()); + }); + // END: readme-sample-transcribeWithAudioUrl + } + + /** + * Sample for transcribing audio using AudioFileDetails constructor. + */ + public void transcribeWithAudioFileDetails() throws Exception { + // BEGIN: readme-sample-transcribeWithAudioFileDetails + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + + // Read audio file + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + + // Create audio file details + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav") + .setContentType("audio/wav"); + + // Create transcription options with AudioFileDetails + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); + + // Create transcribe request content + TranscriptionContent requestContent = new TranscriptionContent() + .setOptions(options); + + // Transcribe audio + TranscriptionResult result = client.transcribe(requestContent); + + // Process results + result.getCombinedPhrases().forEach(phrase -> { + System.out.println(phrase.getText()); + }); + // END: readme-sample-transcribeWithAudioFileDetails + } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java index 82a06a1dc09e..5b93fbd10db1 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java @@ -55,9 +55,8 @@ public void transcribeAsyncWithSubscribe() throws Exception { byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("sample.wav"); - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.subscribe @@ -100,9 +99,8 @@ public void transcribeAsyncWithBlock() throws Exception { byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("sample.wav"); - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.block @@ -131,13 +129,12 @@ public void transcribeAsyncWithOptions() throws Exception { .setFilename("sample.wav"); // Configure advanced transcription options - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(Arrays.asList("en-US", "es-ES")) .setProfanityFilterMode(ProfanityFilterMode.MASKED) .setDiarizationOptions(new TranscriptionDiarizationOptions().setMaxSpeakers(5)); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); // Transcribe asynchronously @@ -167,9 +164,8 @@ public void transcribeAsyncWithTimeoutAndErrorHandling() throws Exception { byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("sample.wav"); - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.timeout @@ -196,9 +192,8 @@ public void processDetailedAsyncResults() throws Exception { byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.results.detailed diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java index 3a1b971d1180..bffdeffce299 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java @@ -73,12 +73,11 @@ public void transcribeFromFile() throws Exception { AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("sample.wav"); - // Create transcription options with default settings - TranscriptionOptions options = new TranscriptionOptions(); + // Create transcription options using the AudioFileDetails constructor + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); // Create transcribe request TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); // Transcribe audio @@ -108,13 +107,12 @@ public void transcribeWithOptions() throws Exception { .setFilename("sample.wav"); // Configure advanced transcription options - TranscriptionOptions options = new TranscriptionOptions() + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) .setLocales(Arrays.asList("en-US", "es-ES")) .setProfanityFilterMode(ProfanityFilterMode.MASKED) .setDiarizationOptions(new TranscriptionDiarizationOptions().setMaxSpeakers(5)); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); @@ -140,9 +138,8 @@ public void processDetailedResults() throws Exception { byte[] audioData = Files.readAllBytes(Paths.get("sample.wav")); AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); TranscriptionContent requestContent = new TranscriptionContent() - .setAudio(audioFileDetails) .setOptions(options); TranscriptionResult result = client.transcribe(requestContent); From 372ebee6bb106c81bbef6367b291894df8df908e Mon Sep 17 00:00:00 2001 From: wangamber Date: Wed, 12 Nov 2025 16:40:49 -0800 Subject: [PATCH 14/45] update test --- .../SpeechTranscriptionCustomization.java | 58 ++++++------------- .../models/TranscriptionOptions.java | 4 +- .../TranscriptionAsyncClientTest.java | 23 +++----- 3 files changed, 31 insertions(+), 54 deletions(-) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java index 968951be831f..e65808929636 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java @@ -57,10 +57,6 @@ public void customize(LibraryCustomization customization, Logger logger) { // Add AudioFileDetails field and constructors to TranscriptionOptions, make setAudioUrl private logger.info("Customizing TranscriptionOptions to add AudioFileDetails support and String audioUrl constructor"); customizeTranscriptionOptions(models); - - // Customize TranscriptionContent.getAudio() to retrieve audio from options when needed - logger.info("Customizing TranscriptionContent.getAudio() to support audio from TranscriptionOptions"); - customizeTranscriptionContent(models); } /** @@ -101,28 +97,39 @@ private void customizeDiarizationOptionsToJson(PackageCustomization packageCusto /** * Customize TranscriptionOptions to: - * 1. Add AudioFileDetails field - * 2. Add constructor with String audioUrl parameter - * 3. Add constructor with AudioFileDetails parameter - * 4. Make setAudioUrl() private instead of public + * 1. Add AudioFileDetails field (final) + * 2. Add initialization to default constructor + * 3. Add constructor with String audioUrl parameter + * 4. Add constructor with AudioFileDetails parameter + * 5. Make setAudioUrl() private instead of public * * @param packageCustomization the package customization */ private void customizeTranscriptionOptions(PackageCustomization packageCustomization) { packageCustomization.getClass("TranscriptionOptions").customizeAst(ast -> { ast.getClassByName("TranscriptionOptions").ifPresent(clazz -> { - // Add the AudioFileDetails field + // Add the AudioFileDetails field as final clazz.addFieldWithInitializer( "AudioFileDetails", "audioFileDetails", null, - com.github.javaparser.ast.Modifier.Keyword.PRIVATE + com.github.javaparser.ast.Modifier.Keyword.PRIVATE, + com.github.javaparser.ast.Modifier.Keyword.FINAL ); + // Update default constructor to initialize audioFileDetails + clazz.getConstructors().stream() + .filter(c -> c.getParameters().isEmpty()) + .findFirst() + .ifPresent(defaultConstructor -> { + BlockStmt body = defaultConstructor.getBody(); + body.addStatement(0, parseStatement("this.audioFileDetails = null;")); + }); + // Add constructor with String audioUrl parameter ConstructorDeclaration audioUrlConstructor = clazz.addConstructor(Modifier.Keyword.PUBLIC); audioUrlConstructor.addParameter("String", "audioUrl"); - audioUrlConstructor.setBody(parseBlock("{ this.audioUrl = audioUrl; }")); + audioUrlConstructor.setBody(parseBlock("{ this.audioUrl = audioUrl; this.audioFileDetails = null; }")); audioUrlConstructor.setJavadocComment(new Javadoc(parseText( "Creates an instance of TranscriptionOptions class with audio URL.")) .addBlockTag("param", "audioUrl the URL of the audio to be transcribed")); @@ -142,34 +149,7 @@ private void customizeTranscriptionOptions(PackageCustomization packageCustomiza }); }); }); - } - - /** - * Customize TranscriptionContent to: - * 1. Override getAudio() to return audio from options.audioFileDetails if audio field is null - * - * @param packageCustomization the package customization - */ - private void customizeTranscriptionContent(PackageCustomization packageCustomization) { - packageCustomization.getClass("TranscriptionContent").customizeAst(ast -> { - ast.getClassByName("TranscriptionContent").ifPresent(clazz -> { - // Replace the getAudio() method to check options.audioFileDetails - clazz.getMethodsByName("getAudio").forEach(method -> { - method.setBody(parseBlock( - "{ if (this.audio != null) { return this.audio; } " + - "if (this.options != null) { " + - "try { " + - "java.lang.reflect.Field field = this.options.getClass().getDeclaredField(\"audioFileDetails\"); " + - "field.setAccessible(true); " + - "return (AudioFileDetails) field.get(this.options); " + - "} catch (Exception e) { return null; } " + - "} return null; }")); - }); - }); - }); - } - - /** + } /** * Find the position to insert constructors (after existing constructors). * * @param clazz the class declaration diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java index 642b4e8a7dd8..9cef6a8eb73c 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java @@ -44,6 +44,7 @@ public final class TranscriptionOptions implements JsonSerializable localeMode // BEGIN: Manual customization - AudioFileDetails field and constructors @SuppressWarnings("unused") - private AudioFileDetails audioFileDetails; + private final AudioFileDetails audioFileDetails; /** * Creates an instance of TranscriptionOptions class with audio file details. @@ -334,6 +335,7 @@ public TranscriptionOptions(AudioFileDetails fileDetails) { */ public TranscriptionOptions(String audioUrl) { this.audioUrl = audioUrl; + this.audioFileDetails = null; } /** diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java index 0ea10430f0ec..6c58f873c4f2 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java @@ -156,20 +156,18 @@ public void testTranscribeAsyncWithAudioUrl() { // Test with audio URL option createClient(true, true, sync); - String methodName = new Object() { - }.getClass().getEnclosingMethod().getName(); - - TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US")) - .setAudioUrl("https://example.com/sample.wav"); - // Note: This test is commented out because it requires: // 1. A valid, publicly accessible URL in live/record mode // 2. Proper recording of the service response // 3. The audio file at the URL must be in a supported format // To enable this test: // - Provide a valid audio URL - // - Uncomment the line below + // - Uncomment the lines below // - Run in RECORD mode to capture the interaction + // String methodName = new Object() { + // }.getClass().getEnclosingMethod().getName(); + // TranscriptionOptions options = new TranscriptionOptions("https://example.com/sample.wav"); + // options.setLocales(Arrays.asList("en-US")); // doTranscription(methodName, sync, false, audioFile, options, null); } @@ -229,12 +227,10 @@ public void testTranscribeAsyncWithEmptyAudioData() { public void testTranscribeAsyncWithInvalidLanguageCode() { createClient(true, true, sync); - // Test with invalid language code - TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("invalid-locale")); - // Note: This test requires actual service call to verify behavior // In PLAYBACK mode, this would replay the recorded error response // Example implementation with StepVerifier: + // TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("invalid-locale")); // StepVerifier.create(getAsyncClient().transcribe(requestContentWithInvalidLocale)) // .expectErrorMatches(throwable -> throwable instanceof HttpResponseException // && ((HttpResponseException) throwable).getResponse().getStatusCode() == 400) @@ -247,13 +243,12 @@ public void testTranscribeAsyncCancellation() { // Test that async operations can be cancelled properly // This verifies that the reactive streams support cancellation - String methodName = new Object() { - }.getClass().getEnclosingMethod().getName(); - - TranscriptionOptions options = new TranscriptionOptions(); // Note: Cancellation testing would typically involve subscribing and then cancelling // Example pattern (commented out as it requires specific test setup): + // String methodName = new Object() { + // }.getClass().getEnclosingMethod().getName(); + // TranscriptionOptions options = new TranscriptionOptions(); // Disposable subscription = getAsyncClient().transcribe(requestContent).subscribe(); // subscription.dispose(); // Verify that resources are cleaned up appropriately From 4739db8ec37aa76edf85f95fcad56b17f7dae452 Mon Sep 17 00:00:00 2001 From: wangamber Date: Thu, 13 Nov 2025 13:23:39 -0800 Subject: [PATCH 15/45] change constructor to transcribe(TranscriptionOptions options) --- .../SpeechTranscriptionCustomization.java | 140 ++++++---- .../TranscriptionAsyncClient.java | 23 +- .../transcription/TranscriptionClient.java | 27 +- .../models/TranscribedPhrase.java | 64 ++--- .../transcription/models/TranscribedWord.java | 64 ++--- .../models/TranscriptionOptions.java | 248 +++++++++--------- .../models/TranscriptionResult.java | 32 +-- .../AdvancedTranscriptionSample.java | 11 +- .../AsyncTranscriptionSample.java | 13 +- .../BasicTranscriptionSample.java | 7 +- .../transcription/EnhancedModeSample.java | 28 +- .../transcription/ErrorHandlingSample.java | 25 +- .../speech/transcription/ReadmeSamples.java | 7 - ...riptionAsyncClientJavaDocCodeSnippets.java | 22 +- ...ranscriptionClientJavaDocCodeSnippets.java | 16 +- .../TranscriptionAsyncClientTest.java | 3 - .../TranscriptionClientTest.java | 3 +- .../TranscriptionClientTestBase.java | 4 - .../tsp-location.yaml | 2 +- .../tspconfig.yaml | 7 + 20 files changed, 378 insertions(+), 368 deletions(-) create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/tspconfig.yaml diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java index e65808929636..5fe7c6314163 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java @@ -35,28 +35,44 @@ public SpeechTranscriptionCustomization() { @Override public void customize(LibraryCustomization customization, Logger logger) { - logger.info("Customizing Speech Transcription SDK - changing Duration getters"); - PackageCustomization models = customization.getPackage("com.azure.ai.speech.transcription.models"); + logger.info("Customizing Speech Transcription SDK"); - // Customize TranscriptionResult.getDuration() to return Duration instead of int - logger.info("Customizing TranscriptionResult.getDuration()"); - customizeDurationGetter(models, "TranscriptionResult"); + // Check if models package exists before attempting customization + try { + PackageCustomization models = customization.getPackage("com.azure.ai.speech.transcription.models"); - // Customize TranscribedPhrase.getDuration() to return Duration instead of int - logger.info("Customizing TranscribedPhrase.getDuration()"); - customizeDurationGetter(models, "TranscribedPhrase"); + logger.info("Models package found - applying model customizations"); - // Customize TranscribedWord.getDuration() to return Duration instead of int - logger.info("Customizing TranscribedWord.getDuration()"); - customizeDurationGetter(models, "TranscribedWord"); + // Customize TranscriptionResult.getDuration() to return Duration instead of int + logger.info("Customizing TranscriptionResult.getDuration()"); + customizeDurationGetter(models, "TranscriptionResult"); - // Customize TranscriptionDiarizationOptions to properly serialize enabled field - logger.info("Customizing TranscriptionDiarizationOptions.toJson()"); - customizeDiarizationOptionsToJson(models); + // Customize TranscribedPhrase.getDuration() to return Duration instead of int + logger.info("Customizing TranscribedPhrase.getDuration()"); + customizeDurationGetter(models, "TranscribedPhrase"); - // Add AudioFileDetails field and constructors to TranscriptionOptions, make setAudioUrl private - logger.info("Customizing TranscriptionOptions to add AudioFileDetails support and String audioUrl constructor"); - customizeTranscriptionOptions(models); + // Customize TranscribedWord.getDuration() to return Duration instead of int + logger.info("Customizing TranscribedWord.getDuration()"); + customizeDurationGetter(models, "TranscribedWord"); + + // Customize TranscriptionDiarizationOptions to properly serialize enabled field + logger.info("Customizing TranscriptionDiarizationOptions.toJson()"); + customizeDiarizationOptionsToJson(models); + + // Add AudioFileDetails field and constructors to TranscriptionOptions, make setAudioUrl private + logger.info( + "Customizing TranscriptionOptions to add AudioFileDetails support and String audioUrl constructor"); + customizeTranscriptionOptions(models); + } catch (IllegalArgumentException e) { + logger.warn("Models package not found or empty - skipping model customizations: " + e.getMessage()); + } + + // Make transcribe(TranscriptionContent) package-private in clients + logger.info("Customizing TranscriptionClient to make transcribe(TranscriptionContent) package-private"); + customizeTranscriptionClient(customization.getPackage("com.azure.ai.speech.transcription")); + + logger.info("Customizing TranscriptionAsyncClient to make transcribe(TranscriptionContent) package-private"); + customizeTranscriptionAsyncClient(customization.getPackage("com.azure.ai.speech.transcription")); } /** @@ -109,16 +125,13 @@ private void customizeTranscriptionOptions(PackageCustomization packageCustomiza packageCustomization.getClass("TranscriptionOptions").customizeAst(ast -> { ast.getClassByName("TranscriptionOptions").ifPresent(clazz -> { // Add the AudioFileDetails field as final - clazz.addFieldWithInitializer( - "AudioFileDetails", - "audioFileDetails", - null, + clazz.addFieldWithInitializer("AudioFileDetails", "audioFileDetails", null, com.github.javaparser.ast.Modifier.Keyword.PRIVATE, - com.github.javaparser.ast.Modifier.Keyword.FINAL - ); + com.github.javaparser.ast.Modifier.Keyword.FINAL); // Update default constructor to initialize audioFileDetails - clazz.getConstructors().stream() + clazz.getConstructors() + .stream() .filter(c -> c.getParameters().isEmpty()) .findFirst() .ifPresent(defaultConstructor -> { @@ -130,17 +143,17 @@ private void customizeTranscriptionOptions(PackageCustomization packageCustomiza ConstructorDeclaration audioUrlConstructor = clazz.addConstructor(Modifier.Keyword.PUBLIC); audioUrlConstructor.addParameter("String", "audioUrl"); audioUrlConstructor.setBody(parseBlock("{ this.audioUrl = audioUrl; this.audioFileDetails = null; }")); - audioUrlConstructor.setJavadocComment(new Javadoc(parseText( - "Creates an instance of TranscriptionOptions class with audio URL.")) - .addBlockTag("param", "audioUrl the URL of the audio to be transcribed")); + audioUrlConstructor.setJavadocComment( + new Javadoc(parseText("Creates an instance of TranscriptionOptions class with audio URL.")) + .addBlockTag("param", "audioUrl the URL of the audio to be transcribed")); // Add constructor with AudioFileDetails parameter ConstructorDeclaration fileDetailsConstructor = clazz.addConstructor(Modifier.Keyword.PUBLIC); fileDetailsConstructor.addParameter("AudioFileDetails", "fileDetails"); fileDetailsConstructor.setBody(parseBlock("{ this.audioFileDetails = fileDetails; }")); - fileDetailsConstructor.setJavadocComment(new Javadoc(parseText( - "Creates an instance of TranscriptionOptions class with audio file details.")) - .addBlockTag("param", "fileDetails the audio file details")); + fileDetailsConstructor.setJavadocComment( + new Javadoc(parseText("Creates an instance of TranscriptionOptions class with audio file details.")) + .addBlockTag("param", "fileDetails the audio file details")); // Make setAudioUrl() private clazz.getMethodsByName("setAudioUrl").forEach(method -> { @@ -149,25 +162,56 @@ private void customizeTranscriptionOptions(PackageCustomization packageCustomiza }); }); }); - } /** - * Find the position to insert constructors (after existing constructors). + } + + /** + * Customize TranscriptionClient to add public transcribe(TranscriptionOptions) method + * that hides TranscriptionContent construction. * - * @param clazz the class declaration - * @return the position to insert constructors + * @param packageCustomization the package customization */ - private int getConstructorPosition(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz) { - int constructorIndex = 0; - NodeList> members = clazz.getMembers(); - for (int i = 0; i < members.size(); i++) { - BodyDeclaration member = members.get(i); - if (member.isFieldDeclaration()) { - constructorIndex = i + 1; - } else if (member.isConstructorDeclaration()) { - constructorIndex = i + 1; - } else if (member.isMethodDeclaration()) { - return constructorIndex; - } - } - return constructorIndex; + private void customizeTranscriptionClient(PackageCustomization packageCustomization) { + ClassCustomization classCustomization = packageCustomization.getClass("TranscriptionClient"); + classCustomization.customizeAst(ast -> { + ast.getClassByName("TranscriptionClient").ifPresent(clazz -> { + // Make the generated transcribe(TranscriptionContent) package-private (internal) + // Only modify methods that have @Generated annotation to avoid affecting manual customizations + clazz.getMethodsByName("transcribe").forEach(method -> { + if (method.getParameters().size() == 1 + && "TranscriptionContent".equals(method.getParameter(0).getType().asString()) + && method.getAnnotationByName("Generated").isPresent()) { + // Remove public modifier, making it package-private (no modifiers = package-private) + method.setModifiers(); + // Remove @Generated annotation to prevent overwriting + method.getAnnotationByName("Generated").ifPresent(com.github.javaparser.ast.Node::remove); + } + }); + }); + }); + } + + /** + * Customize TranscriptionAsyncClient to make transcribe(TranscriptionContent) package-private (internal). + * + * @param packageCustomization the package customization + */ + private void customizeTranscriptionAsyncClient(PackageCustomization packageCustomization) { + ClassCustomization classCustomization = packageCustomization.getClass("TranscriptionAsyncClient"); + classCustomization.customizeAst(ast -> { + ast.getClassByName("TranscriptionAsyncClient").ifPresent(clazz -> { + // Make the generated transcribe(TranscriptionContent) package-private (internal) + // Only modify methods that have @Generated annotation to avoid affecting manual customizations + clazz.getMethodsByName("transcribe").forEach(method -> { + if (method.getParameters().size() == 1 + && "TranscriptionContent".equals(method.getParameter(0).getType().asString()) + && method.getAnnotationByName("Generated").isPresent()) { + // Remove public modifier, making it package-private (no modifiers = package-private) + method.setModifiers(); + // Remove @Generated annotation to prevent overwriting + method.getAnnotationByName("Generated").ifPresent(com.github.javaparser.ast.Node::remove); + } + }); + }); + }); } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java index 9b8474be709e..dcc0d3fffecd 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java @@ -6,6 +6,7 @@ import com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper; import com.azure.ai.speech.transcription.implementation.TranscriptionClientImpl; import com.azure.ai.speech.transcription.models.TranscriptionContent; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; import com.azure.core.annotation.Generated; import com.azure.core.annotation.ReturnType; @@ -108,9 +109,8 @@ Mono> transcribeWithResponse(BinaryData body, RequestOption * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. * @return the result of the transcribe operation on successful completion of {@link Mono}. */ - @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public Mono transcribe(TranscriptionContent body) { + final Mono transcribe(TranscriptionContent body) { // Generated convenience method for transcribeWithResponse RequestOptions requestOptions = new RequestOptions(); return transcribeWithResponse( @@ -123,4 +123,23 @@ public Mono transcribe(TranscriptionContent body) { requestOptions).flatMap(FluxUtil::toMono) .map(protocolMethodData -> protocolMethodData.toObject(TranscriptionResult.class)); } + + /** + * Transcribes the provided audio stream with the specified options. + * + * @param options the transcription options including audio file details or audio URL + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return the result of the transcribe operation on successful completion of Mono. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono transcribe(TranscriptionOptions options) { + TranscriptionContent requestContent = new TranscriptionContent(); + requestContent.setOptions(options); + return transcribe(requestContent); + } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java index 3dcf92845394..ce46ae38bd73 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java @@ -6,6 +6,7 @@ import com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper; import com.azure.ai.speech.transcription.implementation.TranscriptionClientImpl; import com.azure.ai.speech.transcription.models.TranscriptionContent; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; import com.azure.core.annotation.Generated; import com.azure.core.annotation.ReturnType; @@ -44,7 +45,7 @@ public final class TranscriptionClient { /** * Transcribes the provided audio stream. *

Response Body Schema

- * + * *
      * {@code
      * {
@@ -106,8 +107,7 @@ Response transcribeWithResponse(BinaryData body, RequestOptions requ
      * @return the result of the transcribe operation.
      */
     @Generated
-    @ServiceMethod(returns = ReturnType.SINGLE)
-    public TranscriptionResult transcribe(TranscriptionContent body) {
+    TranscriptionResult transcribe(TranscriptionContent body) {
         // Generated convenience method for transcribeWithResponse
         RequestOptions requestOptions = new RequestOptions();
         return transcribeWithResponse(
@@ -119,4 +119,25 @@ public TranscriptionResult transcribe(TranscriptionContent body) {
                 .getRequestBody(),
             requestOptions).getValue().toObject(TranscriptionResult.class);
     }
+
+    // BEGIN: Manual customization - Public transcribe(TranscriptionOptions) convenience method
+    /**
+     * Transcribes the provided audio stream with the specified options.
+     *
+     * @param options the transcription options including audio file details or audio URL
+     * @throws IllegalArgumentException thrown if parameters fail the validation.
+     * @throws HttpResponseException thrown if the request is rejected by server.
+     * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.
+     * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.
+     * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.
+     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
+     * @return the result of the transcribe operation.
+     */
+    @ServiceMethod(returns = ReturnType.SINGLE)
+    public TranscriptionResult transcribe(TranscriptionOptions options) {
+        TranscriptionContent requestContent = new TranscriptionContent();
+        requestContent.setOptions(options);
+        return transcribe(requestContent);
+    }
+    // END: Manual customization
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java
index 56ebb70f80d1..6406e29ed530 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java
@@ -32,6 +32,18 @@ public final class TranscribedPhrase implements JsonSerializable
     @Generated
     private final String text;
 
+    /*
+     * The start offset of the word in milliseconds.
+     */
+    @Generated
+    private final int offset;
+
+    /*
+     * The duration of the word in milliseconds.
+     */
+    @Generated
+    private final int duration;
+
     /**
      * Creates an instance of TranscribedWord class.
      *
@@ -48,6 +60,26 @@ public String getText() {
         return this.text;
     }
 
+    /**
+     * Get the offset property: The start offset of the word in milliseconds.
+     *
+     * @return the offset value.
+     */
+    @Generated
+    public int getOffset() {
+        return this.offset;
+    }
+
+    /**
+     * Get the duration property: The duration in milliseconds.
+     *
+     * @return the duration value as Duration.
+     */
+    @Generated
+    public Duration getDuration() {
+        return Duration.ofMillis(this.duration);
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -92,36 +124,4 @@ public static TranscribedWord fromJson(JsonReader jsonReader) throws IOException
             return new TranscribedWord(text, offset, duration);
         });
     }
-
-    /*
-     * The start offset of the word in milliseconds.
-     */
-    @Generated
-    private final int offset;
-
-    /*
-     * The duration of the word in milliseconds.
-     */
-    @Generated
-    private final int duration;
-
-    /**
-     * Get the offset property: The start offset of the word in milliseconds.
-     *
-     * @return the offset value.
-     */
-    @Generated
-    public int getOffset() {
-        return this.offset;
-    }
-
-    /**
-     * Get the duration property: The duration in milliseconds.
-     *
-     * @return the duration value as Duration.
-     */
-    @Generated
-    public Duration getDuration() {
-        return Duration.ofMillis(this.duration);
-    }
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java
index 9cef6a8eb73c..57f157c2c68e 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java
@@ -33,12 +33,44 @@ public final class TranscriptionOptions implements JsonSerializable locales;
 
+    /*
+     * Maps some or all candidate locales to a model URI to be used for transcription. If no mapping is given, the
+     * default model for the locale is used.
+     */
+    @Generated
+    private Map localeModelMapping;
+
     /*
      * Mode of profanity filtering.
      */
     @Generated
     private ProfanityFilterMode profanityFilterMode;
 
+    /*
+     * Mode of diarization.
+     */
+    @Generated
+    private TranscriptionDiarizationOptions diarizationOptions;
+
+    /*
+     * The 0-based indices of the channels to be transcribed separately. If not specified, multiple channels are merged
+     * and transcribed jointly. Only up to two channels are supported.
+     */
+    @Generated
+    private List activeChannels;
+
+    /*
+     * Enhanced mode properties.
+     */
+    @Generated
+    private EnhancedModeOptions enhancedModeOptions;
+
+    /*
+     * Phrase list properties.
+     */
+    @Generated
+    private PhraseListOptions phraseListOptions;
+
     /**
      * Creates an instance of TranscriptionOptions class.
      */
@@ -58,6 +90,19 @@ public String getAudioUrl() {
         return this.audioUrl;
     }
 
+    /**
+     * Set the audioUrl property: The URL of the audio to be transcribed. The audio must be shorter than 2 hours in
+     * audio duration and smaller than 250 MB in size. If both Audio and AudioUrl are provided, Audio is used.
+     *
+     * @param audioUrl the audioUrl value to set.
+     * @return the TranscriptionOptions object itself.
+     */
+    @Generated
+    private TranscriptionOptions setAudioUrl(String audioUrl) {
+        this.audioUrl = audioUrl;
+        return this;
+    }
+
     /**
      * Get the locales property: A list of possible locales for the transcription. If not specified, the locale of the
      * speech in the audio is detected automatically from all supported locales.
@@ -83,103 +128,51 @@ public TranscriptionOptions setLocales(List locales) {
     }
 
     /**
-     * Get the profanityFilterMode property: Mode of profanity filtering.
+     * Get the localeModelMapping property: Maps some or all candidate locales to a model URI to be used for
+     * transcription. If no mapping is given, the default model for the locale is used.
      *
-     * @return the profanityFilterMode value.
+     * @return the localeModelMapping value.
      */
     @Generated
-    public ProfanityFilterMode getProfanityFilterMode() {
-        return this.profanityFilterMode;
+    public Map getLocaleModelMapping() {
+        return this.localeModelMapping;
     }
 
     /**
-     * Set the profanityFilterMode property: Mode of profanity filtering.
+     * Set the localeModelMapping property: Maps some or all candidate locales to a model URI to be used for
+     * transcription. If no mapping is given, the default model for the locale is used.
      *
-     * @param profanityFilterMode the profanityFilterMode value to set.
+     * @param localeModelMapping the localeModelMapping value to set.
      * @return the TranscriptionOptions object itself.
      */
     @Generated
-    public TranscriptionOptions setProfanityFilterMode(ProfanityFilterMode profanityFilterMode) {
-        this.profanityFilterMode = profanityFilterMode;
+    public TranscriptionOptions setLocaleModelMapping(Map localeModelMapping) {
+        this.localeModelMapping = localeModelMapping;
         return this;
     }
 
     /**
-     * {@inheritDoc}
+     * Get the profanityFilterMode property: Mode of profanity filtering.
+     *
+     * @return the profanityFilterMode value.
      */
     @Generated
-    @Override
-    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
-        jsonWriter.writeStartObject();
-        jsonWriter.writeStringField("audioUrl", this.audioUrl);
-        jsonWriter.writeArrayField("locales", this.locales, (writer, element) -> writer.writeString(element));
-        jsonWriter.writeMapField("models", this.localeModelMapping, (writer, element) -> writer.writeString(element));
-        jsonWriter.writeStringField("profanityFilterMode",
-            this.profanityFilterMode == null ? null : this.profanityFilterMode.toString());
-        jsonWriter.writeJsonField("diarization", this.diarizationOptions);
-        jsonWriter.writeArrayField("channels", this.activeChannels, (writer, element) -> writer.writeInt(element));
-        jsonWriter.writeJsonField("enhancedMode", this.enhancedModeOptions);
-        jsonWriter.writeJsonField("phraseList", this.phraseListOptions);
-        return jsonWriter.writeEndObject();
+    public ProfanityFilterMode getProfanityFilterMode() {
+        return this.profanityFilterMode;
     }
 
     /**
-     * Reads an instance of TranscriptionOptions from the JsonReader.
+     * Set the profanityFilterMode property: Mode of profanity filtering.
      *
-     * @param jsonReader The JsonReader being read.
-     * @return An instance of TranscriptionOptions if the JsonReader was pointing to an instance of it, or null if it
-     * was pointing to JSON null.
-     * @throws IOException If an error occurs while reading the TranscriptionOptions.
+     * @param profanityFilterMode the profanityFilterMode value to set.
+     * @return the TranscriptionOptions object itself.
      */
     @Generated
-    public static TranscriptionOptions fromJson(JsonReader jsonReader) throws IOException {
-        return jsonReader.readObject(reader -> {
-            TranscriptionOptions deserializedTranscriptionOptions = new TranscriptionOptions();
-            while (reader.nextToken() != JsonToken.END_OBJECT) {
-                String fieldName = reader.getFieldName();
-                reader.nextToken();
-                if ("audioUrl".equals(fieldName)) {
-                    deserializedTranscriptionOptions.audioUrl = reader.getString();
-                } else if ("locales".equals(fieldName)) {
-                    List locales = reader.readArray(reader1 -> reader1.getString());
-                    deserializedTranscriptionOptions.locales = locales;
-                } else if ("models".equals(fieldName)) {
-                    Map localeModelMapping = reader.readMap(reader1 -> reader1.getString());
-                    deserializedTranscriptionOptions.localeModelMapping = localeModelMapping;
-                } else if ("profanityFilterMode".equals(fieldName)) {
-                    deserializedTranscriptionOptions.profanityFilterMode
-                        = ProfanityFilterMode.fromString(reader.getString());
-                } else if ("diarization".equals(fieldName)) {
-                    deserializedTranscriptionOptions.diarizationOptions
-                        = TranscriptionDiarizationOptions.fromJson(reader);
-                } else if ("channels".equals(fieldName)) {
-                    List activeChannels = reader.readArray(reader1 -> reader1.getInt());
-                    deserializedTranscriptionOptions.activeChannels = activeChannels;
-                } else if ("enhancedMode".equals(fieldName)) {
-                    deserializedTranscriptionOptions.enhancedModeOptions = EnhancedModeOptions.fromJson(reader);
-                } else if ("phraseList".equals(fieldName)) {
-                    deserializedTranscriptionOptions.phraseListOptions = PhraseListOptions.fromJson(reader);
-                } else {
-                    reader.skipChildren();
-                }
-            }
-            return deserializedTranscriptionOptions;
-        });
+    public TranscriptionOptions setProfanityFilterMode(ProfanityFilterMode profanityFilterMode) {
+        this.profanityFilterMode = profanityFilterMode;
+        return this;
     }
 
-    /*
-     * Mode of diarization.
-     */
-    @Generated
-    private TranscriptionDiarizationOptions diarizationOptions;
-
-    /*
-     * The 0-based indices of the channels to be transcribed separately. If not specified, multiple channels are merged
-     * and transcribed jointly. Only up to two channels are supported.
-     */
-    @Generated
-    private List activeChannels;
-
     /**
      * Get the diarizationOptions property: Mode of diarization.
      *
@@ -226,18 +219,6 @@ public TranscriptionOptions setActiveChannels(List activeChannels) {
         return this;
     }
 
-    /*
-     * Enhanced mode properties.
-     */
-    @Generated
-    private EnhancedModeOptions enhancedModeOptions;
-
-    /*
-     * Phrase list properties.
-     */
-    @Generated
-    private PhraseListOptions phraseListOptions;
-
     /**
      * Get the enhancedModeOptions property: Enhanced mode properties.
      *
@@ -282,54 +263,73 @@ public TranscriptionOptions setPhraseListOptions(PhraseListOptions phraseListOpt
         return this;
     }
 
-    /*
-     * Maps some or all candidate locales to a model URI to be used for transcription. If no mapping is given, the
-     * default model for the locale is used.
-     */
-    @Generated
-    private Map localeModelMapping;
-
     /**
-     * Get the localeModelMapping property: Maps some or all candidate locales to a model URI to be used for
-     * transcription. If no mapping is given, the default model for the locale is used.
-     *
-     * @return the localeModelMapping value.
+     * {@inheritDoc}
      */
     @Generated
-    public Map getLocaleModelMapping() {
-        return this.localeModelMapping;
+    @Override
+    public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
+        jsonWriter.writeStartObject();
+        jsonWriter.writeStringField("audioUrl", this.audioUrl);
+        jsonWriter.writeArrayField("locales", this.locales, (writer, element) -> writer.writeString(element));
+        jsonWriter.writeMapField("models", this.localeModelMapping, (writer, element) -> writer.writeString(element));
+        jsonWriter.writeStringField("profanityFilterMode",
+            this.profanityFilterMode == null ? null : this.profanityFilterMode.toString());
+        jsonWriter.writeJsonField("diarization", this.diarizationOptions);
+        jsonWriter.writeArrayField("channels", this.activeChannels, (writer, element) -> writer.writeInt(element));
+        jsonWriter.writeJsonField("enhancedMode", this.enhancedModeOptions);
+        jsonWriter.writeJsonField("phraseList", this.phraseListOptions);
+        return jsonWriter.writeEndObject();
     }
 
     /**
-     * Set the localeModelMapping property: Maps some or all candidate locales to a model URI to be used for
-     * transcription. If no mapping is given, the default model for the locale is used.
+     * Reads an instance of TranscriptionOptions from the JsonReader.
      *
-     * @param localeModelMapping the localeModelMapping value to set.
-     * @return the TranscriptionOptions object itself.
+     * @param jsonReader The JsonReader being read.
+     * @return An instance of TranscriptionOptions if the JsonReader was pointing to an instance of it, or null if it
+     * was pointing to JSON null.
+     * @throws IOException If an error occurs while reading the TranscriptionOptions.
      */
     @Generated
-    public TranscriptionOptions setLocaleModelMapping(Map localeModelMapping) {
-        this.localeModelMapping = localeModelMapping;
-        return this;
+    public static TranscriptionOptions fromJson(JsonReader jsonReader) throws IOException {
+        return jsonReader.readObject(reader -> {
+            TranscriptionOptions deserializedTranscriptionOptions = new TranscriptionOptions();
+            while (reader.nextToken() != JsonToken.END_OBJECT) {
+                String fieldName = reader.getFieldName();
+                reader.nextToken();
+                if ("audioUrl".equals(fieldName)) {
+                    deserializedTranscriptionOptions.audioUrl = reader.getString();
+                } else if ("locales".equals(fieldName)) {
+                    List locales = reader.readArray(reader1 -> reader1.getString());
+                    deserializedTranscriptionOptions.locales = locales;
+                } else if ("models".equals(fieldName)) {
+                    Map localeModelMapping = reader.readMap(reader1 -> reader1.getString());
+                    deserializedTranscriptionOptions.localeModelMapping = localeModelMapping;
+                } else if ("profanityFilterMode".equals(fieldName)) {
+                    deserializedTranscriptionOptions.profanityFilterMode
+                        = ProfanityFilterMode.fromString(reader.getString());
+                } else if ("diarization".equals(fieldName)) {
+                    deserializedTranscriptionOptions.diarizationOptions
+                        = TranscriptionDiarizationOptions.fromJson(reader);
+                } else if ("channels".equals(fieldName)) {
+                    List activeChannels = reader.readArray(reader1 -> reader1.getInt());
+                    deserializedTranscriptionOptions.activeChannels = activeChannels;
+                } else if ("enhancedMode".equals(fieldName)) {
+                    deserializedTranscriptionOptions.enhancedModeOptions = EnhancedModeOptions.fromJson(reader);
+                } else if ("phraseList".equals(fieldName)) {
+                    deserializedTranscriptionOptions.phraseListOptions = PhraseListOptions.fromJson(reader);
+                } else {
+                    reader.skipChildren();
+                }
+            }
+            return deserializedTranscriptionOptions;
+        });
     }
 
-    // BEGIN: Manual customization - AudioFileDetails field and constructors
-    @SuppressWarnings("unused")
     private final AudioFileDetails audioFileDetails;
 
-    /**
-     * Creates an instance of TranscriptionOptions class with audio file details.
-     *
-     * @param fileDetails the audio file details
-     */
-    public TranscriptionOptions(AudioFileDetails fileDetails) {
-        this.audioFileDetails = fileDetails;
-    }
-
     /**
      * Creates an instance of TranscriptionOptions class with audio URL.
-     * MANUAL EDIT: This constructor is manually added and preserved via partial-update.
-     * TypeSpec emitter filters constructors for schema-defined fields during code generation.
      *
      * @param audioUrl the URL of the audio to be transcribed
      */
@@ -339,15 +339,11 @@ public TranscriptionOptions(String audioUrl) {
     }
 
     /**
-     * Set the audioUrl property: The URL of the audio to be transcribed. The audio must be shorter than 2 hours in
-     * audio duration and smaller than 250 MB in size. If both Audio and AudioUrl are provided, Audio is used.
+     * Creates an instance of TranscriptionOptions class with audio file details.
      *
-     * @param audioUrl the audioUrl value to set.
-     * @return the TranscriptionOptions object itself.
+     * @param fileDetails the audio file details
      */
-    @Generated
-    private TranscriptionOptions setAudioUrl(String audioUrl) {
-        this.audioUrl = audioUrl;
-        return this;
+    public TranscriptionOptions(AudioFileDetails fileDetails) {
+        this.audioFileDetails = fileDetails;
     }
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java
index c3d871984935..12d5a00d20a1 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java
@@ -19,6 +19,12 @@
 @Immutable
 public final class TranscriptionResult implements JsonSerializable {
 
+    /*
+     * The duration of the audio in milliseconds.
+     */
+    @Generated
+    private final int duration;
+
     /*
      * The full transcript for each channel.
      */
@@ -46,6 +52,16 @@ private TranscriptionResult(int duration, List combinedP
         this.phrases = phrases;
     }
 
+    /**
+     * Get the duration property: The duration in milliseconds.
+     *
+     * @return the duration value as Duration.
+     */
+    @Generated
+    public Duration getDuration() {
+        return Duration.ofMillis(this.duration);
+    }
+
     /**
      * Get the combinedPhrases property: The full transcript for each channel.
      *
@@ -111,20 +127,4 @@ public static TranscriptionResult fromJson(JsonReader jsonReader) throws IOExcep
             return new TranscriptionResult(duration, combinedPhrases, phrases);
         });
     }
-
-    /*
-     * The duration of the audio in milliseconds.
-     */
-    @Generated
-    private final int duration;
-
-    /**
-     * Get the duration property: The duration in milliseconds.
-     *
-     * @return the duration value as Duration.
-     */
-    @Generated
-    public Duration getDuration() {
-        return Duration.ofMillis(this.duration);
-    }
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java
index 0996d342ce5f..4da8359abfa8 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java
@@ -7,7 +7,6 @@
 import com.azure.ai.speech.transcription.models.AudioFileDetails;
 import com.azure.ai.speech.transcription.models.ChannelCombinedPhrases;
 import com.azure.ai.speech.transcription.models.ProfanityFilterMode;
-import com.azure.ai.speech.transcription.models.TranscriptionContent;
 import com.azure.ai.speech.transcription.models.TranscribedPhrase;
 import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions;
 import com.azure.ai.speech.transcription.models.TranscriptionOptions;
@@ -141,16 +140,13 @@ private static void demonstrateAdvancedTranscriptionOptions(String endpoint, Str
                 .setDiarizationOptions(new TranscriptionDiarizationOptions().setMaxSpeakers(5)); // Max number of speakers (2-36)
             // END: com.azure.ai.speech.transcription.advanced.transcription-options
 
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(options);
-
             System.out.println("Configured options:");
             System.out.println("  - Locales: en-US, es-ES");
             System.out.println("  - Profanity filter: MASKED");
             System.out.println("  - Speaker diarization: up to 5 speakers");
             System.out.println("\nTranscribing...");
 
-            TranscriptionResult result = client.transcribe(requestContent);
+            TranscriptionResult result = client.transcribe(options);
 
             System.out.println("\n✓ Transcription completed with advanced options");
             System.out.println("  Duration: " + result.getDuration() + " ms\n");
@@ -191,10 +187,7 @@ private static void demonstrateDetailedResultProcessing(String endpoint, String
             TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
                 .setDiarizationOptions(new TranscriptionDiarizationOptions());
 
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(options);
-
-            TranscriptionResult result = client.transcribe(requestContent);
+            TranscriptionResult result = client.transcribe(options);
 
             // BEGIN: com.azure.ai.speech.transcription.advanced.detailed-results
             // Process combined phrases (sentence-level results)
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java
index 3b9686c3138a..652f13ba6c6b 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java
@@ -5,7 +5,6 @@
 
 // BEGIN: com.azure.ai.speech.transcription.async.imports
 import com.azure.ai.speech.transcription.models.AudioFileDetails;
-import com.azure.ai.speech.transcription.models.TranscriptionContent;
 import com.azure.ai.speech.transcription.models.TranscriptionOptions;
 import com.azure.ai.speech.transcription.models.TranscriptionResult;
 import com.azure.core.credential.KeyCredential;
@@ -99,8 +98,6 @@ private static void demonstrateSubscribePattern(String endpoint, String apiKey)
 
             // Use the AudioFileDetails constructor for cleaner code
             TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(options);
 
             System.out.println("Starting async transcription with subscribe()...");
 
@@ -110,7 +107,7 @@ private static void demonstrateSubscribePattern(String endpoint, String apiKey)
             CountDownLatch latch = new CountDownLatch(1);
 
             // Subscribe to the Mono with success and error callbacks
-            asyncClient.transcribe(requestContent)
+            asyncClient.transcribe(options)
                 .doOnSubscribe(subscription ->
                     System.out.println("  → Subscribed to transcription operation"))
                 .doOnNext(result ->
@@ -172,15 +169,13 @@ private static void demonstrateBlockPattern(String endpoint, String apiKey) {
 
             // Use the AudioFileDetails constructor
             TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(options);
 
             System.out.println("Starting async transcription with block()...");
 
             // BEGIN: com.azure.ai.speech.transcription.async.block-pattern
             // block() waits for the operation to complete and returns the result
             // This is useful when integrating async client with synchronous code
-            TranscriptionResult result = asyncClient.transcribe(requestContent).block();
+            TranscriptionResult result = asyncClient.transcribe(options).block();
             // END: com.azure.ai.speech.transcription.async.block-pattern
 
             if (result != null) {
@@ -219,13 +214,11 @@ private static void demonstrateTimeoutAndErrorHandling(String endpoint, String a
 
             // Use the AudioFileDetails constructor
             TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(options);
 
             System.out.println("Starting async transcription with timeout and error handling...");
 
             // BEGIN: com.azure.ai.speech.transcription.async.timeout-error-handling
-            Mono transcriptionMono = asyncClient.transcribe(requestContent)
+            Mono transcriptionMono = asyncClient.transcribe(options)
                 // Set a timeout for the operation
                 .timeout(Duration.ofMinutes(2))
                 // Handle errors
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java
index 51d57e60bbf0..6fb91e409f0a 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java
@@ -5,7 +5,6 @@
 
 // BEGIN: com.azure.ai.speech.transcription.basic.imports
 import com.azure.ai.speech.transcription.models.AudioFileDetails;
-import com.azure.ai.speech.transcription.models.TranscriptionContent;
 import com.azure.ai.speech.transcription.models.TranscriptionOptions;
 import com.azure.ai.speech.transcription.models.TranscriptionResult;
 import com.azure.core.credential.KeyCredential;
@@ -114,14 +113,10 @@ public static void main(String[] args) {
             // Create transcription options using the AudioFileDetails constructor
             TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
-            // Create the transcribe request
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(options);
-
             System.out.println("Starting transcription...");
 
             // Transcribe the audio
-            TranscriptionResult result = client.transcribe(requestContent);
+            TranscriptionResult result = client.transcribe(options);
             // END: com.azure.ai.speech.transcription.basic.transcribe
 
             // BEGIN: com.azure.ai.speech.transcription.basic.process-results
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
index def0f2ab8c31..1d1ed6a42d70 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
@@ -6,7 +6,6 @@
 // BEGIN: com.azure.ai.speech.transcription.enhancedmode.imports
 import com.azure.ai.speech.transcription.models.AudioFileDetails;
 import com.azure.ai.speech.transcription.models.EnhancedModeOptions;
-import com.azure.ai.speech.transcription.models.TranscriptionContent;
 import com.azure.ai.speech.transcription.models.TranscriptionOptions;
 import com.azure.ai.speech.transcription.models.TranscriptionResult;
 import com.azure.core.credential.KeyCredential;
@@ -95,12 +94,9 @@ private static void demonstrateBasicEnhancedMode(String endpoint, String apiKey)
                 .setEnhancedModeOptions(enhancedMode);
             // END: com.azure.ai.speech.transcription.enhancedmode.basic
 
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(options);
-
             System.out.println("Transcribing with enhanced mode enabled...");
 
-            TranscriptionResult result = client.transcribe(requestContent);
+            TranscriptionResult result = client.transcribe(options);
 
             System.out.println("✓ Enhanced mode enabled");
             System.out.println("Duration: " + result.getDuration() + " ms");
@@ -155,12 +151,9 @@ private static void demonstrateEnhancedModeWithPrompts(String endpoint, String a
                 .setEnhancedModeOptions(enhancedMode);
             // END: com.azure.ai.speech.transcription.enhancedmode.prompts
 
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(options);
-
             System.out.println("Transcribing with custom prompts...");
 
-            TranscriptionResult result = client.transcribe(requestContent);
+            TranscriptionResult result = client.transcribe(options);
 
             System.out.println("✓ Enhanced mode with custom prompts");
             System.out.println("Prompts used:");
@@ -214,12 +207,9 @@ private static void demonstrateEnhancedModeWithTranslation(String endpoint, Stri
                 .setEnhancedModeOptions(enhancedMode);
             // END: com.azure.ai.speech.transcription.enhancedmode.translation
 
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(options);
-
             System.out.println("Transcribing and translating...");
 
-            TranscriptionResult result = client.transcribe(requestContent);
+            TranscriptionResult result = client.transcribe(options);
 
             System.out.println("✓ Enhanced mode with translation");
             System.out.println("Source language: es-ES");
@@ -276,12 +266,9 @@ private static void demonstrateTaskSpecificEnhancedMode(String endpoint, String
                 .setEnhancedModeOptions(enhancedMode);
             // END: com.azure.ai.speech.transcription.enhancedmode.taskspecific
 
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(options);
-
             System.out.println("Transcribing with task-specific configuration...");
 
-            TranscriptionResult result = client.transcribe(requestContent);
+            TranscriptionResult result = client.transcribe(options);
 
             System.out.println("✓ Enhanced mode with task-specific configuration");
             System.out.println("Task type: " + enhancedMode.getTask());
@@ -329,11 +316,8 @@ private static TranscriptionResult transcribeWithFullEnhancedMode(
             .setLocales(Arrays.asList("en-US"))
             .setEnhancedModeOptions(enhancedMode);
 
-        // Create request and transcribe
-        TranscriptionContent requestContent = new TranscriptionContent()
-            .setOptions(options);
-
-        return client.transcribe(requestContent);
+        // Transcribe with all enhanced mode features
+        return client.transcribe(options);
     }
     // END: com.azure.ai.speech.transcription.enhancedmode.complete
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java
index bb29b4106aee..0f9620589b4d 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java
@@ -5,7 +5,6 @@
 
 // BEGIN: com.azure.ai.speech.transcription.error.imports
 import com.azure.ai.speech.transcription.models.AudioFileDetails;
-import com.azure.ai.speech.transcription.models.TranscriptionContent;
 import com.azure.ai.speech.transcription.models.TranscriptionOptions;
 import com.azure.ai.speech.transcription.models.TranscriptionResult;
 import com.azure.core.credential.KeyCredential;
@@ -79,10 +78,9 @@ private static void demonstrateAuthenticationErrorHandling() {
             // This will fail with authentication error
             byte[] dummyAudio = new byte[1024];
             AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(dummyAudio));
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(new TranscriptionOptions(audioFileDetails));
+            TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
-            client.transcribe(requestContent);
+            client.transcribe(options);
 
         } catch (ClientAuthenticationException e) {
             // Specific exception for authentication failures
@@ -119,10 +117,9 @@ private static void demonstrateAzureAdAuthenticationErrorHandling() {
             // Attempt to transcribe (may fail if Azure AD not configured)
             byte[] dummyAudio = new byte[1024];
             AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(dummyAudio));
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(new TranscriptionOptions(audioFileDetails));
+            TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
-            client.transcribe(requestContent);
+            client.transcribe(options);
 
         } catch (CredentialUnavailableException e) {
             // No Azure AD credential sources are available
@@ -173,10 +170,9 @@ private static void demonstrateFileErrorHandling() {
         try {
             byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath));
             AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(new TranscriptionOptions(audioFileDetails));
+            TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
-            client.transcribe(requestContent);
+            client.transcribe(options);
 
         } catch (IOException e) {
             // Handle file I/O errors
@@ -216,10 +212,9 @@ private static void demonstrateServiceErrorHandling() {
             byte[] invalidAudio = new byte[10]; // Too small to be valid audio
             AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(invalidAudio))
                 .setFilename("invalid.wav");
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(new TranscriptionOptions(audioFileDetails));
+            TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
-            client.transcribe(requestContent);
+            client.transcribe(options);
 
         // BEGIN: com.azure.ai.speech.transcription.error.service-errors
         } catch (HttpResponseException e) {
@@ -298,8 +293,6 @@ private static void demonstrateComprehensiveErrorHandling() {
             AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
                 .setFilename(audioFilePath);
             TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
-            TranscriptionContent requestContent = new TranscriptionContent()
-                .setOptions(options);
             System.out.println("✓ Request prepared");
 
             // BEGIN: com.azure.ai.speech.transcription.error.retry-logic
@@ -311,7 +304,7 @@ private static void demonstrateComprehensiveErrorHandling() {
             while (retryCount < maxRetries) {
                 try {
                     System.out.println("  Attempting transcription (attempt " + (retryCount + 1) + "/" + maxRetries + ")...");
-                    result = client.transcribe(requestContent);
+                    result = client.transcribe(options);
                     break; // Success, exit retry loop
                 } catch (HttpResponseException e) {
                     if (e.getResponse().getStatusCode() == 429 || e.getResponse().getStatusCode() >= 500) {
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
index 78df19fa9e34..b65c96235e68 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
@@ -4,13 +4,6 @@
 
 package com.azure.ai.speech.transcription;
 
-import com.azure.ai.speech.transcription.models.AudioFileDetails;
-import com.azure.ai.speech.transcription.models.EnhancedModeOptions;
-import com.azure.ai.speech.transcription.models.ProfanityFilterMode;
-import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions;
-import com.azure.ai.speech.transcription.models.TranscriptionContent;
-import com.azure.ai.speech.transcription.models.TranscriptionOptions;
-import com.azure.ai.speech.transcription.models.TranscriptionResult;
 import com.azure.core.credential.KeyCredential;
 import com.azure.core.http.policy.ExponentialBackoffOptions;
 import com.azure.core.http.policy.HttpLogDetailLevel;
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java
index 5b93fbd10db1..d375c6573cda 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java
@@ -8,7 +8,6 @@
 import com.azure.ai.speech.transcription.TranscriptionClientBuilder;
 import com.azure.ai.speech.transcription.models.AudioFileDetails;
 import com.azure.ai.speech.transcription.models.ProfanityFilterMode;
-import com.azure.ai.speech.transcription.models.TranscriptionContent;
 import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions;
 import com.azure.ai.speech.transcription.models.TranscriptionOptions;
 import com.azure.ai.speech.transcription.models.TranscriptionResult;
@@ -56,13 +55,11 @@ public void transcribeAsyncWithSubscribe() throws Exception {
         AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
             .setFilename("sample.wav");
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
-        TranscriptionContent requestContent = new TranscriptionContent()
-            .setOptions(options);
 
         // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.subscribe
         CountDownLatch latch = new CountDownLatch(1);
 
-        asyncClient.transcribe(requestContent)
+        asyncClient.transcribe(options)
             .subscribe(
                 // onNext: Process result
                 result -> {
@@ -100,12 +97,10 @@ public void transcribeAsyncWithBlock() throws Exception {
         AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
             .setFilename("sample.wav");
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
-        TranscriptionContent requestContent = new TranscriptionContent()
-            .setOptions(options);
 
         // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.block
         // Use block() to convert async call to sync
-        TranscriptionResult result = asyncClient.transcribe(requestContent).block();
+        TranscriptionResult result = asyncClient.transcribe(options).block();
 
         if (result != null) {
             System.out.println("Duration: " + result.getDuration() + " ms");
@@ -134,11 +129,8 @@ public void transcribeAsyncWithOptions() throws Exception {
             .setProfanityFilterMode(ProfanityFilterMode.MASKED)
             .setDiarizationOptions(new TranscriptionDiarizationOptions().setMaxSpeakers(5));
 
-        TranscriptionContent requestContent = new TranscriptionContent()
-            .setOptions(options);
-
         // Transcribe asynchronously
-        Mono resultMono = asyncClient.transcribe(requestContent);
+        Mono resultMono = asyncClient.transcribe(options);
 
         // Process result
         resultMono.subscribe(result -> {
@@ -165,11 +157,9 @@ public void transcribeAsyncWithTimeoutAndErrorHandling() throws Exception {
         AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
             .setFilename("sample.wav");
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
-        TranscriptionContent requestContent = new TranscriptionContent()
-            .setOptions(options);
 
         // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.timeout
-        Mono resultMono = asyncClient.transcribe(requestContent)
+        Mono resultMono = asyncClient.transcribe(options)
             .timeout(Duration.ofMinutes(2))
             .doOnError(error -> System.err.println("Error: " + error.getMessage()))
             .onErrorResume(error -> {
@@ -193,11 +183,9 @@ public void processDetailedAsyncResults() throws Exception {
         byte[] audioData = Files.readAllBytes(Paths.get("sample.wav"));
         AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
-        TranscriptionContent requestContent = new TranscriptionContent()
-            .setOptions(options);
 
         // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.results.detailed
-        asyncClient.transcribe(requestContent)
+        asyncClient.transcribe(options)
             .subscribe(result -> {
                 // Access combined phrases
                 if (result.getCombinedPhrases() != null) {
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java
index bffdeffce299..eadae5049e58 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java
@@ -8,7 +8,6 @@
 import com.azure.ai.speech.transcription.TranscriptionClientBuilder;
 import com.azure.ai.speech.transcription.models.AudioFileDetails;
 import com.azure.ai.speech.transcription.models.ProfanityFilterMode;
-import com.azure.ai.speech.transcription.models.TranscriptionContent;
 import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions;
 import com.azure.ai.speech.transcription.models.TranscriptionOptions;
 import com.azure.ai.speech.transcription.models.TranscriptionResult;
@@ -76,12 +75,8 @@ public void transcribeFromFile() throws Exception {
         // Create transcription options using the AudioFileDetails constructor
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
-        // Create transcribe request
-        TranscriptionContent requestContent = new TranscriptionContent()
-            .setOptions(options);
-
         // Transcribe audio
-        TranscriptionResult result = client.transcribe(requestContent);
+        TranscriptionResult result = client.transcribe(options);
 
         // Process results
         System.out.println("Duration: " + result.getDuration() + " ms");
@@ -112,10 +107,7 @@ public void transcribeWithOptions() throws Exception {
             .setProfanityFilterMode(ProfanityFilterMode.MASKED)
             .setDiarizationOptions(new TranscriptionDiarizationOptions().setMaxSpeakers(5));
 
-        TranscriptionContent requestContent = new TranscriptionContent()
-            .setOptions(options);
-
-        TranscriptionResult result = client.transcribe(requestContent);
+        TranscriptionResult result = client.transcribe(options);
 
         // Access detailed results
         if (result.getPhrases() != null) {
@@ -139,9 +131,7 @@ public void processDetailedResults() throws Exception {
         byte[] audioData = Files.readAllBytes(Paths.get("sample.wav"));
         AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
-        TranscriptionContent requestContent = new TranscriptionContent()
-            .setOptions(options);
-        TranscriptionResult result = client.transcribe(requestContent);
+        TranscriptionResult result = client.transcribe(options);
 
         // BEGIN: com.azure.ai.speech.transcription.transcriptionclient.results.detailed
         // Access sentence-level combined phrases
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java
index 6c58f873c4f2..7d66e5a58756 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java
@@ -3,9 +3,6 @@
 
 package com.azure.ai.speech.transcription;
 
-import com.azure.ai.speech.transcription.models.ProfanityFilterMode;
-import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions;
-import com.azure.ai.speech.transcription.models.TranscriptionOptions;
 import com.azure.core.http.HttpHeaderName;
 import com.azure.core.http.rest.RequestOptions;
 import org.junit.jupiter.api.Test;
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java
index 49599f5a792b..f0c09659c859 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java
@@ -4,6 +4,7 @@
 package com.azure.ai.speech.transcription;
 
 import com.azure.ai.speech.transcription.models.ProfanityFilterMode;
+import com.azure.ai.speech.transcription.models.TranscriptionContent;
 import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions;
 import com.azure.ai.speech.transcription.models.TranscriptionOptions;
 import com.azure.core.http.HttpHeaderName;
@@ -178,7 +179,7 @@ public void testTranscribeSyncWithNullRequestContent() {
 
         // Test that null request content throws appropriate exception
         assertThrows(NullPointerException.class, () -> {
-            getClient().transcribe(null);
+            getClient().transcribe((TranscriptionContent) null);
         }, "Transcribe should throw NullPointerException when request content is null");
     }
 
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java
index d949a221e3b9..2faf559004b9 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java
@@ -3,10 +3,6 @@
 
 package com.azure.ai.speech.transcription;
 
-import com.azure.ai.speech.transcription.models.AudioFileDetails;
-import com.azure.ai.speech.transcription.models.TranscriptionContent;
-import com.azure.ai.speech.transcription.models.TranscriptionOptions;
-import com.azure.ai.speech.transcription.models.TranscriptionResult;
 import com.azure.core.credential.KeyCredential;
 import com.azure.core.credential.TokenCredential;
 import com.azure.core.http.HttpRequest;
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml b/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml
index 662e98387bc9..254052632eef 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml
@@ -1,4 +1,4 @@
 directory: specification/cognitiveservices/Speech.Transcription
-commit: 8d0f5874791340795bf703782e906786063d79d1
+commit: 3c52e9d0eadc790cef71559d1979694f1bb501be
 repo: Azure/azure-rest-api-specs
 additionalDirectories:
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/tspconfig.yaml b/sdk/cognitiveservices/azure-ai-speech-transcription/tspconfig.yaml
new file mode 100644
index 000000000000..12921c42a3f4
--- /dev/null
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/tspconfig.yaml
@@ -0,0 +1,7 @@
+emit:
+  - "@azure-tools/typespec-java"
+options:
+  "@azure-tools/typespec-java":
+    customization-class: "SpeechTranscriptionCustomization"
+    namespace: "com.azure.ai.speech.transcription"
+    service-name: "Transcription"

From 922d7c8b00fc81f316c82d23a5a0e1f11997ae19 Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Thu, 13 Nov 2025 14:18:50 -0800
Subject: [PATCH 16/45] update test

---
 .../com/azure/ai/speech/transcription/ReadmeSamples.java   | 7 +++++++
 .../speech/transcription/TranscriptionAsyncClientTest.java | 3 +++
 .../speech/transcription/TranscriptionClientTestBase.java  | 4 ++++
 3 files changed, 14 insertions(+)

diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
index b65c96235e68..713ae82a1582 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
@@ -4,6 +4,13 @@
 
 package com.azure.ai.speech.transcription;
 
+import com.azure.ai.speech.transcription.models.AudioFileDetails;
+import com.azure.ai.speech.transcription.models.EnhancedModeOptions;
+import com.azure.ai.speech.transcription.models.ProfanityFilterMode;
+import com.azure.ai.speech.transcription.models.TranscriptionContent;
+import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions;
+import com.azure.ai.speech.transcription.models.TranscriptionOptions;
+import com.azure.ai.speech.transcription.models.TranscriptionResult;
 import com.azure.core.credential.KeyCredential;
 import com.azure.core.http.policy.ExponentialBackoffOptions;
 import com.azure.core.http.policy.HttpLogDetailLevel;
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java
index 7d66e5a58756..6c58f873c4f2 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java
@@ -3,6 +3,9 @@
 
 package com.azure.ai.speech.transcription;
 
+import com.azure.ai.speech.transcription.models.ProfanityFilterMode;
+import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions;
+import com.azure.ai.speech.transcription.models.TranscriptionOptions;
 import com.azure.core.http.HttpHeaderName;
 import com.azure.core.http.rest.RequestOptions;
 import org.junit.jupiter.api.Test;
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java
index 2faf559004b9..d949a221e3b9 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java
@@ -3,6 +3,10 @@
 
 package com.azure.ai.speech.transcription;
 
+import com.azure.ai.speech.transcription.models.AudioFileDetails;
+import com.azure.ai.speech.transcription.models.TranscriptionContent;
+import com.azure.ai.speech.transcription.models.TranscriptionOptions;
+import com.azure.ai.speech.transcription.models.TranscriptionResult;
 import com.azure.core.credential.KeyCredential;
 import com.azure.core.credential.TokenCredential;
 import com.azure.core.http.HttpRequest;

From fa0ed7967a150ef6070f7999fbf3e95068d97f06 Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Thu, 13 Nov 2025 14:34:06 -0800
Subject: [PATCH 17/45] fix linting

---
 .../src/main/java/SpeechTranscriptionCustomization.java   | 8 ++++----
 .../ai/speech/transcription/TranscriptionAsyncClient.java | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
index 5fe7c6314163..6d6681d0ab27 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
@@ -180,8 +180,8 @@ private void customizeTranscriptionClient(PackageCustomization packageCustomizat
                     if (method.getParameters().size() == 1
                         && "TranscriptionContent".equals(method.getParameter(0).getType().asString())
                         && method.getAnnotationByName("Generated").isPresent()) {
-                        // Remove public modifier, making it package-private (no modifiers = package-private)
-                        method.setModifiers();
+                        // Remove all modifiers (including final), making it package-private
+                        method.getModifiers().clear();
                         // Remove @Generated annotation to prevent overwriting
                         method.getAnnotationByName("Generated").ifPresent(com.github.javaparser.ast.Node::remove);
                     }
@@ -205,8 +205,8 @@ private void customizeTranscriptionAsyncClient(PackageCustomization packageCusto
                     if (method.getParameters().size() == 1
                         && "TranscriptionContent".equals(method.getParameter(0).getType().asString())
                         && method.getAnnotationByName("Generated").isPresent()) {
-                        // Remove public modifier, making it package-private (no modifiers = package-private)
-                        method.setModifiers();
+                        // Remove all modifiers (including final), making it package-private
+                        method.getModifiers().clear();
                         // Remove @Generated annotation to prevent overwriting
                         method.getAnnotationByName("Generated").ifPresent(com.github.javaparser.ast.Node::remove);
                     }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
index dcc0d3fffecd..791565f03c97 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
@@ -110,7 +110,7 @@ Mono> transcribeWithResponse(BinaryData body, RequestOption
      * @return the result of the transcribe operation on successful completion of {@link Mono}.
      */
     @ServiceMethod(returns = ReturnType.SINGLE)
-    final Mono transcribe(TranscriptionContent body) {
+    Mono transcribe(TranscriptionContent body) {
         // Generated convenience method for transcribeWithResponse
         RequestOptions requestOptions = new RequestOptions();
         return transcribeWithResponse(

From e94da0c0be82dc76bb9684392dd44b79a2d3e03d Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Fri, 14 Nov 2025 11:31:12 -0800
Subject: [PATCH 18/45] add codeowner

---
 .github/CODEOWNERS                            |  7 ++++
 .../azure/ai/speech/transcription/README.md   | 35 +++++++++++++++----
 2 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 075d992679ec..1fb652359030 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -265,6 +265,13 @@
 # ServiceLabel: %Cognitive - Speech
 # ServiceOwners:                                                   @rhurey
 
+# PRLabel: %Cognitive - Speech Transcription
+/sdk/cognitiveservices/azure-ai-speech-transcription/              @amber-yujueWang @rhurey @xitzhang @Azure/azure-java-sdk
+
+# ServiceLabel: %Cognitive - Speech Transcription
+# AzureSdkOwners:                                                  @amber-yujueWang @rhurey @xitzhang
+# ServiceOwners:                                                   @rhurey @xitzhang @amber-yujueWang
+
 # PRLabel: %Cognitive - Text Analytics
 /sdk/textanalytics/                                                @samvaity @quentinRobinson @Azure/azure-java-sdk
 
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md
index 306cc5160299..a4701b66bb33 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md
@@ -10,18 +10,41 @@ To run these samples, you need:
 2. **Azure AI Speech Service Resource**: Create one in the [Azure Portal](https://portal.azure.com)
 3. **Authentication**: Choose one of the following authentication methods:
 
-   ### Option 1: API Key Authentication (Easier for Getting Started)
+   ### Option 1: Azure AD Authentication (Recommended for Production)
    
-   Set these environment variables:
+   Set the endpoint and configure Azure AD credentials:
    
    ```bash
    set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/
-   set SPEECH_API_KEY=your-api-key
    ```
    
-   ### Option 2: Azure AD Authentication (Recommended for Production)
+   **And** configure one of the following credential sources:
+   - **Managed Identity**: For apps running in Azure (App Service, Azure Functions, VMs, etc.)
+   - **Azure CLI**: Run `az login` on your development machine
+   - **Environment Variables**: Set `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, and `AZURE_CLIENT_SECRET`
+   - **Visual Studio Code or IntelliJ**: Sign in through your IDE
    
-   Set the endpoint and configure Azure AD credentials:
+   **Note**: You'll also need to assign the "Cognitive Services User" role to your identity:
+   
+   ```bash
+   az role assignment create --assignee  \
+       --role "Cognitive Services User" \
+       --scope /subscriptions//resourceGroups//providers/Microsoft.CognitiveServices/accounts/
+   ```
+   
+   **Required dependency** for Azure AD authentication:
+   
+   ```xml
+   
+       com.azure
+       azure-identity
+       1.13.0
+   
+   ```
+
+   ### Option 2: API Key Authentication (Easier for Getting Started)
+   
+   Set these environment variables:
    
    ```bash
    set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/
@@ -57,8 +80,8 @@ To run these samples, you need:
 
 All samples in this directory support **both authentication methods**:
 
-- **API Key (KeyCredential)**: Uses the `SPEECH_API_KEY` environment variable
 - **Azure AD (TokenCredential)**: Uses `DefaultAzureCredential` from azure-identity
+- **API Key (KeyCredential)**: Uses the `SPEECH_API_KEY` environment variable
 
 The samples will automatically detect which authentication method to use based on the environment variables you've set. If `SPEECH_API_KEY` is set, it will use API Key authentication; otherwise, it will attempt Azure AD authentication.
 

From b90a52608936ea5d9beab993ae87f03b40e11cee Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Fri, 14 Nov 2025 11:45:33 -0800
Subject: [PATCH 19/45] add codeowner

---
 .github/CODEOWNERS | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index a5afe757d19a..caf61cf90e90 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -262,10 +262,10 @@
 # ServiceLabel: %Cognitive - Speech
 # ServiceOwners:                                                   @rhurey
 
-# PRLabel: %Cognitive - Speech Transcription
+# PRLabel: %Speech Transcription
 /sdk/cognitiveservices/azure-ai-speech-transcription/              @amber-yujueWang @rhurey @xitzhang @Azure/azure-java-sdk
 
-# ServiceLabel: %Cognitive - Speech Transcription
+# ServiceLabel: %Speech Transcription
 # AzureSdkOwners:                                                  @amber-yujueWang @rhurey @xitzhang
 # ServiceOwners:                                                   @rhurey @xitzhang @amber-yujueWang
 

From 4362af0f9d7c21eca8bbd7c866d98308239f55c3 Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Fri, 14 Nov 2025 12:06:14 -0800
Subject: [PATCH 20/45] add release date

---
 .../azure-ai-speech-transcription/CHANGELOG.md                  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md b/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md
index ca0f84c627e0..e7d3fe51a3c5 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md
@@ -1,6 +1,6 @@
 # Release History
 
-## 1.0.0-beta.1 (Unreleased)
+## 1.0.0-beta.1 (2025-11-14)
 
 - Azure Transcription client library for Java. This package contains Microsoft Azure Transcription client library.
 

From 4db7356b60236a7515be51287471079118ce2019 Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Fri, 14 Nov 2025 14:12:54 -0800
Subject: [PATCH 21/45] update changelog

---
 .../azure-ai-speech-transcription/CHANGELOG.md            | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md b/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md
index e7d3fe51a3c5..b36b5e47a44b 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md
@@ -2,12 +2,6 @@
 
 ## 1.0.0-beta.1 (2025-11-14)
 
-- Azure Transcription client library for Java. This package contains Microsoft Azure Transcription client library.
-
 ### Features Added
 
-### Breaking Changes
-
-### Bugs Fixed
-
-### Other Changes
+- Initial release of Azure AI Speech Transcription client library for Java.

From e7d237c12bbaac302c1232c5771b38b5b7b58572 Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Mon, 24 Nov 2025 15:47:30 -0800
Subject: [PATCH 22/45] add response

---
 .../SpeechTranscriptionCustomization.java     | 84 +++++++++++++++++--
 .../TranscriptionAsyncClient.java             | 44 ++++++++++
 .../transcription/TranscriptionClient.java    | 45 ++++++++++
 .../models/TranscriptionOptions.java          |  8 --
 .../tsp-location.yaml                         |  2 +-
 5 files changed, 166 insertions(+), 17 deletions(-)

diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
index 6d6681d0ab27..c79fa10becc1 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
@@ -114,7 +114,7 @@ private void customizeDiarizationOptionsToJson(PackageCustomization packageCusto
     /**
      * Customize TranscriptionOptions to:
      * 1. Add AudioFileDetails field (final)
-     * 2. Add initialization to default constructor
+     * 2. Remove default no-arg constructor
      * 3. Add constructor with String audioUrl parameter
      * 4. Add constructor with AudioFileDetails parameter
      * 5. Make setAudioUrl() private instead of public
@@ -129,15 +129,12 @@ private void customizeTranscriptionOptions(PackageCustomization packageCustomiza
                     com.github.javaparser.ast.Modifier.Keyword.PRIVATE,
                     com.github.javaparser.ast.Modifier.Keyword.FINAL);
 
-                // Update default constructor to initialize audioFileDetails
+                // Remove default no-arg constructor
                 clazz.getConstructors()
                     .stream()
                     .filter(c -> c.getParameters().isEmpty())
                     .findFirst()
-                    .ifPresent(defaultConstructor -> {
-                        BlockStmt body = defaultConstructor.getBody();
-                        body.addStatement(0, parseStatement("this.audioFileDetails = null;"));
-                    });
+                    .ifPresent(com.github.javaparser.ast.Node::remove);
 
                 // Add constructor with String audioUrl parameter
                 ConstructorDeclaration audioUrlConstructor = clazz.addConstructor(Modifier.Keyword.PUBLIC);
@@ -166,7 +163,7 @@ private void customizeTranscriptionOptions(PackageCustomization packageCustomiza
 
     /**
      * Customize TranscriptionClient to add public transcribe(TranscriptionOptions) method
-     * that hides TranscriptionContent construction.
+     * that hides TranscriptionContent construction and add transcribeWithResponse method.
      *
      * @param packageCustomization the package customization
      */
@@ -186,12 +183,48 @@ private void customizeTranscriptionClient(PackageCustomization packageCustomizat
                         method.getAnnotationByName("Generated").ifPresent(com.github.javaparser.ast.Node::remove);
                     }
                 });
+
+                // Add public transcribeWithResponse method that returns Response
+                com.github.javaparser.ast.body.MethodDeclaration transcribeWithResponseMethod = clazz.addMethod("transcribeWithResponse", Modifier.Keyword.PUBLIC)
+                    .addParameter("TranscriptionOptions", "options")
+                    .setType("Response");
+                com.github.javaparser.ast.expr.NormalAnnotationExpr serviceMethodAnnotation = new com.github.javaparser.ast.expr.NormalAnnotationExpr();
+                serviceMethodAnnotation.setName("ServiceMethod");
+                serviceMethodAnnotation.addPair("returns", "ReturnType.SINGLE");
+                transcribeWithResponseMethod.addAnnotation(serviceMethodAnnotation);
+                transcribeWithResponseMethod.setBody(parseBlock(
+                        "{ TranscriptionContent requestContent = new TranscriptionContent(); "
+                        + "requestContent.setOptions(options); "
+                        + "RequestOptions requestOptions = new RequestOptions(); "
+                        + "Response response = transcribeWithResponse("
+                        + "new MultipartFormDataHelper(requestOptions).serializeJsonField(\"definition\", requestContent.getOptions())"
+                        + ".serializeFileField(\"audio\", requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(), "
+                        + "requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(), "
+                        + "requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename())"
+                        + ".end().getRequestBody(), requestOptions); "
+                        + "return new Response() { "
+                        + "public int getStatusCode() { return response.getStatusCode(); } "
+                        + "public com.azure.core.http.HttpHeaders getHeaders() { return response.getHeaders(); } "
+                        + "public com.azure.core.http.HttpRequest getRequest() { return response.getRequest(); } "
+                        + "public TranscriptionResult getValue() { return response.getValue().toObject(TranscriptionResult.class); } "
+                        + "}; }"));
+                transcribeWithResponseMethod.setJavadocComment(new Javadoc(parseText(
+                        "Transcribes the provided audio stream with the specified options."))
+                        .addBlockTag("param", "options the transcription options including audio file details or audio URL")
+                        .addBlockTag("throws", "IllegalArgumentException thrown if parameters fail the validation.")
+                        .addBlockTag("throws", "HttpResponseException thrown if the request is rejected by server.")
+                        .addBlockTag("throws", "ClientAuthenticationException thrown if the request is rejected by server on status code 401.")
+                        .addBlockTag("throws", "ResourceNotFoundException thrown if the request is rejected by server on status code 404.")
+                        .addBlockTag("throws", "ResourceModifiedException thrown if the request is rejected by server on status code 409.")
+                        .addBlockTag("throws", "RuntimeException all other wrapped checked exceptions if the request fails to be sent.")
+                        .addBlockTag("return", "the response containing the result of the transcribe operation."));
             });
         });
     }
 
     /**
-     * Customize TranscriptionAsyncClient to make transcribe(TranscriptionContent) package-private (internal).
+     * Customize TranscriptionAsyncClient to make transcribe(TranscriptionContent) package-private (internal)
+     * and add transcribeWithResponse method.
      *
      * @param packageCustomization the package customization
      */
@@ -211,6 +244,41 @@ private void customizeTranscriptionAsyncClient(PackageCustomization packageCusto
                         method.getAnnotationByName("Generated").ifPresent(com.github.javaparser.ast.Node::remove);
                     }
                 });
+
+                // Add public transcribeWithResponse method that returns Mono>
+                com.github.javaparser.ast.body.MethodDeclaration transcribeWithResponseMethod = clazz.addMethod("transcribeWithResponse", Modifier.Keyword.PUBLIC)
+                    .addParameter("TranscriptionOptions", "options")
+                    .setType("Mono>");
+                com.github.javaparser.ast.expr.NormalAnnotationExpr serviceMethodAnnotation = new com.github.javaparser.ast.expr.NormalAnnotationExpr();
+                serviceMethodAnnotation.setName("ServiceMethod");
+                serviceMethodAnnotation.addPair("returns", "ReturnType.SINGLE");
+                transcribeWithResponseMethod.addAnnotation(serviceMethodAnnotation);
+                transcribeWithResponseMethod.setBody(parseBlock(
+                        "{ TranscriptionContent requestContent = new TranscriptionContent(); "
+                        + "requestContent.setOptions(options); "
+                        + "RequestOptions requestOptions = new RequestOptions(); "
+                        + "return transcribeWithResponse("
+                        + "new MultipartFormDataHelper(requestOptions).serializeJsonField(\"definition\", requestContent.getOptions())"
+                        + ".serializeFileField(\"audio\", requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(), "
+                        + "requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(), "
+                        + "requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename())"
+                        + ".end().getRequestBody(), requestOptions)"
+                        + ".map(response -> new Response() { "
+                        + "public int getStatusCode() { return response.getStatusCode(); } "
+                        + "public com.azure.core.http.HttpHeaders getHeaders() { return response.getHeaders(); } "
+                        + "public com.azure.core.http.HttpRequest getRequest() { return response.getRequest(); } "
+                        + "public TranscriptionResult getValue() { return response.getValue().toObject(TranscriptionResult.class); } "
+                        + "}); }"));
+                transcribeWithResponseMethod.setJavadocComment(new Javadoc(parseText(
+                        "Transcribes the provided audio stream with the specified options."))
+                        .addBlockTag("param", "options the transcription options including audio file details or audio URL")
+                        .addBlockTag("throws", "IllegalArgumentException thrown if parameters fail the validation.")
+                        .addBlockTag("throws", "HttpResponseException thrown if the request is rejected by server.")
+                        .addBlockTag("throws", "ClientAuthenticationException thrown if the request is rejected by server on status code 401.")
+                        .addBlockTag("throws", "ResourceNotFoundException thrown if the request is rejected by server on status code 404.")
+                        .addBlockTag("throws", "ResourceModifiedException thrown if the request is rejected by server on status code 409.")
+                        .addBlockTag("throws", "RuntimeException all other wrapped checked exceptions if the request fails to be sent.")
+                        .addBlockTag("return", "the response containing the result of the transcribe operation on successful completion of Mono."));
             });
         });
     }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
index 791565f03c97..c0213abf0d9b 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
@@ -142,4 +142,48 @@ public Mono transcribe(TranscriptionOptions options) {
         requestContent.setOptions(options);
         return transcribe(requestContent);
     }
+
+    /**
+     * Transcribes the provided audio stream with the specified options.
+     *
+     * @param options the transcription options including audio file details or audio URL
+     * @throws IllegalArgumentException thrown if parameters fail the validation.
+     * @throws HttpResponseException thrown if the request is rejected by server.
+     * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.
+     * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.
+     * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.
+     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
+     * @return the response containing the result of the transcribe operation on successful completion of Mono.
+     */
+    public Mono> transcribeWithResponse(TranscriptionOptions options) {
+        TranscriptionContent requestContent = new TranscriptionContent();
+        requestContent.setOptions(options);
+        RequestOptions requestOptions = new RequestOptions();
+        return transcribeWithResponse(
+            new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", requestContent.getOptions())
+                .serializeFileField("audio",
+                    requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(),
+                    requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(),
+                    requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename())
+                .end()
+                .getRequestBody(),
+            requestOptions).map(response -> new Response() {
+
+                public int getStatusCode() {
+                    return response.getStatusCode();
+                }
+
+                public com.azure.core.http.HttpHeaders getHeaders() {
+                    return response.getHeaders();
+                }
+
+                public com.azure.core.http.HttpRequest getRequest() {
+                    return response.getRequest();
+                }
+
+                public TranscriptionResult getValue() {
+                    return response.getValue().toObject(TranscriptionResult.class);
+                }
+            });
+    }
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
index b457dcd6b306..18cf99e54607 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
@@ -138,4 +138,49 @@ public TranscriptionResult transcribe(TranscriptionOptions options) {
         requestContent.setOptions(options);
         return transcribe(requestContent);
     }
+
+    /**
+     * Transcribes the provided audio stream with the specified options.
+     *
+     * @param options the transcription options including audio file details or audio URL
+     * @throws IllegalArgumentException thrown if parameters fail the validation.
+     * @throws HttpResponseException thrown if the request is rejected by server.
+     * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.
+     * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.
+     * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.
+     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
+     * @return the response containing the result of the transcribe operation.
+     */
+    public Response transcribeWithResponse(TranscriptionOptions options) {
+        TranscriptionContent requestContent = new TranscriptionContent();
+        requestContent.setOptions(options);
+        RequestOptions requestOptions = new RequestOptions();
+        Response response = transcribeWithResponse(
+            new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", requestContent.getOptions())
+                .serializeFileField("audio",
+                    requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(),
+                    requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(),
+                    requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename())
+                .end()
+                .getRequestBody(),
+            requestOptions);
+        return new Response() {
+
+            public int getStatusCode() {
+                return response.getStatusCode();
+            }
+
+            public com.azure.core.http.HttpHeaders getHeaders() {
+                return response.getHeaders();
+            }
+
+            public com.azure.core.http.HttpRequest getRequest() {
+                return response.getRequest();
+            }
+
+            public TranscriptionResult getValue() {
+                return response.getValue().toObject(TranscriptionResult.class);
+            }
+        };
+    }
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java
index 57f157c2c68e..146b3b7f1b6f 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java
@@ -71,14 +71,6 @@ public final class TranscriptionOptions implements JsonSerializable
Date: Thu, 4 Dec 2025 16:57:12 -0800
Subject: [PATCH 23/45] update sample, readme, tests

---
 .../azure-ai-speech-transcription/README.md   |  35 +---
 .../SpeechTranscriptionCustomization.java     | 157 +++++++++++-------
 .../TranscriptionAsyncClient.java             |  41 ++---
 .../transcription/TranscriptionClient.java    |  41 ++---
 .../models/TranscriptionContent.java          |  58 +++----
 .../models/TranscriptionOptions.java          |  13 +-
 .../src/samples/assets/sample-audio.wav       | Bin 0 -> 764562 bytes
 .../transcription/EnhancedModeSample.java     |   2 +-
 .../speech/transcription/ReadmeSamples.java   |  70 +++-----
 .../TranscriptionAsyncClientTest.java         |  37 +++--
 .../TranscriptionClientTest.java              |  47 +++---
 .../TranscriptionClientTestBase.java          |  34 ++--
 12 files changed, 261 insertions(+), 274 deletions(-)
 create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/assets/sample-audio.wav

diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
index 4641d025f82e..b1de34991448 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
@@ -141,15 +141,11 @@ try {
     // Create transcription options
     TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
-    // Create transcribe request content
-    TranscriptionContent requestContent = new TranscriptionContent()
-        .setOptions(options);
-
     // Transcribe audio
-    TranscriptionResult result = client.transcribe(requestContent);
+    TranscriptionResult result = client.transcribe(options);
 
     // Process results
-    System.out.println("Duration: " + result.getDuration() + "ms");
+    System.out.println("Duration: " + result.getDuration() + " ms");
     result.getCombinedPhrases().forEach(phrase -> {
         System.out.println("Channel " + phrase.getChannel() + ": " + phrase.getText());
     });
@@ -171,12 +167,8 @@ TranscriptionClient client = new TranscriptionClientBuilder()
 // Create transcription options with audio URL
 TranscriptionOptions options = new TranscriptionOptions("https://example.com/audio.wav");
 
-// Create transcribe request content
-TranscriptionContent requestContent = new TranscriptionContent()
-    .setOptions(options);
-
 // Transcribe audio
-TranscriptionResult result = client.transcribe(requestContent);
+TranscriptionResult result = client.transcribe(options);
 
 // Process results
 result.getCombinedPhrases().forEach(phrase -> {
@@ -205,12 +197,8 @@ AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(au
 // Create transcription options with AudioFileDetails
 TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
-// Create transcribe request content
-TranscriptionContent requestContent = new TranscriptionContent()
-    .setOptions(options);
-
 // Transcribe audio
-TranscriptionResult result = client.transcribe(requestContent);
+TranscriptionResult result = client.transcribe(options);
 
 // Process results
 result.getCombinedPhrases().forEach(phrase -> {
@@ -237,10 +225,7 @@ TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
     .setLocales(java.util.Arrays.asList("en-US"))
     .setEnhancedModeOptions(enhancedMode);
 
-TranscriptionContent requestContent = new TranscriptionContent()
-    .setOptions(options);
-
-TranscriptionResult result = client.transcribe(requestContent);
+TranscriptionResult result = client.transcribe(options);
 ```
 
 #### Enhanced mode with custom prompts
@@ -265,10 +250,7 @@ TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
     .setLocales(java.util.Arrays.asList("en-US"))
     .setEnhancedModeOptions(enhancedMode);
 
-TranscriptionContent requestContent = new TranscriptionContent()
-    .setOptions(options);
-
-TranscriptionResult result = client.transcribe(requestContent);
+TranscriptionResult result = client.transcribe(options);
 ```
 
 #### Enhanced mode with translation
@@ -289,10 +271,7 @@ TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
     .setLocales(java.util.Arrays.asList("es-ES")) // Source language: Spanish
     .setEnhancedModeOptions(enhancedMode);
 
-TranscriptionContent requestContent = new TranscriptionContent()
-    .setOptions(options);
-
-TranscriptionResult result = client.transcribe(requestContent);
+TranscriptionResult result = client.transcribe(options);
 ```
 
 ### Service API versions
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
index c79fa10becc1..ba0a9043cac7 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
@@ -59,9 +59,9 @@ public void customize(LibraryCustomization customization, Logger logger) {
             logger.info("Customizing TranscriptionDiarizationOptions.toJson()");
             customizeDiarizationOptionsToJson(models);
 
-            // Add AudioFileDetails field and constructors to TranscriptionOptions, make setAudioUrl private
-            logger.info(
-                "Customizing TranscriptionOptions to add AudioFileDetails support and String audioUrl constructor");
+            // Add AudioFileDetails field and constructors to TranscriptionOptions, make setAudioUrl private, remove no-arg constructor
+            logger
+                .info("Customizing TranscriptionOptions to add AudioFileDetails support and remove no-arg constructor");
             customizeTranscriptionOptions(models);
         } catch (IllegalArgumentException e) {
             logger.warn("Models package not found or empty - skipping model customizations: " + e.getMessage());
@@ -117,7 +117,9 @@ private void customizeDiarizationOptionsToJson(PackageCustomization packageCusto
      * 2. Remove default no-arg constructor
      * 3. Add constructor with String audioUrl parameter
      * 4. Add constructor with AudioFileDetails parameter
-     * 5. Make setAudioUrl() private instead of public
+     * 5. Add getFileDetails() method to access AudioFileDetails
+     * 6. Make setAudioUrl() private instead of public
+     * 7. Fix fromJson to use one of the parameterized constructors
      *
      * @param packageCustomization the package customization
      */
@@ -136,6 +138,36 @@ private void customizeTranscriptionOptions(PackageCustomization packageCustomiza
                     .findFirst()
                     .ifPresent(com.github.javaparser.ast.Node::remove);
 
+                // Fix fromJson method to use parameterized constructor instead of no-arg
+                clazz.getMethodsByName("fromJson").forEach(method -> {
+                    // Replace the entire method body to use the String constructor
+                    method.setBody(parseBlock("{ return jsonReader.readObject(reader -> { "
+                        + "TranscriptionOptions deserializedTranscriptionOptions = new TranscriptionOptions((String) null); "
+                        + "while (reader.nextToken() != JsonToken.END_OBJECT) { "
+                        + "String fieldName = reader.getFieldName(); " + "reader.nextToken(); "
+                        + "if (\"audioUrl\".equals(fieldName)) { "
+                        + "deserializedTranscriptionOptions.audioUrl = reader.getString(); "
+                        + "} else if (\"locales\".equals(fieldName)) { "
+                        + "List locales = reader.readArray(reader1 -> reader1.getString()); "
+                        + "deserializedTranscriptionOptions.locales = locales; "
+                        + "} else if (\"localeModelMapping\".equals(fieldName)) { "
+                        + "Map localeModelMapping = reader.readMap(reader1 -> reader1.getString()); "
+                        + "deserializedTranscriptionOptions.localeModelMapping = localeModelMapping; "
+                        + "} else if (\"profanityFilterMode\".equals(fieldName)) { "
+                        + "deserializedTranscriptionOptions.profanityFilterMode = ProfanityFilterMode.fromString(reader.getString()); "
+                        + "} else if (\"diarization\".equals(fieldName)) { "
+                        + "deserializedTranscriptionOptions.diarizationOptions = TranscriptionDiarizationOptions.fromJson(reader); "
+                        + "} else if (\"channels\".equals(fieldName)) { "
+                        + "List activeChannels = reader.readArray(reader1 -> reader1.getInt()); "
+                        + "deserializedTranscriptionOptions.activeChannels = activeChannels; "
+                        + "} else if (\"enhancedMode\".equals(fieldName)) { "
+                        + "deserializedTranscriptionOptions.enhancedModeOptions = EnhancedModeOptions.fromJson(reader); "
+                        + "} else if (\"phraseList\".equals(fieldName)) { "
+                        + "deserializedTranscriptionOptions.phraseListOptions = PhraseListOptions.fromJson(reader); "
+                        + "} else { " + "reader.skipChildren(); " + "} " + "} "
+                        + "return deserializedTranscriptionOptions; " + "}); }"));
+                });
+
                 // Add constructor with String audioUrl parameter
                 ConstructorDeclaration audioUrlConstructor = clazz.addConstructor(Modifier.Keyword.PUBLIC);
                 audioUrlConstructor.addParameter("String", "audioUrl");
@@ -152,6 +184,15 @@ private void customizeTranscriptionOptions(PackageCustomization packageCustomiza
                     new Javadoc(parseText("Creates an instance of TranscriptionOptions class with audio file details."))
                         .addBlockTag("param", "fileDetails the audio file details"));
 
+                // Add getFileDetails() method
+                com.github.javaparser.ast.body.MethodDeclaration getFileDetailsMethod
+                    = clazz.addMethod("getFileDetails", Modifier.Keyword.PUBLIC);
+                getFileDetailsMethod.setType("AudioFileDetails");
+                getFileDetailsMethod.setBody(parseBlock("{ return this.audioFileDetails; }"));
+                getFileDetailsMethod.setJavadocComment(new Javadoc(
+                    parseText("Get the audioFileDetails property: The audio file details for transcription."))
+                        .addBlockTag("return", "the audioFileDetails value."));
+
                 // Make setAudioUrl() private
                 clazz.getMethodsByName("setAudioUrl").forEach(method -> {
                     method.getModifiers().clear();
@@ -185,38 +226,39 @@ private void customizeTranscriptionClient(PackageCustomization packageCustomizat
                 });
 
                 // Add public transcribeWithResponse method that returns Response
-                com.github.javaparser.ast.body.MethodDeclaration transcribeWithResponseMethod = clazz.addMethod("transcribeWithResponse", Modifier.Keyword.PUBLIC)
-                    .addParameter("TranscriptionOptions", "options")
-                    .setType("Response");
-                com.github.javaparser.ast.expr.NormalAnnotationExpr serviceMethodAnnotation = new com.github.javaparser.ast.expr.NormalAnnotationExpr();
+                com.github.javaparser.ast.body.MethodDeclaration transcribeWithResponseMethod
+                    = clazz.addMethod("transcribeWithResponse", Modifier.Keyword.PUBLIC)
+                        .addParameter("TranscriptionOptions", "options")
+                        .setType("Response");
+                com.github.javaparser.ast.expr.NormalAnnotationExpr serviceMethodAnnotation
+                    = new com.github.javaparser.ast.expr.NormalAnnotationExpr();
                 serviceMethodAnnotation.setName("ServiceMethod");
                 serviceMethodAnnotation.addPair("returns", "ReturnType.SINGLE");
                 transcribeWithResponseMethod.addAnnotation(serviceMethodAnnotation);
-                transcribeWithResponseMethod.setBody(parseBlock(
-                        "{ TranscriptionContent requestContent = new TranscriptionContent(); "
-                        + "requestContent.setOptions(options); "
+                transcribeWithResponseMethod
+                    .setBody(parseBlock("{ TranscriptionContent requestContent = new TranscriptionContent(options); "
+                        + "AudioFileDetails audio = requestContent.getAudio() != null ? requestContent.getAudio() : options.getFileDetails(); "
                         + "RequestOptions requestOptions = new RequestOptions(); "
                         + "Response response = transcribeWithResponse("
-                        + "new MultipartFormDataHelper(requestOptions).serializeJsonField(\"definition\", requestContent.getOptions())"
-                        + ".serializeFileField(\"audio\", requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(), "
-                        + "requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(), "
-                        + "requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename())"
-                        + ".end().getRequestBody(), requestOptions); "
-                        + "return new Response() { "
-                        + "public int getStatusCode() { return response.getStatusCode(); } "
-                        + "public com.azure.core.http.HttpHeaders getHeaders() { return response.getHeaders(); } "
-                        + "public com.azure.core.http.HttpRequest getRequest() { return response.getRequest(); } "
-                        + "public TranscriptionResult getValue() { return response.getValue().toObject(TranscriptionResult.class); } "
-                        + "}; }"));
-                transcribeWithResponseMethod.setJavadocComment(new Javadoc(parseText(
-                        "Transcribes the provided audio stream with the specified options."))
-                        .addBlockTag("param", "options the transcription options including audio file details or audio URL")
+                        + "new MultipartFormDataHelper(requestOptions).serializeJsonField(\"options\", requestContent.getOptions())"
+                        + ".serializeFileField(\"audio\", audio == null ? null : audio.getContent(), "
+                        + "audio == null ? null : audio.getContentType(), "
+                        + "audio == null ? null : audio.getFilename())" + ".end().getRequestBody(), requestOptions); "
+                        + "return new SimpleResponse<>(response, response.getValue().toObject(TranscriptionResult.class)); }"));
+                transcribeWithResponseMethod.setJavadocComment(
+                    new Javadoc(parseText("Transcribes the provided audio stream with the specified options."))
+                        .addBlockTag("param",
+                            "options the transcription options including audio file details or audio URL")
                         .addBlockTag("throws", "IllegalArgumentException thrown if parameters fail the validation.")
                         .addBlockTag("throws", "HttpResponseException thrown if the request is rejected by server.")
-                        .addBlockTag("throws", "ClientAuthenticationException thrown if the request is rejected by server on status code 401.")
-                        .addBlockTag("throws", "ResourceNotFoundException thrown if the request is rejected by server on status code 404.")
-                        .addBlockTag("throws", "ResourceModifiedException thrown if the request is rejected by server on status code 409.")
-                        .addBlockTag("throws", "RuntimeException all other wrapped checked exceptions if the request fails to be sent.")
+                        .addBlockTag("throws",
+                            "ClientAuthenticationException thrown if the request is rejected by server on status code 401.")
+                        .addBlockTag("throws",
+                            "ResourceNotFoundException thrown if the request is rejected by server on status code 404.")
+                        .addBlockTag("throws",
+                            "ResourceModifiedException thrown if the request is rejected by server on status code 409.")
+                        .addBlockTag("throws",
+                            "RuntimeException all other wrapped checked exceptions if the request fails to be sent.")
                         .addBlockTag("return", "the response containing the result of the transcribe operation."));
             });
         });
@@ -246,39 +288,40 @@ private void customizeTranscriptionAsyncClient(PackageCustomization packageCusto
                 });
 
                 // Add public transcribeWithResponse method that returns Mono>
-                com.github.javaparser.ast.body.MethodDeclaration transcribeWithResponseMethod = clazz.addMethod("transcribeWithResponse", Modifier.Keyword.PUBLIC)
-                    .addParameter("TranscriptionOptions", "options")
-                    .setType("Mono>");
-                com.github.javaparser.ast.expr.NormalAnnotationExpr serviceMethodAnnotation = new com.github.javaparser.ast.expr.NormalAnnotationExpr();
+                com.github.javaparser.ast.body.MethodDeclaration transcribeWithResponseMethod
+                    = clazz.addMethod("transcribeWithResponse", Modifier.Keyword.PUBLIC)
+                        .addParameter("TranscriptionOptions", "options")
+                        .setType("Mono>");
+                com.github.javaparser.ast.expr.NormalAnnotationExpr serviceMethodAnnotation
+                    = new com.github.javaparser.ast.expr.NormalAnnotationExpr();
                 serviceMethodAnnotation.setName("ServiceMethod");
                 serviceMethodAnnotation.addPair("returns", "ReturnType.SINGLE");
                 transcribeWithResponseMethod.addAnnotation(serviceMethodAnnotation);
-                transcribeWithResponseMethod.setBody(parseBlock(
-                        "{ TranscriptionContent requestContent = new TranscriptionContent(); "
-                        + "requestContent.setOptions(options); "
-                        + "RequestOptions requestOptions = new RequestOptions(); "
-                        + "return transcribeWithResponse("
-                        + "new MultipartFormDataHelper(requestOptions).serializeJsonField(\"definition\", requestContent.getOptions())"
-                        + ".serializeFileField(\"audio\", requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(), "
-                        + "requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(), "
-                        + "requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename())"
-                        + ".end().getRequestBody(), requestOptions)"
-                        + ".map(response -> new Response() { "
-                        + "public int getStatusCode() { return response.getStatusCode(); } "
-                        + "public com.azure.core.http.HttpHeaders getHeaders() { return response.getHeaders(); } "
-                        + "public com.azure.core.http.HttpRequest getRequest() { return response.getRequest(); } "
-                        + "public TranscriptionResult getValue() { return response.getValue().toObject(TranscriptionResult.class); } "
-                        + "}); }"));
-                transcribeWithResponseMethod.setJavadocComment(new Javadoc(parseText(
-                        "Transcribes the provided audio stream with the specified options."))
-                        .addBlockTag("param", "options the transcription options including audio file details or audio URL")
+                transcribeWithResponseMethod
+                    .setBody(parseBlock("{ TranscriptionContent requestContent = new TranscriptionContent(options); "
+                        + "AudioFileDetails audio = requestContent.getAudio() != null ? requestContent.getAudio() : options.getFileDetails(); "
+                        + "RequestOptions requestOptions = new RequestOptions(); " + "return transcribeWithResponse("
+                        + "new MultipartFormDataHelper(requestOptions).serializeJsonField(\"options\", requestContent.getOptions())"
+                        + ".serializeFileField(\"audio\", audio == null ? null : audio.getContent(), "
+                        + "audio == null ? null : audio.getContentType(), "
+                        + "audio == null ? null : audio.getFilename())" + ".end().getRequestBody(), requestOptions)"
+                        + ".map(response -> new SimpleResponse<>(response, response.getValue().toObject(TranscriptionResult.class))); }"));
+                transcribeWithResponseMethod.setJavadocComment(
+                    new Javadoc(parseText("Transcribes the provided audio stream with the specified options."))
+                        .addBlockTag("param",
+                            "options the transcription options including audio file details or audio URL")
                         .addBlockTag("throws", "IllegalArgumentException thrown if parameters fail the validation.")
                         .addBlockTag("throws", "HttpResponseException thrown if the request is rejected by server.")
-                        .addBlockTag("throws", "ClientAuthenticationException thrown if the request is rejected by server on status code 401.")
-                        .addBlockTag("throws", "ResourceNotFoundException thrown if the request is rejected by server on status code 404.")
-                        .addBlockTag("throws", "ResourceModifiedException thrown if the request is rejected by server on status code 409.")
-                        .addBlockTag("throws", "RuntimeException all other wrapped checked exceptions if the request fails to be sent.")
-                        .addBlockTag("return", "the response containing the result of the transcribe operation on successful completion of Mono."));
+                        .addBlockTag("throws",
+                            "ClientAuthenticationException thrown if the request is rejected by server on status code 401.")
+                        .addBlockTag("throws",
+                            "ResourceNotFoundException thrown if the request is rejected by server on status code 404.")
+                        .addBlockTag("throws",
+                            "ResourceModifiedException thrown if the request is rejected by server on status code 409.")
+                        .addBlockTag("throws",
+                            "RuntimeException all other wrapped checked exceptions if the request fails to be sent.")
+                        .addBlockTag("return",
+                            "the response containing the result of the transcribe operation on successful completion of Mono."));
             });
         });
     }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
index c0213abf0d9b..3c98bbd1d939 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
@@ -18,6 +18,7 @@
 import com.azure.core.exception.ResourceNotFoundException;
 import com.azure.core.http.rest.RequestOptions;
 import com.azure.core.http.rest.Response;
+import com.azure.core.http.rest.SimpleResponse;
 import com.azure.core.util.BinaryData;
 import com.azure.core.util.FluxUtil;
 import com.azure.core.util.logging.ClientLogger;
@@ -47,7 +48,7 @@ public final class TranscriptionAsyncClient {
     /**
      * Transcribes the provided audio stream.
      * 

Response Body Schema

- * + * *
      * {@code
      * {
@@ -114,7 +115,7 @@ Mono transcribe(TranscriptionContent body) {
         // Generated convenience method for transcribeWithResponse
         RequestOptions requestOptions = new RequestOptions();
         return transcribeWithResponse(
-            new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", body.getOptions())
+            new MultipartFormDataHelper(requestOptions).serializeJsonField("options", body.getOptions())
                 .serializeFileField("audio", body.getAudio() == null ? null : body.getAudio().getContent(),
                     body.getAudio() == null ? null : body.getAudio().getContentType(),
                     body.getAudio() == null ? null : body.getAudio().getFilename())
@@ -136,10 +137,13 @@ Mono transcribe(TranscriptionContent body) {
      * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
      * @return the result of the transcribe operation on successful completion of Mono.
      */
+    // Customized method added via post-generation customization
     @ServiceMethod(returns = ReturnType.SINGLE)
     public Mono transcribe(TranscriptionOptions options) {
-        TranscriptionContent requestContent = new TranscriptionContent();
-        requestContent.setOptions(options);
+        TranscriptionContent requestContent = new TranscriptionContent(options);
+        if (options.getFileDetails() != null) {
+            requestContent.setAudio(options.getFileDetails());
+        }
         return transcribe(requestContent);
     }
 
@@ -155,35 +159,22 @@ public Mono transcribe(TranscriptionOptions options) {
      * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
      * @return the response containing the result of the transcribe operation on successful completion of Mono.
      */
+    // Customized method added via post-generation customization
     public Mono> transcribeWithResponse(TranscriptionOptions options) {
-        TranscriptionContent requestContent = new TranscriptionContent();
-        requestContent.setOptions(options);
+        TranscriptionContent requestContent = new TranscriptionContent(options);
+        if (options.getFileDetails() != null) {
+            requestContent.setAudio(options.getFileDetails());
+        }
         RequestOptions requestOptions = new RequestOptions();
         return transcribeWithResponse(
-            new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", requestContent.getOptions())
+            new MultipartFormDataHelper(requestOptions).serializeJsonField("options", requestContent.getOptions())
                 .serializeFileField("audio",
                     requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(),
                     requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(),
                     requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename())
                 .end()
                 .getRequestBody(),
-            requestOptions).map(response -> new Response() {
-
-                public int getStatusCode() {
-                    return response.getStatusCode();
-                }
-
-                public com.azure.core.http.HttpHeaders getHeaders() {
-                    return response.getHeaders();
-                }
-
-                public com.azure.core.http.HttpRequest getRequest() {
-                    return response.getRequest();
-                }
-
-                public TranscriptionResult getValue() {
-                    return response.getValue().toObject(TranscriptionResult.class);
-                }
-            });
+            requestOptions).map(
+                response -> new SimpleResponse<>(response, response.getValue().toObject(TranscriptionResult.class)));
     }
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
index 18cf99e54607..206165ae7c35 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
@@ -18,6 +18,7 @@
 import com.azure.core.exception.ResourceNotFoundException;
 import com.azure.core.http.rest.RequestOptions;
 import com.azure.core.http.rest.Response;
+import com.azure.core.http.rest.SimpleResponse;
 import com.azure.core.util.BinaryData;
 import com.azure.core.util.logging.ClientLogger;
 
@@ -45,7 +46,7 @@ public final class TranscriptionClient {
     /**
      * Transcribes the provided audio stream.
      * 

Response Body Schema

- * + * *
      * {@code
      * {
@@ -111,7 +112,7 @@ TranscriptionResult transcribe(TranscriptionContent body) {
         // Generated convenience method for transcribeWithResponse
         RequestOptions requestOptions = new RequestOptions();
         return transcribeWithResponse(
-            new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", body.getOptions())
+            new MultipartFormDataHelper(requestOptions).serializeJsonField("options", body.getOptions())
                 .serializeFileField("audio", body.getAudio() == null ? null : body.getAudio().getContent(),
                     body.getAudio() == null ? null : body.getAudio().getContentType(),
                     body.getAudio() == null ? null : body.getAudio().getFilename())
@@ -120,6 +121,7 @@ TranscriptionResult transcribe(TranscriptionContent body) {
             requestOptions).getValue().toObject(TranscriptionResult.class);
     }
 
+    // Customized method added via post-generation customization
     /**
      * Transcribes the provided audio stream with the specified options.
      *
@@ -132,10 +134,13 @@ TranscriptionResult transcribe(TranscriptionContent body) {
      * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
      * @return the result of the transcribe operation.
      */
+    // Customized method added via post-generation customization
     @ServiceMethod(returns = ReturnType.SINGLE)
     public TranscriptionResult transcribe(TranscriptionOptions options) {
-        TranscriptionContent requestContent = new TranscriptionContent();
-        requestContent.setOptions(options);
+        TranscriptionContent requestContent = new TranscriptionContent(options);
+        if (options.getFileDetails() != null) {
+            requestContent.setAudio(options.getFileDetails());
+        }
         return transcribe(requestContent);
     }
 
@@ -151,12 +156,15 @@ public TranscriptionResult transcribe(TranscriptionOptions options) {
      * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
      * @return the response containing the result of the transcribe operation.
      */
+    // Customized method added via post-generation customization
     public Response transcribeWithResponse(TranscriptionOptions options) {
-        TranscriptionContent requestContent = new TranscriptionContent();
-        requestContent.setOptions(options);
+        TranscriptionContent requestContent = new TranscriptionContent(options);
+        if (options.getFileDetails() != null) {
+            requestContent.setAudio(options.getFileDetails());
+        }
         RequestOptions requestOptions = new RequestOptions();
         Response response = transcribeWithResponse(
-            new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", requestContent.getOptions())
+            new MultipartFormDataHelper(requestOptions).serializeJsonField("options", requestContent.getOptions())
                 .serializeFileField("audio",
                     requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(),
                     requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(),
@@ -164,23 +172,6 @@ public Response transcribeWithResponse(TranscriptionOptions
                 .end()
                 .getRequestBody(),
             requestOptions);
-        return new Response() {
-
-            public int getStatusCode() {
-                return response.getStatusCode();
-            }
-
-            public com.azure.core.http.HttpHeaders getHeaders() {
-                return response.getHeaders();
-            }
-
-            public com.azure.core.http.HttpRequest getRequest() {
-                return response.getRequest();
-            }
-
-            public TranscriptionResult getValue() {
-                return response.getValue().toObject(TranscriptionResult.class);
-            }
-        };
+        return new SimpleResponse<>(response, response.getValue().toObject(TranscriptionResult.class));
     }
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java
index e7b4a58a68de..5ba64e48e89e 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java
@@ -12,13 +12,6 @@
 @Fluent
 public final class TranscriptionContent {
 
-    /*
-     * Metadata for a transcription request. This field contains a JSON-serialized object of type
-     * `TranscriptionOptions`.
-     */
-    @Generated
-    private TranscriptionOptions options;
-
     /*
      * The content of the audio file to be transcribed. The audio file must be shorter than 2 hours in audio duration
      * and smaller than 250 MB in size. Optional if audioUrl is provided in the definition.
@@ -27,57 +20,54 @@ public final class TranscriptionContent {
     private AudioFileDetails audio;
 
     /**
-     * Creates an instance of TranscriptionContent class.
+     * Get the audio property: The content of the audio file to be transcribed. The audio file must be shorter than 2
+     * hours in audio duration and smaller than 250 MB in size. Optional if audioUrl is provided in the definition.
+     *
+     * @return the audio value.
      */
     @Generated
-    public TranscriptionContent() {
+    public AudioFileDetails getAudio() {
+        return this.audio;
     }
 
     /**
-     * Get the options property: Metadata for a transcription request. This field contains a JSON-serialized object of
-     * type `TranscriptionOptions`.
+     * Set the audio property: The content of the audio file to be transcribed. The audio file must be shorter than 2
+     * hours in audio duration and smaller than 250 MB in size. Optional if audioUrl is provided in the definition.
      *
-     * @return the options value.
+     * @param audio the audio value to set.
+     * @return the TranscriptionContent object itself.
      */
     @Generated
-    public TranscriptionOptions getOptions() {
-        return this.options;
+    public TranscriptionContent setAudio(AudioFileDetails audio) {
+        this.audio = audio;
+        return this;
     }
 
     /**
-     * Set the options property: Metadata for a transcription request. This field contains a JSON-serialized object of
-     * type `TranscriptionOptions`.
+     * Creates an instance of TranscriptionContent class.
      *
      * @param options the options value to set.
-     * @return the TranscriptionContent object itself.
      */
     @Generated
-    public TranscriptionContent setOptions(TranscriptionOptions options) {
+    public TranscriptionContent(TranscriptionOptions options) {
         this.options = options;
-        return this;
     }
 
-    /**
-     * Get the audio property: The content of the audio file to be transcribed. The audio file must be shorter than 2
-     * hours in audio duration and smaller than 250 MB in size. Optional if audioUrl is provided in the definition.
-     *
-     * @return the audio value.
+    /*
+     * Metadata for a transcription request. This field contains a JSON-serialized object of type
+     * `TranscriptionOptions`.
      */
     @Generated
-    public AudioFileDetails getAudio() {
-        return this.audio;
-    }
+    private final TranscriptionOptions options;
 
     /**
-     * Set the audio property: The content of the audio file to be transcribed. The audio file must be shorter than 2
-     * hours in audio duration and smaller than 250 MB in size. Optional if audioUrl is provided in the definition.
+     * Get the options property: Metadata for a transcription request. This field contains a JSON-serialized object of
+     * type `TranscriptionOptions`.
      *
-     * @param audio the audio value to set.
-     * @return the TranscriptionContent object itself.
+     * @return the options value.
      */
     @Generated
-    public TranscriptionContent setAudio(AudioFileDetails audio) {
-        this.audio = audio;
-        return this;
+    public TranscriptionOptions getOptions() {
+        return this.options;
     }
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java
index 146b3b7f1b6f..2b298d84d59a 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java
@@ -285,7 +285,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
     @Generated
     public static TranscriptionOptions fromJson(JsonReader jsonReader) throws IOException {
         return jsonReader.readObject(reader -> {
-            TranscriptionOptions deserializedTranscriptionOptions = new TranscriptionOptions();
+            TranscriptionOptions deserializedTranscriptionOptions = new TranscriptionOptions((String) null);
             while (reader.nextToken() != JsonToken.END_OBJECT) {
                 String fieldName = reader.getFieldName();
                 reader.nextToken();
@@ -294,7 +294,7 @@ public static TranscriptionOptions fromJson(JsonReader jsonReader) throws IOExce
                 } else if ("locales".equals(fieldName)) {
                     List locales = reader.readArray(reader1 -> reader1.getString());
                     deserializedTranscriptionOptions.locales = locales;
-                } else if ("models".equals(fieldName)) {
+                } else if ("localeModelMapping".equals(fieldName)) {
                     Map localeModelMapping = reader.readMap(reader1 -> reader1.getString());
                     deserializedTranscriptionOptions.localeModelMapping = localeModelMapping;
                 } else if ("profanityFilterMode".equals(fieldName)) {
@@ -338,4 +338,13 @@ public TranscriptionOptions(String audioUrl) {
     public TranscriptionOptions(AudioFileDetails fileDetails) {
         this.audioFileDetails = fileDetails;
     }
+
+    /**
+     * Get the audioFileDetails property: The audio file details for transcription.
+     *
+     * @return the audioFileDetails value.
+     */
+    public AudioFileDetails getFileDetails() {
+        return this.audioFileDetails;
+    }
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/assets/sample-audio.wav b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/assets/sample-audio.wav
new file mode 100644
index 0000000000000000000000000000000000000000..bf23d54b0c00ed3d980af954f9591a68d0d89550
GIT binary patch
literal 764562
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π(xQ4@{lk0NJ4*fEIfRNFyJheI^NQ1PM6% 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/giG-O$Hmoit%Qi*jU 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ⅆ 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

u>)@V&?Y{2Ngu*Td}cV0E2(S^lWB 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

xM;2qpC|3Z>Qj~U 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�K{TSnT)hHuT25`NneFi$tkk$M@%8Hz|>!3%1R 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 literal 0 HcmV?d00001 diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java index 1d1ed6a42d70..c894bc4eeff0 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java @@ -276,7 +276,7 @@ private static void demonstrateTaskSpecificEnhancedMode(String endpoint, String if (result.getPhrases() != null && !result.getPhrases().isEmpty()) { System.out.println("\nTranscription phrases:"); result.getPhrases().forEach(phrase -> - System.out.println(" [" + phrase.getOffset() + "ms] " + phrase.getText()) + System.out.println(" [" + phrase.getOffset() + " ms] " + phrase.getText()) ); } System.out.println(); diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java index 713ae82a1582..49a1bfe2a104 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java @@ -7,7 +7,6 @@ import com.azure.ai.speech.transcription.models.AudioFileDetails; import com.azure.ai.speech.transcription.models.EnhancedModeOptions; import com.azure.ai.speech.transcription.models.ProfanityFilterMode; -import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; @@ -43,15 +42,11 @@ public void readmeSamples() { // Create transcription options TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - // Create transcribe request content - TranscriptionContent requestContent = new TranscriptionContent() - .setOptions(options); - // Transcribe audio - TranscriptionResult result = client.transcribe(requestContent); + TranscriptionResult result = client.transcribe(options); // Process results - System.out.println("Duration: " + result.getDuration() + "ms"); + System.out.println("Duration: " + result.getDuration() + " ms"); result.getCombinedPhrases().forEach(phrase -> { System.out.println("Channel " + phrase.getChannel() + ": " + phrase.getText()); }); @@ -102,12 +97,9 @@ public void transcribeAudioSync() throws Exception { TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - TranscriptionContent requestContent = new TranscriptionContent() - .setOptions(options); - - TranscriptionResult result = client.transcribe(requestContent); + TranscriptionResult result = client.transcribe(options); - System.out.println("Duration: " + result.getDuration() + "ms"); + System.out.println("Duration: " + result.getDuration() + " ms"); result.getCombinedPhrases().forEach(phrase -> { System.out.println("Transcription: " + phrase.getText()); }); @@ -131,12 +123,9 @@ public void transcribeAudioAsync() throws Exception { TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - TranscriptionContent requestContent = new TranscriptionContent() - .setOptions(options); - - asyncClient.transcribe(requestContent) + asyncClient.transcribe(options) .subscribe(result -> { - System.out.println("Duration: " + result.getDuration() + "ms"); + System.out.println("Duration: " + result.getDuration() + " ms"); result.getCombinedPhrases().forEach(phrase -> { System.out.println("Transcription: " + phrase.getText()); }); @@ -166,16 +155,13 @@ public void advancedTranscriptionOptions() throws Exception { .setDiarizationOptions(new TranscriptionDiarizationOptions() // Enable speaker diarization .setMaxSpeakers(5)); - TranscriptionContent requestContent = new TranscriptionContent() - .setOptions(options); - - TranscriptionResult result = client.transcribe(requestContent); + TranscriptionResult result = client.transcribe(options); // Access detailed results result.getPhrases().forEach(phrase -> { System.out.println("Speaker " + phrase.getSpeaker() + ": " + phrase.getText()); System.out.println("Confidence: " + phrase.getConfidence()); - System.out.println("Offset: " + phrase.getOffset() + "ms"); + System.out.println("Offset: " + phrase.getOffset() + " ms"); }); // END: com.azure.ai.speech.transcription.transcriptionoptions.advanced } @@ -214,14 +200,13 @@ public void processDetailedResults() throws Exception { byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("audio.wav"); - TranscriptionContent requestContent = new TranscriptionContent() - .setOptions(new TranscriptionOptions(audioFileDetails)); + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); // BEGIN: com.azure.ai.speech.transcription.transcriptionresult.detailed - TranscriptionResult result = client.transcribe(requestContent); + TranscriptionResult result = client.transcribe(options); // Get overall duration - System.out.println("Total duration: " + result.getDuration() + "ms"); + System.out.println("Total duration: " + result.getDuration() + " ms"); // Process each phrase with detailed information result.getPhrases().forEach(phrase -> { @@ -230,14 +215,14 @@ public void processDetailedResults() throws Exception { System.out.println(" Speaker: " + phrase.getSpeaker()); System.out.println(" Locale: " + phrase.getLocale()); System.out.println(" Confidence: " + phrase.getConfidence()); - System.out.println(" Timing: " + phrase.getOffset() + "ms - " - + (phrase.getOffset() + phrase.getDuration().toMillis()) + "ms"); + System.out.println(" Timing: " + phrase.getOffset() + " ms - " + + (phrase.getOffset() + phrase.getDuration().toMillis()) + " ms"); // Process individual words with timestamps if (phrase.getWords() != null) { phrase.getWords().forEach(word -> { System.out.println(" Word: " + word.getText() + " @ " - + word.getOffset() + "ms"); + + word.getOffset() + " ms"); }); } }); @@ -266,10 +251,7 @@ public void enhancedModeBasic() throws Exception { .setLocales(java.util.Arrays.asList("en-US")) .setEnhancedModeOptions(enhancedMode); - TranscriptionContent requestContent = new TranscriptionContent() - .setOptions(options); - - TranscriptionResult result = client.transcribe(requestContent); + TranscriptionResult result = client.transcribe(options); // END: readme-sample-enhancedModeBasic } @@ -300,10 +282,7 @@ public void enhancedModeWithPrompts() throws Exception { .setLocales(java.util.Arrays.asList("en-US")) .setEnhancedModeOptions(enhancedMode); - TranscriptionContent requestContent = new TranscriptionContent() - .setOptions(options); - - TranscriptionResult result = client.transcribe(requestContent); + TranscriptionResult result = client.transcribe(options); // END: readme-sample-enhancedModeWithPrompts } @@ -330,10 +309,7 @@ public void enhancedModeWithTranslation() throws Exception { .setLocales(java.util.Arrays.asList("es-ES")) // Source language: Spanish .setEnhancedModeOptions(enhancedMode); - TranscriptionContent requestContent = new TranscriptionContent() - .setOptions(options); - - TranscriptionResult result = client.transcribe(requestContent); + TranscriptionResult result = client.transcribe(options); // END: readme-sample-enhancedModeWithTranslation } @@ -350,12 +326,8 @@ public void transcribeWithAudioUrl() { // Create transcription options with audio URL TranscriptionOptions options = new TranscriptionOptions("https://example.com/audio.wav"); - // Create transcribe request content - TranscriptionContent requestContent = new TranscriptionContent() - .setOptions(options); - // Transcribe audio - TranscriptionResult result = client.transcribe(requestContent); + TranscriptionResult result = client.transcribe(options); // Process results result.getCombinedPhrases().forEach(phrase -> { @@ -385,12 +357,8 @@ public void transcribeWithAudioFileDetails() throws Exception { // Create transcription options with AudioFileDetails TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - // Create transcribe request content - TranscriptionContent requestContent = new TranscriptionContent() - .setOptions(options); - // Transcribe audio - TranscriptionResult result = client.transcribe(requestContent); + TranscriptionResult result = client.transcribe(options); // Process results result.getCombinedPhrases().forEach(phrase -> { diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java index 6c58f873c4f2..430064d26afc 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java @@ -32,7 +32,7 @@ public void testTranscribeAsyncBasicFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions((String) null); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -44,7 +44,7 @@ public void testTranscribeAsyncWithLanguageFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US")); + TranscriptionOptions options = new TranscriptionOptions((String) null).setLocales(Arrays.asList("en-US")); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -56,7 +56,8 @@ public void testTranscribeAsyncWithMultipleLanguagesFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US", "es-ES", "fr-FR")); + TranscriptionOptions options + = new TranscriptionOptions((String) null).setLocales(Arrays.asList("en-US", "es-ES", "fr-FR")); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -70,7 +71,8 @@ public void testTranscribeAsyncWithDiarizationFromFile() { TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions().setMaxSpeakers(5); - TranscriptionOptions options = new TranscriptionOptions().setDiarizationOptions(diarizationOptions); + TranscriptionOptions options + = new TranscriptionOptions((String) null).setDiarizationOptions(diarizationOptions); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -82,7 +84,8 @@ public void testTranscribeAsyncWithProfanityFilterFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions().setProfanityFilterMode(ProfanityFilterMode.MASKED); + TranscriptionOptions options + = new TranscriptionOptions((String) null).setProfanityFilterMode(ProfanityFilterMode.MASKED); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -94,7 +97,7 @@ public void testTranscribeAsyncWithChannelsFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions().setActiveChannels(Arrays.asList(0)); + TranscriptionOptions options = new TranscriptionOptions((String) null).setActiveChannels(Arrays.asList(0)); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -108,7 +111,7 @@ public void testTranscribeAsyncAllOptionsFromFile() { TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions().setMaxSpeakers(5); - TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US")) + TranscriptionOptions options = new TranscriptionOptions((String) null).setLocales(Arrays.asList("en-US")) .setDiarizationOptions(diarizationOptions) .setProfanityFilterMode(ProfanityFilterMode.MASKED) .setActiveChannels(Arrays.asList(0)); @@ -123,7 +126,7 @@ public void testTranscribeAsyncBasicFromFileWithResponse() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions((String) null); RequestOptions requestOptions = new RequestOptions().addHeader(HttpHeaderName.fromString("x-custom-header"), "custom-value"); @@ -139,10 +142,11 @@ public void testTranscribeAsyncWithAllOptionsFromFileWithResponse() { TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions().setMaxSpeakers(5); - TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US", "es-ES")) - .setDiarizationOptions(diarizationOptions) - .setProfanityFilterMode(ProfanityFilterMode.REMOVED) - .setActiveChannels(Arrays.asList(0, 1)); + TranscriptionOptions options + = new TranscriptionOptions((String) null).setLocales(Arrays.asList("en-US", "es-ES")) + .setDiarizationOptions(diarizationOptions) + .setProfanityFilterMode(ProfanityFilterMode.REMOVED) + .setActiveChannels(Arrays.asList(0, 1)); RequestOptions requestOptions = new RequestOptions().addHeader(HttpHeaderName.fromString("x-custom-header"), "custom-value") @@ -178,7 +182,8 @@ public void testTranscribeAsyncWithProfanityModeMasked() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions().setProfanityFilterMode(ProfanityFilterMode.MASKED); + TranscriptionOptions options + = new TranscriptionOptions((String) null).setProfanityFilterMode(ProfanityFilterMode.MASKED); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -189,7 +194,8 @@ public void testTranscribeAsyncWithProfanityModeRemoved() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions().setProfanityFilterMode(ProfanityFilterMode.REMOVED); + TranscriptionOptions options + = new TranscriptionOptions((String) null).setProfanityFilterMode(ProfanityFilterMode.REMOVED); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -200,7 +206,8 @@ public void testTranscribeAsyncWithProfanityModeTags() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions().setProfanityFilterMode(ProfanityFilterMode.TAGS); + TranscriptionOptions options + = new TranscriptionOptions((String) null).setProfanityFilterMode(ProfanityFilterMode.TAGS); doTranscription(methodName, sync, false, audioFile, options, null); } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java index f0c09659c859..3b225a1e7f76 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java @@ -4,7 +4,6 @@ package com.azure.ai.speech.transcription; import com.azure.ai.speech.transcription.models.ProfanityFilterMode; -import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.core.http.HttpHeaderName; @@ -35,7 +34,7 @@ public void testTranscribeSyncBasicFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions((String) null); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -47,7 +46,7 @@ public void testTranscribeSyncWithLanguageFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US")); + TranscriptionOptions options = new TranscriptionOptions((String) null).setLocales(Arrays.asList("en-US")); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -59,7 +58,8 @@ public void testTranscribeSyncWithMultipleLanguagesFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US", "es-ES", "fr-FR")); + TranscriptionOptions options + = new TranscriptionOptions((String) null).setLocales(Arrays.asList("en-US", "es-ES", "fr-FR")); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -73,7 +73,8 @@ public void testTranscribeSyncWithDiarizationFromFile() { TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions().setMaxSpeakers(5); - TranscriptionOptions options = new TranscriptionOptions().setDiarizationOptions(diarizationOptions); + TranscriptionOptions options + = new TranscriptionOptions((String) null).setDiarizationOptions(diarizationOptions); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -85,7 +86,8 @@ public void testTranscribeSyncWithProfanityFilterFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions().setProfanityFilterMode(ProfanityFilterMode.MASKED); + TranscriptionOptions options + = new TranscriptionOptions((String) null).setProfanityFilterMode(ProfanityFilterMode.MASKED); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -97,7 +99,7 @@ public void testTranscribeSyncWithChannelsFromFile() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions().setActiveChannels(Arrays.asList(0)); + TranscriptionOptions options = new TranscriptionOptions((String) null).setActiveChannels(Arrays.asList(0)); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -111,7 +113,7 @@ public void testTranscribeSyncAllOptionsFromFile() { TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions().setMaxSpeakers(5); - TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US")) + TranscriptionOptions options = new TranscriptionOptions((String) null).setLocales(Arrays.asList("en-US")) .setDiarizationOptions(diarizationOptions) .setProfanityFilterMode(ProfanityFilterMode.MASKED) .setActiveChannels(Arrays.asList(0)); @@ -126,7 +128,7 @@ public void testTranscribeSyncBasicFromFileWithResponse() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions(); + TranscriptionOptions options = new TranscriptionOptions((String) null); RequestOptions requestOptions = new RequestOptions().addHeader(HttpHeaderName.fromString("x-custom-header"), "custom-value"); @@ -142,10 +144,11 @@ public void testTranscribeSyncWithAllOptionsFromFileWithResponse() { TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions().setMaxSpeakers(5); - TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("en-US", "es-ES")) - .setDiarizationOptions(diarizationOptions) - .setProfanityFilterMode(ProfanityFilterMode.REMOVED) - .setActiveChannels(Arrays.asList(0, 1)); + TranscriptionOptions options + = new TranscriptionOptions((String) null).setLocales(Arrays.asList("en-US", "es-ES")) + .setDiarizationOptions(diarizationOptions) + .setProfanityFilterMode(ProfanityFilterMode.REMOVED) + .setActiveChannels(Arrays.asList(0, 1)); RequestOptions requestOptions = new RequestOptions().addHeader(HttpHeaderName.fromString("x-custom-header"), "custom-value") @@ -162,7 +165,7 @@ public void testTranscribeSyncWithMultipleChannels() { String methodName = new Object() { }.getClass().getEnclosingMethod().getName(); - TranscriptionOptions options = new TranscriptionOptions().setActiveChannels(Arrays.asList(0, 1)); + TranscriptionOptions options = new TranscriptionOptions((String) null).setActiveChannels(Arrays.asList(0, 1)); doTranscription(methodName, sync, false, audioFile, options, null); } @@ -174,13 +177,13 @@ public void testTranscribeSyncWithMultipleChannels() { ***********************************************************************************/ @Test - public void testTranscribeSyncWithNullRequestContent() { + public void testTranscribeSyncWithNullOptions() { createClient(true, true, sync); - // Test that null request content throws appropriate exception + // Test that null options throws appropriate exception assertThrows(NullPointerException.class, () -> { - getClient().transcribe((TranscriptionContent) null); - }, "Transcribe should throw NullPointerException when request content is null"); + getClient().transcribe((TranscriptionOptions) null); + }, "Transcribe should throw NullPointerException when options is null"); } @Test @@ -196,10 +199,12 @@ public void testTranscribeSyncWithEmptyAudioData() { public void testTranscribeSyncWithInvalidLanguageCode() { createClient(true, true, sync); - // Test with invalid language code - TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("invalid-locale")); - // Note: This test requires actual service call to verify behavior // In PLAYBACK mode, this would replay the recorded error response + // Example implementation: + // TranscriptionOptions options = new TranscriptionOptions((String) null) + // .setLocales(Arrays.asList("invalid-locale")); + // doTranscription(methodName, sync, false, audioFile, options, null); + // The service should return an error for invalid locale } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java index d949a221e3b9..58bf684fd14b 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java @@ -4,7 +4,6 @@ package com.azure.ai.speech.transcription; import com.azure.ai.speech.transcription.models.AudioFileDetails; -import com.azure.ai.speech.transcription.models.TranscriptionContent; import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; import com.azure.core.credential.KeyCredential; @@ -150,13 +149,22 @@ protected void doTranscription(String testName, Boolean sync, Boolean transcribe AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)).setFilename(new File(audioFilePath).getName()); - TranscriptionContent requestContent - = new TranscriptionContent().setAudio(audioFileDetails).setOptions(options); + // Create new options with audio file details if options is currently using URL or null + if (options.getAudioUrl() == null) { + // Options was created with null, need to create a new one with audio file details + options = new TranscriptionOptions(audioFileDetails).setLocales(options.getLocales()) + .setLocaleModelMapping(options.getLocaleModelMapping()) + .setProfanityFilterMode(options.getProfanityFilterMode()) + .setDiarizationOptions(options.getDiarizationOptions()) + .setActiveChannels(options.getActiveChannels()) + .setEnhancedModeOptions(options.getEnhancedModeOptions()) + .setPhraseListOptions(options.getPhraseListOptions()); + } if (sync) { TranscriptionResult result = null; if (!transcribeWithResponse) { - result = client.transcribe(requestContent); + result = client.transcribe(options); } else { // For transcribeWithResponse, we need to manually prepare the multipart request body if (requestOptions == null) { @@ -164,11 +172,9 @@ protected void doTranscription(String testName, Boolean sync, Boolean transcribe } BinaryData multipartBody = new com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper(requestOptions) - .serializeJsonField("definition", requestContent.getOptions()) - .serializeFileField("audio", - requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(), - requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(), - requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename()) + .serializeJsonField("definition", options) + .serializeFileField("audio", audioFileDetails.getContent(), + audioFileDetails.getContentType(), audioFileDetails.getFilename()) .end() .getRequestBody(); @@ -180,7 +186,7 @@ protected void doTranscription(String testName, Boolean sync, Boolean transcribe } else { TranscriptionResult result = null; if (!transcribeWithResponse) { - result = asyncClient.transcribe(requestContent).block(); + result = asyncClient.transcribe(options).block(); } else { // For transcribeWithResponse, we need to manually prepare the multipart request body if (requestOptions == null) { @@ -188,11 +194,9 @@ protected void doTranscription(String testName, Boolean sync, Boolean transcribe } BinaryData multipartBody = new com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper(requestOptions) - .serializeJsonField("definition", requestContent.getOptions()) - .serializeFileField("audio", - requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(), - requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(), - requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename()) + .serializeJsonField("definition", options) + .serializeFileField("audio", audioFileDetails.getContent(), + audioFileDetails.getContentType(), audioFileDetails.getFilename()) .end() .getRequestBody(); From 7182118190d6544fc365e5c4c658e4b0faee30e6 Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 5 Dec 2025 11:09:28 -0800 Subject: [PATCH 24/45] update tsp files --- .../azure-ai-speech-transcription/tsp-location.yaml | 2 +- .../azure-ai-speech-transcription/tspconfig.yaml | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) delete mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/tspconfig.yaml diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml b/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml index c3f28ef29126..cce3600b1168 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml @@ -1,4 +1,4 @@ directory: specification/cognitiveservices/Speech.Transcription -commit: c75a959c5b6b60b1e4f4ffde2e9f5516702b41c8 +commit: 26fba62b6c829cc443e57d205420461e6f41660c repo: Azure/azure-rest-api-specs additionalDirectories: diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/tspconfig.yaml b/sdk/cognitiveservices/azure-ai-speech-transcription/tspconfig.yaml deleted file mode 100644 index 12921c42a3f4..000000000000 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/tspconfig.yaml +++ /dev/null @@ -1,7 +0,0 @@ -emit: - - "@azure-tools/typespec-java" -options: - "@azure-tools/typespec-java": - customization-class: "SpeechTranscriptionCustomization" - namespace: "com.azure.ai.speech.transcription" - service-name: "Transcription" From 822b629a554f48bbfafebb930db51be110cd968f Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 5 Dec 2025 11:16:58 -0800 Subject: [PATCH 25/45] update version_client --- eng/versioning/version_client.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index f75ca8b933f7..8f47c91d74b4 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -52,8 +52,8 @@ com.azure:azure-ai-openai-assistants;1.0.0-beta.5;1.0.0-beta.6 com.azure:azure-ai-openai-realtime;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-openai-stainless;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-personalizer;1.0.0-beta.1;1.0.0-beta.2 -com.azure:azure-ai-speech-transcription;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-projects;1.0.0-beta.3;1.0.0-beta.4 +com.azure:azure-ai-speech-transcription;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-textanalytics;5.5.11;5.6.0-beta.1 com.azure:azure-ai-textanalytics-perf;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-ai-translation-text;1.1.7;1.2.0-beta.1 From 108ed834bd99453b903c39fdddd9e9587e590ee1 Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 5 Dec 2025 11:36:06 -0800 Subject: [PATCH 26/45] regenerate sdk from typespec --- .../TranscriptionAsyncClient.java | 26 +----------------- .../transcription/TranscriptionClient.java | 27 +------------------ 2 files changed, 2 insertions(+), 51 deletions(-) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java index 3c98bbd1d939..4fd1348ef05e 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java @@ -48,7 +48,7 @@ public final class TranscriptionAsyncClient { /** * Transcribes the provided audio stream. *

Response Body Schema

- * + * *
      * {@code
      * {
@@ -125,18 +125,6 @@ Mono transcribe(TranscriptionContent body) {
                 .map(protocolMethodData -> protocolMethodData.toObject(TranscriptionResult.class));
     }
 
-    /**
-     * Transcribes the provided audio stream with the specified options.
-     *
-     * @param options the transcription options including audio file details or audio URL
-     * @throws IllegalArgumentException thrown if parameters fail the validation.
-     * @throws HttpResponseException thrown if the request is rejected by server.
-     * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.
-     * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.
-     * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.
-     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
-     * @return the result of the transcribe operation on successful completion of Mono.
-     */
     // Customized method added via post-generation customization
     @ServiceMethod(returns = ReturnType.SINGLE)
     public Mono transcribe(TranscriptionOptions options) {
@@ -147,18 +135,6 @@ public Mono transcribe(TranscriptionOptions options) {
         return transcribe(requestContent);
     }
 
-    /**
-     * Transcribes the provided audio stream with the specified options.
-     *
-     * @param options the transcription options including audio file details or audio URL
-     * @throws IllegalArgumentException thrown if parameters fail the validation.
-     * @throws HttpResponseException thrown if the request is rejected by server.
-     * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.
-     * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.
-     * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.
-     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
-     * @return the response containing the result of the transcribe operation on successful completion of Mono.
-     */
     // Customized method added via post-generation customization
     public Mono> transcribeWithResponse(TranscriptionOptions options) {
         TranscriptionContent requestContent = new TranscriptionContent(options);
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
index 206165ae7c35..ee116c56c4b0 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
@@ -46,7 +46,7 @@ public final class TranscriptionClient {
     /**
      * Transcribes the provided audio stream.
      * 

Response Body Schema

- * + * *
      * {@code
      * {
@@ -121,19 +121,6 @@ TranscriptionResult transcribe(TranscriptionContent body) {
             requestOptions).getValue().toObject(TranscriptionResult.class);
     }
 
-    // Customized method added via post-generation customization
-    /**
-     * Transcribes the provided audio stream with the specified options.
-     *
-     * @param options the transcription options including audio file details or audio URL
-     * @throws IllegalArgumentException thrown if parameters fail the validation.
-     * @throws HttpResponseException thrown if the request is rejected by server.
-     * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.
-     * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.
-     * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.
-     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
-     * @return the result of the transcribe operation.
-     */
     // Customized method added via post-generation customization
     @ServiceMethod(returns = ReturnType.SINGLE)
     public TranscriptionResult transcribe(TranscriptionOptions options) {
@@ -144,18 +131,6 @@ public TranscriptionResult transcribe(TranscriptionOptions options) {
         return transcribe(requestContent);
     }
 
-    /**
-     * Transcribes the provided audio stream with the specified options.
-     *
-     * @param options the transcription options including audio file details or audio URL
-     * @throws IllegalArgumentException thrown if parameters fail the validation.
-     * @throws HttpResponseException thrown if the request is rejected by server.
-     * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.
-     * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.
-     * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.
-     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
-     * @return the response containing the result of the transcribe operation.
-     */
     // Customized method added via post-generation customization
     public Response transcribeWithResponse(TranscriptionOptions options) {
         TranscriptionContent requestContent = new TranscriptionContent(options);

From f440c98f3dbdbf7e4753266ff305df7712011e6d Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Fri, 5 Dec 2025 16:14:32 -0800
Subject: [PATCH 27/45] adding javadoc for customized function

---
 .../SpeechTranscriptionCustomization.java     | 121 ++++++++++++------
 .../TranscriptionAsyncClient.java             |  26 +++-
 .../transcription/TranscriptionClient.java    |  26 +++-
 3 files changed, 130 insertions(+), 43 deletions(-)

diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
index ba0a9043cac7..ea323f7bb5ff 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
@@ -225,11 +225,46 @@ private void customizeTranscriptionClient(PackageCustomization packageCustomizat
                     }
                 });
 
+                // Add public transcribe method that returns TranscriptionResult
+                com.github.javaparser.ast.body.MethodDeclaration transcribeMethod
+                    = clazz.addMethod("transcribe", Modifier.Keyword.PUBLIC)
+                        .addParameter("TranscriptionOptions", "options")
+                        .setType("TranscriptionResult");
+                transcribeMethod.setJavadocComment("/**\n"
+                    + " * Transcribes the provided audio stream with the specified options.\n" + " *\n"
+                    + " * @param options the transcription options including audio file details or audio URL\n"
+                    + " * @throws IllegalArgumentException thrown if parameters fail the validation.\n"
+                    + " * @throws HttpResponseException thrown if the request is rejected by server.\n"
+                    + " * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.\n"
+                    + " * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.\n"
+                    + " * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.\n"
+                    + " * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.\n"
+                    + " * @return the result of the transcribe operation.\n" + " */");
+                com.github.javaparser.ast.expr.NormalAnnotationExpr transcribeServiceMethodAnnotation
+                    = new com.github.javaparser.ast.expr.NormalAnnotationExpr();
+                transcribeServiceMethodAnnotation.setName("ServiceMethod");
+                transcribeServiceMethodAnnotation.addPair("returns", "ReturnType.SINGLE");
+                transcribeMethod.addAnnotation(transcribeServiceMethodAnnotation);
+                transcribeMethod
+                    .setBody(parseBlock("{ TranscriptionContent requestContent = new TranscriptionContent(options); "
+                        + "if (options.getFileDetails() != null) { requestContent.setAudio(options.getFileDetails()); } "
+                        + "return transcribe(requestContent); }"));
+
                 // Add public transcribeWithResponse method that returns Response
                 com.github.javaparser.ast.body.MethodDeclaration transcribeWithResponseMethod
                     = clazz.addMethod("transcribeWithResponse", Modifier.Keyword.PUBLIC)
                         .addParameter("TranscriptionOptions", "options")
                         .setType("Response");
+                transcribeWithResponseMethod.setJavadocComment("/**\n"
+                    + " * Transcribes the provided audio stream with the specified options.\n" + " *\n"
+                    + " * @param options the transcription options including audio file details or audio URL\n"
+                    + " * @throws IllegalArgumentException thrown if parameters fail the validation.\n"
+                    + " * @throws HttpResponseException thrown if the request is rejected by server.\n"
+                    + " * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.\n"
+                    + " * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.\n"
+                    + " * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.\n"
+                    + " * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.\n"
+                    + " * @return the response containing the result of the transcribe operation.\n" + " */");
                 com.github.javaparser.ast.expr.NormalAnnotationExpr serviceMethodAnnotation
                     = new com.github.javaparser.ast.expr.NormalAnnotationExpr();
                 serviceMethodAnnotation.setName("ServiceMethod");
@@ -237,29 +272,15 @@ private void customizeTranscriptionClient(PackageCustomization packageCustomizat
                 transcribeWithResponseMethod.addAnnotation(serviceMethodAnnotation);
                 transcribeWithResponseMethod
                     .setBody(parseBlock("{ TranscriptionContent requestContent = new TranscriptionContent(options); "
-                        + "AudioFileDetails audio = requestContent.getAudio() != null ? requestContent.getAudio() : options.getFileDetails(); "
+                        + "if (options.getFileDetails() != null) { requestContent.setAudio(options.getFileDetails()); } "
                         + "RequestOptions requestOptions = new RequestOptions(); "
                         + "Response response = transcribeWithResponse("
                         + "new MultipartFormDataHelper(requestOptions).serializeJsonField(\"options\", requestContent.getOptions())"
-                        + ".serializeFileField(\"audio\", audio == null ? null : audio.getContent(), "
-                        + "audio == null ? null : audio.getContentType(), "
-                        + "audio == null ? null : audio.getFilename())" + ".end().getRequestBody(), requestOptions); "
+                        + ".serializeFileField(\"audio\", requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(), "
+                        + "requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(), "
+                        + "requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename())"
+                        + ".end().getRequestBody(), requestOptions); "
                         + "return new SimpleResponse<>(response, response.getValue().toObject(TranscriptionResult.class)); }"));
-                transcribeWithResponseMethod.setJavadocComment(
-                    new Javadoc(parseText("Transcribes the provided audio stream with the specified options."))
-                        .addBlockTag("param",
-                            "options the transcription options including audio file details or audio URL")
-                        .addBlockTag("throws", "IllegalArgumentException thrown if parameters fail the validation.")
-                        .addBlockTag("throws", "HttpResponseException thrown if the request is rejected by server.")
-                        .addBlockTag("throws",
-                            "ClientAuthenticationException thrown if the request is rejected by server on status code 401.")
-                        .addBlockTag("throws",
-                            "ResourceNotFoundException thrown if the request is rejected by server on status code 404.")
-                        .addBlockTag("throws",
-                            "ResourceModifiedException thrown if the request is rejected by server on status code 409.")
-                        .addBlockTag("throws",
-                            "RuntimeException all other wrapped checked exceptions if the request fails to be sent.")
-                        .addBlockTag("return", "the response containing the result of the transcribe operation."));
             });
         });
     }
@@ -287,11 +308,48 @@ private void customizeTranscriptionAsyncClient(PackageCustomization packageCusto
                     }
                 });
 
+                // Add public transcribe method that returns Mono
+                com.github.javaparser.ast.body.MethodDeclaration transcribeMethod
+                    = clazz.addMethod("transcribe", Modifier.Keyword.PUBLIC)
+                        .addParameter("TranscriptionOptions", "options")
+                        .setType("Mono");
+                transcribeMethod.setJavadocComment("/**\n"
+                    + " * Transcribes the provided audio stream with the specified options.\n" + " *\n"
+                    + " * @param options the transcription options including audio file details or audio URL\n"
+                    + " * @throws IllegalArgumentException thrown if parameters fail the validation.\n"
+                    + " * @throws HttpResponseException thrown if the request is rejected by server.\n"
+                    + " * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.\n"
+                    + " * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.\n"
+                    + " * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.\n"
+                    + " * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.\n"
+                    + " * @return the result of the transcribe operation on successful completion of {@link Mono}.\n"
+                    + " */");
+                com.github.javaparser.ast.expr.NormalAnnotationExpr transcribeServiceMethodAnnotation
+                    = new com.github.javaparser.ast.expr.NormalAnnotationExpr();
+                transcribeServiceMethodAnnotation.setName("ServiceMethod");
+                transcribeServiceMethodAnnotation.addPair("returns", "ReturnType.SINGLE");
+                transcribeMethod.addAnnotation(transcribeServiceMethodAnnotation);
+                transcribeMethod
+                    .setBody(parseBlock("{ TranscriptionContent requestContent = new TranscriptionContent(options); "
+                        + "if (options.getFileDetails() != null) { requestContent.setAudio(options.getFileDetails()); } "
+                        + "return transcribe(requestContent); }"));
+
                 // Add public transcribeWithResponse method that returns Mono>
                 com.github.javaparser.ast.body.MethodDeclaration transcribeWithResponseMethod
                     = clazz.addMethod("transcribeWithResponse", Modifier.Keyword.PUBLIC)
                         .addParameter("TranscriptionOptions", "options")
                         .setType("Mono>");
+                transcribeWithResponseMethod.setJavadocComment("/**\n"
+                    + " * Transcribes the provided audio stream with the specified options.\n" + " *\n"
+                    + " * @param options the transcription options including audio file details or audio URL\n"
+                    + " * @throws IllegalArgumentException thrown if parameters fail the validation.\n"
+                    + " * @throws HttpResponseException thrown if the request is rejected by server.\n"
+                    + " * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.\n"
+                    + " * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.\n"
+                    + " * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.\n"
+                    + " * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.\n"
+                    + " * @return the response containing the result of the transcribe operation on successful completion of {@link Mono}.\n"
+                    + " */");
                 com.github.javaparser.ast.expr.NormalAnnotationExpr serviceMethodAnnotation
                     = new com.github.javaparser.ast.expr.NormalAnnotationExpr();
                 serviceMethodAnnotation.setName("ServiceMethod");
@@ -299,29 +357,14 @@ private void customizeTranscriptionAsyncClient(PackageCustomization packageCusto
                 transcribeWithResponseMethod.addAnnotation(serviceMethodAnnotation);
                 transcribeWithResponseMethod
                     .setBody(parseBlock("{ TranscriptionContent requestContent = new TranscriptionContent(options); "
-                        + "AudioFileDetails audio = requestContent.getAudio() != null ? requestContent.getAudio() : options.getFileDetails(); "
+                        + "if (options.getFileDetails() != null) { requestContent.setAudio(options.getFileDetails()); } "
                         + "RequestOptions requestOptions = new RequestOptions(); " + "return transcribeWithResponse("
                         + "new MultipartFormDataHelper(requestOptions).serializeJsonField(\"options\", requestContent.getOptions())"
-                        + ".serializeFileField(\"audio\", audio == null ? null : audio.getContent(), "
-                        + "audio == null ? null : audio.getContentType(), "
-                        + "audio == null ? null : audio.getFilename())" + ".end().getRequestBody(), requestOptions)"
+                        + ".serializeFileField(\"audio\", requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(), "
+                        + "requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(), "
+                        + "requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename())"
+                        + ".end().getRequestBody(), requestOptions)"
                         + ".map(response -> new SimpleResponse<>(response, response.getValue().toObject(TranscriptionResult.class))); }"));
-                transcribeWithResponseMethod.setJavadocComment(
-                    new Javadoc(parseText("Transcribes the provided audio stream with the specified options."))
-                        .addBlockTag("param",
-                            "options the transcription options including audio file details or audio URL")
-                        .addBlockTag("throws", "IllegalArgumentException thrown if parameters fail the validation.")
-                        .addBlockTag("throws", "HttpResponseException thrown if the request is rejected by server.")
-                        .addBlockTag("throws",
-                            "ClientAuthenticationException thrown if the request is rejected by server on status code 401.")
-                        .addBlockTag("throws",
-                            "ResourceNotFoundException thrown if the request is rejected by server on status code 404.")
-                        .addBlockTag("throws",
-                            "ResourceModifiedException thrown if the request is rejected by server on status code 409.")
-                        .addBlockTag("throws",
-                            "RuntimeException all other wrapped checked exceptions if the request fails to be sent.")
-                        .addBlockTag("return",
-                            "the response containing the result of the transcribe operation on successful completion of Mono."));
             });
         });
     }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
index 4fd1348ef05e..6ac85b94b75b 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
@@ -125,7 +125,18 @@ Mono transcribe(TranscriptionContent body) {
                 .map(protocolMethodData -> protocolMethodData.toObject(TranscriptionResult.class));
     }
 
-    // Customized method added via post-generation customization
+    /**
+     * Transcribes the provided audio stream with the specified options.
+     *
+     * @param options the transcription options including audio file details or audio URL
+     * @throws IllegalArgumentException thrown if parameters fail the validation.
+     * @throws HttpResponseException thrown if the request is rejected by server.
+     * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.
+     * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.
+     * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.
+     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
+     * @return the result of the transcribe operation on successful completion of {@link Mono}.
+     */
     @ServiceMethod(returns = ReturnType.SINGLE)
     public Mono transcribe(TranscriptionOptions options) {
         TranscriptionContent requestContent = new TranscriptionContent(options);
@@ -135,7 +146,18 @@ public Mono transcribe(TranscriptionOptions options) {
         return transcribe(requestContent);
     }
 
-    // Customized method added via post-generation customization
+    /**
+     * Transcribes the provided audio stream with the specified options.
+     *
+     * @param options the transcription options including audio file details or audio URL
+     * @throws IllegalArgumentException thrown if parameters fail the validation.
+     * @throws HttpResponseException thrown if the request is rejected by server.
+     * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.
+     * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.
+     * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.
+     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
+     * @return the response containing the result of the transcribe operation on successful completion of {@link Mono}.
+     */
     public Mono> transcribeWithResponse(TranscriptionOptions options) {
         TranscriptionContent requestContent = new TranscriptionContent(options);
         if (options.getFileDetails() != null) {
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
index ee116c56c4b0..8a83425aec83 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
@@ -121,7 +121,18 @@ TranscriptionResult transcribe(TranscriptionContent body) {
             requestOptions).getValue().toObject(TranscriptionResult.class);
     }
 
-    // Customized method added via post-generation customization
+    /**
+     * Transcribes the provided audio stream with the specified options.
+     *
+     * @param options the transcription options including audio file details or audio URL
+     * @throws IllegalArgumentException thrown if parameters fail the validation.
+     * @throws HttpResponseException thrown if the request is rejected by server.
+     * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.
+     * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.
+     * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.
+     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
+     * @return the result of the transcribe operation.
+     */
     @ServiceMethod(returns = ReturnType.SINGLE)
     public TranscriptionResult transcribe(TranscriptionOptions options) {
         TranscriptionContent requestContent = new TranscriptionContent(options);
@@ -131,7 +142,18 @@ public TranscriptionResult transcribe(TranscriptionOptions options) {
         return transcribe(requestContent);
     }
 
-    // Customized method added via post-generation customization
+    /**
+     * Transcribes the provided audio stream with the specified options.
+     *
+     * @param options the transcription options including audio file details or audio URL
+     * @throws IllegalArgumentException thrown if parameters fail the validation.
+     * @throws HttpResponseException thrown if the request is rejected by server.
+     * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401.
+     * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404.
+     * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409.
+     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
+     * @return the response containing the result of the transcribe operation.
+     */
     public Response transcribeWithResponse(TranscriptionOptions options) {
         TranscriptionContent requestContent = new TranscriptionContent(options);
         if (options.getFileDetails() != null) {

From 414e8af3027a98f66c7c91df2e09e0c4b18110f8 Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Fri, 12 Dec 2025 10:42:53 -0800
Subject: [PATCH 28/45] update samples

---
 .../azure-ai-speech-transcription/README.md   |  58 +--
 .../SpeechTranscriptionCustomization.java     |   4 +-
 .../TranscriptionAsyncClient.java             |   6 +-
 .../transcription/TranscriptionClient.java    |   6 +-
 .../src/samples/assets/sample-profanity.wav   | Bin 0 -> 135648 bytes
 .../AdvancedTranscriptionSample.java          | 235 ------------
 .../AsyncTranscriptionSample.java             | 249 ------------
 .../BasicTranscriptionSample.java             | 147 --------
 .../transcription/EnhancedModeSample.java     | 269 +++----------
 .../transcription/ErrorHandlingSample.java    | 356 ------------------
 .../azure/ai/speech/transcription/README.md   | 113 ++++--
 .../speech/transcription/ReadmeSamples.java   | 100 ++++-
 .../TranscribeAudioFileSample.java            |  60 +++
 .../TranscribeFromUrlSample.java              |  64 ++++
 .../TranscribeMultiLanguageSample.java        | 108 ++++++
 .../TranscribeWithDiarizationSample.java      |  87 +++++
 .../TranscribeWithPhraseListSample.java       |  98 +++++
 .../TranscribeWithProfanityFilterSample.java  |  81 ++++
 18 files changed, 759 insertions(+), 1282 deletions(-)
 create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/assets/sample-profanity.wav
 delete mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java
 delete mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java
 delete mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java
 delete mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java
 create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java
 create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeFromUrlSample.java
 create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java
 create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java
 create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java
 create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java

diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
index b1de34991448..b27cef28dd8c 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
@@ -206,72 +206,72 @@ result.getCombinedPhrases().forEach(phrase -> {
 });
 ```
 
-### Use enhanced mode for improved transcription quality
+### Transcribe with multi-language support
 
-Enhanced mode provides advanced features to improve transcription accuracy with custom prompts, translation capabilities, and task-specific optimizations.
+The service can automatically detect and transcribe multiple languages within the same audio file.
 
-#### Basic enhanced mode
-
-```java readme-sample-enhancedModeBasic
+```java com.azure.ai.speech.transcription.transcriptionoptions.multilanguage
 byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
 AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
     .setFilename("audio.wav");
 
-// Enable enhanced mode for improved transcription quality
-EnhancedModeOptions enhancedMode = new EnhancedModeOptions();
-
-TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
-    .setLocales(java.util.Arrays.asList("en-US"))
-    .setEnhancedModeOptions(enhancedMode);
+// Configure transcription WITHOUT specifying locales
+// This allows the service to auto-detect and transcribe multiple languages
+TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
 TranscriptionResult result = client.transcribe(options);
+
+result.getPhrases().forEach(phrase -> {
+    System.out.println("Language: " + phrase.getLocale());
+    System.out.println("Text: " + phrase.getText());
+});
 ```
 
-#### Enhanced mode with custom prompts
+### Transcribe with enhanced mode
 
-Use prompts to guide transcription with domain-specific terminology, improving accuracy for specialized content like medical, legal, or technical discussions.
+Enhanced mode provides advanced features to improve transcription accuracy with custom prompts.
 
-```java readme-sample-enhancedModeWithPrompts
+```java com.azure.ai.speech.transcription.transcriptionoptions.enhancedmode
 byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
 AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
     .setFilename("audio.wav");
 
-// Use prompts to guide transcription with domain-specific terminology
 EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
-    .setPrompts(java.util.Arrays.asList(
-        "Medical consultation discussing hypertension and diabetes",
-        "Common medications: metformin, lisinopril, atorvastatin",
-        "Patient symptoms and treatment plan"
-    ));
+    .setTask("transcribe")
+    .setPrompts(java.util.Arrays.asList("Output must be in lexical format."));
 
 TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
-    .setLocales(java.util.Arrays.asList("en-US"))
     .setEnhancedModeOptions(enhancedMode);
 
 TranscriptionResult result = client.transcribe(options);
+
+System.out.println("Transcription: " + result.getCombinedPhrases().get(0).getText());
 ```
 
-#### Enhanced mode with translation
+### Transcribe with phrase list
 
-Transcribe audio in one language and translate to another language simultaneously.
+You can use a phrase list to improve recognition accuracy for specific terms.
 
-```java readme-sample-enhancedModeWithTranslation
+```java com.azure.ai.speech.transcription.transcriptionoptions.phraselist
 byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
 AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
     .setFilename("audio.wav");
 
-// Configure enhanced mode to transcribe Spanish audio and translate to English
-EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
-    .setTargetLanguage("en-US"); // Translate to English
+PhraseListOptions phraseListOptions = new PhraseListOptions()
+    .setPhrases(java.util.Arrays.asList("Azure", "Cognitive Services"))
+    .setBiasingWeight(5.0);
 
 TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
-    .setLocales(java.util.Arrays.asList("es-ES")) // Source language: Spanish
-    .setEnhancedModeOptions(enhancedMode);
+    .setPhraseListOptions(phraseListOptions);
 
 TranscriptionResult result = client.transcribe(options);
+
+result.getCombinedPhrases().forEach(phrase -> {
+    System.out.println(phrase.getText());
+});
 ```
 
 ### Service API versions
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
index ea323f7bb5ff..3a7eba39e97a 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
@@ -275,7 +275,7 @@ private void customizeTranscriptionClient(PackageCustomization packageCustomizat
                         + "if (options.getFileDetails() != null) { requestContent.setAudio(options.getFileDetails()); } "
                         + "RequestOptions requestOptions = new RequestOptions(); "
                         + "Response response = transcribeWithResponse("
-                        + "new MultipartFormDataHelper(requestOptions).serializeJsonField(\"options\", requestContent.getOptions())"
+                        + "new MultipartFormDataHelper(requestOptions).serializeJsonField(\"definition\", requestContent.getOptions())"
                         + ".serializeFileField(\"audio\", requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(), "
                         + "requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(), "
                         + "requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename())"
@@ -359,7 +359,7 @@ private void customizeTranscriptionAsyncClient(PackageCustomization packageCusto
                     .setBody(parseBlock("{ TranscriptionContent requestContent = new TranscriptionContent(options); "
                         + "if (options.getFileDetails() != null) { requestContent.setAudio(options.getFileDetails()); } "
                         + "RequestOptions requestOptions = new RequestOptions(); " + "return transcribeWithResponse("
-                        + "new MultipartFormDataHelper(requestOptions).serializeJsonField(\"options\", requestContent.getOptions())"
+                        + "new MultipartFormDataHelper(requestOptions).serializeJsonField(\"definition\", requestContent.getOptions())"
                         + ".serializeFileField(\"audio\", requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(), "
                         + "requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(), "
                         + "requestContent.getAudio() == null ? null : requestContent.getAudio().getFilename())"
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
index 6ac85b94b75b..b769566b8ee0 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
@@ -48,7 +48,7 @@ public final class TranscriptionAsyncClient {
     /**
      * Transcribes the provided audio stream.
      * 

Response Body Schema

- * + * *
      * {@code
      * {
@@ -115,7 +115,7 @@ Mono transcribe(TranscriptionContent body) {
         // Generated convenience method for transcribeWithResponse
         RequestOptions requestOptions = new RequestOptions();
         return transcribeWithResponse(
-            new MultipartFormDataHelper(requestOptions).serializeJsonField("options", body.getOptions())
+            new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", body.getOptions())
                 .serializeFileField("audio", body.getAudio() == null ? null : body.getAudio().getContent(),
                     body.getAudio() == null ? null : body.getAudio().getContentType(),
                     body.getAudio() == null ? null : body.getAudio().getFilename())
@@ -165,7 +165,7 @@ public Mono> transcribeWithResponse(TranscriptionO
         }
         RequestOptions requestOptions = new RequestOptions();
         return transcribeWithResponse(
-            new MultipartFormDataHelper(requestOptions).serializeJsonField("options", requestContent.getOptions())
+            new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", requestContent.getOptions())
                 .serializeFileField("audio",
                     requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(),
                     requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(),
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
index 8a83425aec83..454eb09f51bf 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
@@ -46,7 +46,7 @@ public final class TranscriptionClient {
     /**
      * Transcribes the provided audio stream.
      * 

Response Body Schema

- * + * *
      * {@code
      * {
@@ -112,7 +112,7 @@ TranscriptionResult transcribe(TranscriptionContent body) {
         // Generated convenience method for transcribeWithResponse
         RequestOptions requestOptions = new RequestOptions();
         return transcribeWithResponse(
-            new MultipartFormDataHelper(requestOptions).serializeJsonField("options", body.getOptions())
+            new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", body.getOptions())
                 .serializeFileField("audio", body.getAudio() == null ? null : body.getAudio().getContent(),
                     body.getAudio() == null ? null : body.getAudio().getContentType(),
                     body.getAudio() == null ? null : body.getAudio().getFilename())
@@ -161,7 +161,7 @@ public Response transcribeWithResponse(TranscriptionOptions
         }
         RequestOptions requestOptions = new RequestOptions();
         Response response = transcribeWithResponse(
-            new MultipartFormDataHelper(requestOptions).serializeJsonField("options", requestContent.getOptions())
+            new MultipartFormDataHelper(requestOptions).serializeJsonField("definition", requestContent.getOptions())
                 .serializeFileField("audio",
                     requestContent.getAudio() == null ? null : requestContent.getAudio().getContent(),
                     requestContent.getAudio() == null ? null : requestContent.getAudio().getContentType(),
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/assets/sample-profanity.wav b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/assets/sample-profanity.wav
new file mode 100644
index 0000000000000000000000000000000000000000..e1926b3f5dcf21a38af74f6a06b1991dc436d997
GIT binary patch
literal 135648
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

|$uy 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 literal 0 HcmV?d00001 diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java deleted file mode 100644 index 4da8359abfa8..000000000000 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AdvancedTranscriptionSample.java +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.ai.speech.transcription; - -// BEGIN: com.azure.ai.speech.transcription.advanced.imports -import com.azure.ai.speech.transcription.models.AudioFileDetails; -import com.azure.ai.speech.transcription.models.ChannelCombinedPhrases; -import com.azure.ai.speech.transcription.models.ProfanityFilterMode; -import com.azure.ai.speech.transcription.models.TranscribedPhrase; -import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; -import com.azure.ai.speech.transcription.models.TranscriptionOptions; -import com.azure.ai.speech.transcription.models.TranscriptionResult; -import com.azure.core.credential.KeyCredential; -import com.azure.core.http.policy.ExponentialBackoffOptions; -import com.azure.core.http.policy.HttpLogDetailLevel; -import com.azure.core.http.policy.HttpLogOptions; -import com.azure.core.http.policy.RetryOptions; -import com.azure.core.util.BinaryData; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.time.Duration; -import java.util.Arrays; -// END: com.azure.ai.speech.transcription.advanced.imports - -/** - * Sample demonstrates advanced features of Azure AI Speech Transcription including: - * - Custom client configuration (logging, retry policies) - * - API Key and Azure AD authentication options - * - Advanced transcription options (locale, profanity filtering, speaker diarization) - * - Detailed result processing with word-level timings and speaker information - */ -public class AdvancedTranscriptionSample { - /** - * Main method to run the advanced transcription sample. - * - * @param args command line arguments (not used) - */ - public static void main(String[] args) { - String endpoint = System.getenv("SPEECH_ENDPOINT"); - String apiKey = System.getenv("SPEECH_API_KEY"); - - if (endpoint == null) { - System.err.println("Please set SPEECH_ENDPOINT environment variable"); - System.err.println("\nFor authentication, choose one of:"); - System.err.println(" Option 1: set SPEECH_API_KEY=your-api-key"); - System.err.println(" Option 2: Configure Azure AD credentials (DefaultAzureCredential)"); - return; - } - - System.out.println("Azure AI Speech Transcription - Advanced Features Sample"); - System.out.println("=========================================================\n"); - - // Example 1: Create client with custom configuration - demonstrateCustomClientConfiguration(endpoint, apiKey); - - // Example 2: Advanced transcription options - demonstrateAdvancedTranscriptionOptions(endpoint, apiKey); - - // Example 3: Detailed result processing - demonstrateDetailedResultProcessing(endpoint, apiKey); - } - - /** - * Demonstrates creating a client with custom HTTP logging and retry policies. - */ - private static void demonstrateCustomClientConfiguration(String endpoint, String apiKey) { - System.out.println("Example 1: Custom Client Configuration"); - System.out.println("---------------------------------------"); - - // BEGIN: com.azure.ai.speech.transcription.advanced.custom-client-config - // Configure HTTP logging for debugging - HttpLogOptions logOptions = new HttpLogOptions() - .setLogLevel(HttpLogDetailLevel.HEADERS); // Log request/response headers - - // Configure retry policy with exponential backoff - RetryOptions retryOptions = new RetryOptions( - new ExponentialBackoffOptions() - .setMaxRetries(5) - .setBaseDelay(Duration.ofSeconds(1)) - .setMaxDelay(Duration.ofSeconds(60)) - ); - - // Option 1: Use API Key authentication - TranscriptionClient client = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .httpLogOptions(logOptions) - .retryOptions(retryOptions) - .buildClient(); - - // Option 2: Use Azure AD authentication (recommended for production) - // TokenCredential credential = new DefaultAzureCredentialBuilder().build(); - // TranscriptionClient client = new TranscriptionClientBuilder() - // .endpoint(endpoint) - // .credential(credential) - // .httpLogOptions(logOptions) - // .retryOptions(retryOptions) - // .buildClient(); - // END: com.azure.ai.speech.transcription.advanced.custom-client-config - - System.out.println("✓ Client created with custom logging and retry configuration\n"); - } - - /** - * Demonstrates advanced transcription options including locale, profanity filtering, - * and speaker diarization. - */ - private static void demonstrateAdvancedTranscriptionOptions(String endpoint, String apiKey) { - System.out.println("Example 2: Advanced Transcription Options"); - System.out.println("------------------------------------------"); - - TranscriptionClient client = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .buildClient(); - - try { - String audioFilePath = "sample-audio.wav"; - if (!Files.exists(Paths.get(audioFilePath))) { - System.out.println("⚠ Audio file not found: " + audioFilePath); - System.out.println(" Skipping this example.\n"); - return; - } - - byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename(audioFilePath); - - // BEGIN: com.azure.ai.speech.transcription.advanced.transcription-options - // Configure advanced transcription options - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) - // Set specific locale(s) for transcription - .setLocales(Arrays.asList("en-US", "es-ES")) - // Control profanity handling: MASKED, REMOVED, RAW, or TAGS - .setProfanityFilterMode(ProfanityFilterMode.MASKED) - // Enable speaker diarization to identify different speakers - .setDiarizationOptions(new TranscriptionDiarizationOptions().setMaxSpeakers(5)); // Max number of speakers (2-36) - // END: com.azure.ai.speech.transcription.advanced.transcription-options - - System.out.println("Configured options:"); - System.out.println(" - Locales: en-US, es-ES"); - System.out.println(" - Profanity filter: MASKED"); - System.out.println(" - Speaker diarization: up to 5 speakers"); - System.out.println("\nTranscribing..."); - - TranscriptionResult result = client.transcribe(options); - - System.out.println("\n✓ Transcription completed with advanced options"); - System.out.println(" Duration: " + result.getDuration() + " ms\n"); - - } catch (IOException e) { - System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); - } catch (Exception e) { - System.err.println("✗ Error during transcription: " + e.getMessage() + "\n"); - } - } - - /** - * Demonstrates detailed processing of transcription results including - * word-level timings and speaker attribution. - */ - private static void demonstrateDetailedResultProcessing(String endpoint, String apiKey) { - System.out.println("Example 3: Detailed Result Processing"); - System.out.println("--------------------------------------"); - - TranscriptionClient client = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .buildClient(); - - try { - String audioFilePath = "sample-audio.wav"; - if (!Files.exists(Paths.get(audioFilePath))) { - System.out.println("⚠ Audio file not found: " + audioFilePath); - System.out.println(" Skipping this example.\n"); - return; - } - - byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename(audioFilePath); - - // Enable diarization for speaker identification - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) - .setDiarizationOptions(new TranscriptionDiarizationOptions()); - - TranscriptionResult result = client.transcribe(options); - - // BEGIN: com.azure.ai.speech.transcription.advanced.detailed-results - // Process combined phrases (sentence-level results) - if (result.getCombinedPhrases() != null) { - System.out.println("Combined Phrases (Sentence-level):"); - for (ChannelCombinedPhrases channelPhrase : result.getCombinedPhrases()) { - System.out.printf(" [Channel %d] %s%n", - channelPhrase.getChannel(), channelPhrase.getText()); - } - System.out.println(); - } - - // Process detailed phrases with word-level information - if (result.getPhrases() != null) { - System.out.println("Detailed Phrases (Word-level):"); - for (TranscribedPhrase phrase : result.getPhrases()) { - System.out.printf(" Speaker %d (%.2f-%.2fs): %s%n", - phrase.getSpeaker() != null ? phrase.getSpeaker() : 0, - phrase.getOffset() / 1000.0, - (phrase.getOffset() + phrase.getDuration().toMillis()) / 1000.0, - phrase.getText()); - - // Show word-level timings - if (phrase.getWords() != null) { - System.out.println(" Word timings:"); - phrase.getWords().forEach(word -> - System.out.printf(" - \"%s\" [%.2fs]%n", - word.getText(), - word.getOffset() / 1000.0) - ); - } - } - } - // END: com.azure.ai.speech.transcription.advanced.detailed-results - - System.out.println("\n✓ Detailed result processing completed\n"); - - } catch (IOException e) { - System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); - } catch (Exception e) { - System.err.println("✗ Error during transcription: " + e.getMessage() + "\n"); - } - } -} - diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java deleted file mode 100644 index 652f13ba6c6b..000000000000 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/AsyncTranscriptionSample.java +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.ai.speech.transcription; - -// BEGIN: com.azure.ai.speech.transcription.async.imports -import com.azure.ai.speech.transcription.models.AudioFileDetails; -import com.azure.ai.speech.transcription.models.TranscriptionOptions; -import com.azure.ai.speech.transcription.models.TranscriptionResult; -import com.azure.core.credential.KeyCredential; -import com.azure.core.util.BinaryData; -import reactor.core.publisher.Mono; - -import java.nio.file.Files; -import java.nio.file.Paths; -import java.time.Duration; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -// END: com.azure.ai.speech.transcription.async.imports - -/** - * Sample demonstrates asynchronous usage of Azure AI Speech Transcription using - * the TranscriptionAsyncClient with Project Reactor. - * - * This sample shows: - * - Creating a TranscriptionAsyncClient with API Key or Azure AD authentication - * - Using reactive programming with Mono - * - Different patterns: subscribe(), block(), and timeout() - * - Handling async errors with doOnError() - */ -public class AsyncTranscriptionSample { - /** - * Main method to run the async transcription sample. - * - * @param args command line arguments (not used) - */ - public static void main(String[] args) { - String endpoint = System.getenv("SPEECH_ENDPOINT"); - String apiKey = System.getenv("SPEECH_API_KEY"); - - if (endpoint == null) { - System.err.println("Please set SPEECH_ENDPOINT environment variable"); - System.err.println("\nFor authentication, choose one of:"); - System.err.println(" Option 1: set SPEECH_API_KEY=your-api-key"); - System.err.println(" Option 2: Configure Azure AD credentials (DefaultAzureCredential)"); - return; - } - - System.out.println("Azure AI Speech Transcription - Async Sample"); - System.out.println("=============================================\n"); - - // Example 1: Using subscribe() with reactive callbacks - demonstrateSubscribePattern(endpoint, apiKey); - - // Example 2: Using block() to wait for completion - demonstrateBlockPattern(endpoint, apiKey); - - // Example 3: Using timeout and error handling - demonstrateTimeoutAndErrorHandling(endpoint, apiKey); - } - - /** - * Demonstrates the subscribe() pattern for non-blocking async operations. - * This is the recommended approach for truly asynchronous code. - */ - private static void demonstrateSubscribePattern(String endpoint, String apiKey) { - System.out.println("Example 1: Subscribe Pattern (Non-blocking)"); - System.out.println("--------------------------------------------"); - - // Create async client with API Key authentication - // BEGIN: com.azure.ai.speech.transcription.async.create-client.apikey - TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .buildAsyncClient(); - // END: com.azure.ai.speech.transcription.async.create-client.apikey - - // Alternative: Create async client with Azure AD authentication - // BEGIN: com.azure.ai.speech.transcription.async.create-client.azuread - // TokenCredential credential = new DefaultAzureCredentialBuilder().build(); - // TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() - // .endpoint(endpoint) - // .credential(credential) - // .buildAsyncClient(); - // END: com.azure.ai.speech.transcription.async.create-client.azuread - - try { - String audioFilePath = "sample-audio.wav"; - if (!Files.exists(Paths.get(audioFilePath))) { - System.out.println("⚠ Audio file not found: " + audioFilePath); - System.out.println(" Skipping this example.\n"); - return; - } - - byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename(audioFilePath); - - // Use the AudioFileDetails constructor for cleaner code - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - - System.out.println("Starting async transcription with subscribe()..."); - - // BEGIN: com.azure.ai.speech.transcription.async.subscribe-pattern - // Use CountDownLatch to wait for async operation in this sample - // In real applications, you wouldn't need this - the reactive chain would continue - CountDownLatch latch = new CountDownLatch(1); - - // Subscribe to the Mono with success and error callbacks - asyncClient.transcribe(options) - .doOnSubscribe(subscription -> - System.out.println(" → Subscribed to transcription operation")) - .doOnNext(result -> - System.out.println(" → Received result")) - .subscribe( - // onNext: Called when result is available - result -> { - System.out.println("\n✓ Transcription completed!"); - System.out.println(" Duration: " + result.getDuration() + " ms"); - if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { - result.getCombinedPhrases().forEach(phrase -> - System.out.println(" Text: " + phrase.getText()) - ); - } - latch.countDown(); - }, - // onError: Called if an error occurs - error -> { - System.err.println("✗ Error during transcription: " + error.getMessage()); - latch.countDown(); - }, - // onComplete: Called when the Mono completes - () -> System.out.println(" → Operation completed\n") - ); - - // Wait for completion (only for this sample - not typical in reactive code) - latch.await(60, TimeUnit.SECONDS); - // END: com.azure.ai.speech.transcription.async.subscribe-pattern - - } catch (Exception e) { - System.err.println("✗ Error: " + e.getMessage() + "\n"); - } - } - - /** - * Demonstrates the block() pattern which converts async to sync. - * Use this when you need to integrate with synchronous code. - */ - private static void demonstrateBlockPattern(String endpoint, String apiKey) { - System.out.println("Example 2: Block Pattern (Sync over Async)"); - System.out.println("-------------------------------------------"); - - TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .buildAsyncClient(); - - try { - String audioFilePath = "sample-audio.wav"; - if (!Files.exists(Paths.get(audioFilePath))) { - System.out.println("⚠ Audio file not found: " + audioFilePath); - System.out.println(" Skipping this example.\n"); - return; - } - - byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename(audioFilePath); - - // Use the AudioFileDetails constructor - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - - System.out.println("Starting async transcription with block()..."); - - // BEGIN: com.azure.ai.speech.transcription.async.block-pattern - // block() waits for the operation to complete and returns the result - // This is useful when integrating async client with synchronous code - TranscriptionResult result = asyncClient.transcribe(options).block(); - // END: com.azure.ai.speech.transcription.async.block-pattern - - if (result != null) { - System.out.println("\n✓ Transcription completed!"); - System.out.println(" Duration: " + result.getDuration() + " ms\n"); - } - - } catch (Exception e) { - System.err.println("✗ Error: " + e.getMessage() + "\n"); - } - } - - /** - * Demonstrates timeout configuration and comprehensive error handling. - */ - private static void demonstrateTimeoutAndErrorHandling(String endpoint, String apiKey) { - System.out.println("Example 3: Timeout and Error Handling"); - System.out.println("--------------------------------------"); - - TranscriptionAsyncClient asyncClient = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .buildAsyncClient(); - - try { - String audioFilePath = "sample-audio.wav"; - if (!Files.exists(Paths.get(audioFilePath))) { - System.out.println("⚠ Audio file not found: " + audioFilePath); - System.out.println(" Skipping this example.\n"); - return; - } - - byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename(audioFilePath); - - // Use the AudioFileDetails constructor - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - - System.out.println("Starting async transcription with timeout and error handling..."); - - // BEGIN: com.azure.ai.speech.transcription.async.timeout-error-handling - Mono transcriptionMono = asyncClient.transcribe(options) - // Set a timeout for the operation - .timeout(Duration.ofMinutes(2)) - // Handle errors - .doOnError(error -> { - System.err.println(" → Error occurred: " + error.getClass().getSimpleName()); - System.err.println(" → Message: " + error.getMessage()); - }) - // Provide fallback behavior on error (optional) - .onErrorResume(error -> { - System.err.println(" → Attempting fallback behavior..."); - return Mono.empty(); // Return empty result as fallback - }); - - // Execute and wait for result - TranscriptionResult result = transcriptionMono.block(); - // END: com.azure.ai.speech.transcription.async.timeout-error-handling - - if (result != null) { - System.out.println("\n✓ Transcription completed successfully!"); - } else { - System.out.println("\n⚠ No result (possibly due to error fallback)\n"); - } - - } catch (Exception e) { - System.err.println("✗ Error: " + e.getMessage() + "\n"); - } - } -} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java deleted file mode 100644 index 6fb91e409f0a..000000000000 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/BasicTranscriptionSample.java +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.ai.speech.transcription; - -// BEGIN: com.azure.ai.speech.transcription.basic.imports -import com.azure.ai.speech.transcription.models.AudioFileDetails; -import com.azure.ai.speech.transcription.models.TranscriptionOptions; -import com.azure.ai.speech.transcription.models.TranscriptionResult; -import com.azure.core.credential.KeyCredential; -import com.azure.core.credential.TokenCredential; -import com.azure.core.util.BinaryData; -import com.azure.identity.DefaultAzureCredentialBuilder; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -// END: com.azure.ai.speech.transcription.basic.imports - -/** - * Sample demonstrates the most basic usage of Azure AI Speech Transcription client to transcribe - * an audio file with default settings. - * - * This sample shows: - * - Creating a TranscriptionClient with endpoint and API key (or Azure AD token) - * - Reading an audio file from disk - * - Transcribing the audio with default options - * - Accessing transcription results - */ -public class BasicTranscriptionSample { - /** - * Main method to run the basic transcription sample. - * - * @param args command line arguments (not used) - */ - public static void main(String[] args) { - // PREREQUISITE: Set environment variables for authentication - // - // Option 1: API Key Authentication - // set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/ - // set SPEECH_API_KEY=your-api-key - // - // Option 2: Azure AD Authentication (recommended for production) - // set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/ - // Ensure you have configured Azure AD credentials (managed identity, service principal, etc.) - - String endpoint = System.getenv("SPEECH_ENDPOINT"); - String apiKey = System.getenv("SPEECH_API_KEY"); - - if (endpoint == null) { - System.err.println("Please set SPEECH_ENDPOINT environment variable"); - System.err.println("Example:"); - System.err.println(" set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/"); - System.err.println("\nFor authentication, choose one of:"); - System.err.println(" Option 1: set SPEECH_API_KEY=your-api-key"); - System.err.println(" Option 2: Configure Azure AD credentials (DefaultAzureCredential)"); - return; - } - - // Create the transcription client with appropriate authentication - TranscriptionClient client; - - if (apiKey != null && !apiKey.isEmpty()) { - // BEGIN: com.azure.ai.speech.transcription.basic.create-client.apikey - // Option 1: Use API Key authentication - client = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .buildClient(); - // END: com.azure.ai.speech.transcription.basic.create-client.apikey - System.out.println("Using API Key authentication"); - } else { - // BEGIN: com.azure.ai.speech.transcription.basic.create-client.azuread - // Option 2: Use Azure AD authentication (recommended for production) - TokenCredential credential = new DefaultAzureCredentialBuilder().build(); - client = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(credential) - .buildClient(); - // END: com.azure.ai.speech.transcription.basic.create-client.azuread - System.out.println("Using Azure AD authentication"); - } - - System.out.println("Azure AI Speech Transcription - Basic Sample"); - System.out.println("==============================================\n"); - - try { - // For this sample, you need an audio file. Common formats include: - // - WAV (16 kHz, 16-bit, mono PCM recommended) - // - MP3, OGG, FLAC, etc. - // Maximum file size: 250 MB - // Maximum duration: 2 hours - - String audioFilePath = "sample-audio.wav"; - if (!Files.exists(Paths.get(audioFilePath))) { - System.err.println("Audio file not found: " + audioFilePath); - System.err.println("Please provide a valid audio file path."); - return; - } - - // BEGIN: com.azure.ai.speech.transcription.basic.read-audio-file - // Read the audio file - byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); - System.out.println("Audio file loaded: " + audioFilePath); - System.out.println("File size: " + audioData.length + " bytes\n"); - // END: com.azure.ai.speech.transcription.basic.read-audio-file - - // BEGIN: com.azure.ai.speech.transcription.basic.transcribe - // Create audio file details - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename(audioFilePath); - - // Create transcription options using the AudioFileDetails constructor - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - - System.out.println("Starting transcription..."); - - // Transcribe the audio - TranscriptionResult result = client.transcribe(options); - // END: com.azure.ai.speech.transcription.basic.transcribe - - // BEGIN: com.azure.ai.speech.transcription.basic.process-results - // Display results - System.out.println("\nTranscription Results:"); - System.out.println("----------------------"); - System.out.println("Duration: " + result.getDuration() + " ms"); - - if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { - System.out.println("\nTranscribed Text:"); - result.getCombinedPhrases().forEach(phrase -> { - System.out.println(" Channel " + phrase.getChannel() + ": " + phrase.getText()); - }); - } else { - System.out.println("No transcription results found."); - } - // END: com.azure.ai.speech.transcription.basic.process-results - - System.out.println("\nTranscription completed successfully!"); - - } catch (IOException e) { - System.err.println("Error reading audio file: " + e.getMessage()); - } catch (Exception e) { - System.err.println("Error during transcription: " + e.getMessage()); - e.printStackTrace(); - } - } -} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java index c894bc4eeff0..58acc9276dad 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java @@ -6,6 +6,8 @@ // BEGIN: com.azure.ai.speech.transcription.enhancedmode.imports import com.azure.ai.speech.transcription.models.AudioFileDetails; import com.azure.ai.speech.transcription.models.EnhancedModeOptions; +import com.azure.ai.speech.transcription.models.ProfanityFilterMode; +import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; import com.azure.ai.speech.transcription.models.TranscriptionOptions; import com.azure.ai.speech.transcription.models.TranscriptionResult; import com.azure.core.credential.KeyCredential; @@ -18,14 +20,17 @@ // END: com.azure.ai.speech.transcription.enhancedmode.imports /** - * Sample demonstrates how to use EnhancedModeOptions to improve transcription quality - * with features like custom prompts, translation, and task-specific configurations. + * Sample demonstrates how to use EnhancedModeOptions with LLM-enhanced speech transcription + * combining multiple features for optimal transcription quality. * * This sample shows: - * - Enabling enhanced mode for improved transcription accuracy - * - Using custom prompts to guide transcription with domain-specific terminology - * - Configuring translation to transcribe audio in one language and translate to another - * - Setting task-specific configurations for different use cases + * - Using lexical format prompts to guide LLM output + * - Providing domain-specific context for technical terminology + * - Enabling diarization (speaker identification) with enhanced mode + * - Configuring profanity filtering + * + * Enhanced mode leverages large language models to improve transcription quality + * by understanding context and domain-specific terminology. */ public class EnhancedModeSample { /** @@ -48,25 +53,18 @@ public static void main(String[] args) { System.out.println("Azure AI Speech Transcription - Enhanced Mode Sample"); System.out.println("=====================================================\n"); - // Example 1: Basic enhanced mode - demonstrateBasicEnhancedMode(endpoint, apiKey); - - // Example 2: Enhanced mode with custom prompts - demonstrateEnhancedModeWithPrompts(endpoint, apiKey); - - // Example 3: Enhanced mode with translation - demonstrateEnhancedModeWithTranslation(endpoint, apiKey); - - // Example 4: Enhanced mode with task-specific configuration - demonstrateTaskSpecificEnhancedMode(endpoint, apiKey); + // Demonstrate full enhanced mode with all features combined + demonstrateFullEnhancedMode(endpoint, apiKey); } /** - * Demonstrates basic usage of enhanced mode to improve transcription quality. + * Demonstrates using full enhanced mode with multiple features combined. + * This shows how to use lexical format prompts, domain context, diarization, + * and profanity filtering together for optimal transcription quality. */ - private static void demonstrateBasicEnhancedMode(String endpoint, String apiKey) { - System.out.println("Example 1: Basic Enhanced Mode"); - System.out.println("-------------------------------"); + private static void demonstrateFullEnhancedMode(String endpoint, String apiKey) { + System.out.println("Enhanced Mode with Multiple Features Combined"); + System.out.println("----------------------------------------------"); TranscriptionClient client = new TranscriptionClientBuilder() .endpoint(endpoint) @@ -74,222 +72,43 @@ private static void demonstrateBasicEnhancedMode(String endpoint, String apiKey) .buildClient(); try { - String audioFilePath = "sample-audio.wav"; + String audioFilePath = "src/samples/assets/sample-audio.wav"; if (!Files.exists(Paths.get(audioFilePath))) { - System.out.println("⚠ Audio file not found: " + audioFilePath); + System.out.println("Audio file not found: " + audioFilePath); System.out.println(" Skipping this example.\n"); return; } byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename(audioFilePath); - - // BEGIN: com.azure.ai.speech.transcription.enhancedmode.basic - // Enable enhanced mode for improved transcription quality - EnhancedModeOptions enhancedMode = new EnhancedModeOptions(); - - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) - .setLocales(Arrays.asList("en-US")) - .setEnhancedModeOptions(enhancedMode); - // END: com.azure.ai.speech.transcription.enhancedmode.basic - System.out.println("Transcribing with enhanced mode enabled..."); + // Use the helper method to demonstrate full configuration + TranscriptionResult result = transcribeWithFullEnhancedMode(client, audioData, audioFilePath); - TranscriptionResult result = client.transcribe(options); - - System.out.println("✓ Enhanced mode enabled"); + System.out.println(" Full enhanced mode configuration applied"); + System.out.println("Features: LLM prompts, diarization, profanity filtering"); System.out.println("Duration: " + result.getDuration() + " ms"); - if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { - System.out.println("Transcription: " + result.getCombinedPhrases().get(0).getText()); - } - System.out.println(); - - } catch (IOException e) { - System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); - } catch (Exception e) { - System.err.println("✗ Error during transcription: " + e.getMessage() + "\n"); - } - } - - /** - * Demonstrates using enhanced mode with custom prompts to guide transcription. - * Prompts help improve accuracy for domain-specific terminology, names, or context. - */ - private static void demonstrateEnhancedModeWithPrompts(String endpoint, String apiKey) { - System.out.println("Example 2: Enhanced Mode with Custom Prompts"); - System.out.println("---------------------------------------------"); - - TranscriptionClient client = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .buildClient(); - - try { - String audioFilePath = "medical-consultation.wav"; - if (!Files.exists(Paths.get(audioFilePath))) { - System.out.println("⚠ Audio file not found: " + audioFilePath); - System.out.println(" Skipping this example.\n"); - return; - } - - byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename(audioFilePath); - - // BEGIN: com.azure.ai.speech.transcription.enhancedmode.prompts - // Use prompts to guide transcription with domain-specific terminology - EnhancedModeOptions enhancedMode = new EnhancedModeOptions() - .setPrompts(Arrays.asList( - "Medical consultation discussing hypertension and diabetes", - "Common medications: metformin, lisinopril, atorvastatin", - "Patient symptoms and treatment plan" - )); - - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) - .setLocales(Arrays.asList("en-US")) - .setEnhancedModeOptions(enhancedMode); - // END: com.azure.ai.speech.transcription.enhancedmode.prompts - - System.out.println("Transcribing with custom prompts..."); - - TranscriptionResult result = client.transcribe(options); - - System.out.println("✓ Enhanced mode with custom prompts"); - System.out.println("Prompts used:"); - for (String prompt : enhancedMode.getPrompts()) { - System.out.println(" - " + prompt); - } if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { System.out.println("\nTranscription: " + result.getCombinedPhrases().get(0).getText()); } - System.out.println(); - - } catch (IOException e) { - System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); - } catch (Exception e) { - System.err.println("✗ Error during transcription: " + e.getMessage() + "\n"); - } - } - - /** - * Demonstrates using enhanced mode with translation to transcribe and translate - * audio from one language to another. - */ - private static void demonstrateEnhancedModeWithTranslation(String endpoint, String apiKey) { - System.out.println("Example 3: Enhanced Mode with Translation"); - System.out.println("------------------------------------------"); - - TranscriptionClient client = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .buildClient(); - - try { - String audioFilePath = "spanish-audio.wav"; - if (!Files.exists(Paths.get(audioFilePath))) { - System.out.println("⚠ Audio file not found: " + audioFilePath); - System.out.println(" Skipping this example.\n"); - return; - } - - byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename(audioFilePath); - - // BEGIN: com.azure.ai.speech.transcription.enhancedmode.translation - // Configure enhanced mode to transcribe Spanish audio and translate to English - EnhancedModeOptions enhancedMode = new EnhancedModeOptions() - .setTargetLanguage("en-US"); // Translate to English - - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) - .setLocales(Arrays.asList("es-ES")) // Source language: Spanish - .setEnhancedModeOptions(enhancedMode); - // END: com.azure.ai.speech.transcription.enhancedmode.translation - - System.out.println("Transcribing and translating..."); - - TranscriptionResult result = client.transcribe(options); - - System.out.println("✓ Enhanced mode with translation"); - System.out.println("Source language: es-ES"); - System.out.println("Target language: " + enhancedMode.getTargetLanguage()); - if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { - System.out.println("\nTranscription (translated): " + result.getCombinedPhrases().get(0).getText()); - } - System.out.println(); - - } catch (IOException e) { - System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); - } catch (Exception e) { - System.err.println("✗ Error during transcription: " + e.getMessage() + "\n"); - } - } - - /** - * Demonstrates using enhanced mode with task-specific configuration. - * Different tasks may benefit from different enhanced mode settings. - */ - private static void demonstrateTaskSpecificEnhancedMode(String endpoint, String apiKey) { - System.out.println("Example 4: Task-Specific Enhanced Mode"); - System.out.println("---------------------------------------"); - - TranscriptionClient client = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .buildClient(); - - try { - String audioFilePath = "business-meeting.wav"; - if (!Files.exists(Paths.get(audioFilePath))) { - System.out.println("⚠ Audio file not found: " + audioFilePath); - System.out.println(" Skipping this example.\n"); - return; - } - - byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename(audioFilePath); - - // BEGIN: com.azure.ai.speech.transcription.enhancedmode.taskspecific - // Configure enhanced mode for a specific task type (e.g., meeting transcription) - EnhancedModeOptions enhancedMode = new EnhancedModeOptions() - .setTask("meeting") // Task type: meeting, interview, presentation, etc. - .setPrompts(Arrays.asList( - "Business meeting about Q4 revenue projections", - "Participants: CEO, CFO, Sales Director", - "Topics: budget, forecasts, market trends" - )); - - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) - .setLocales(Arrays.asList("en-US")) - .setEnhancedModeOptions(enhancedMode); - // END: com.azure.ai.speech.transcription.enhancedmode.taskspecific - - System.out.println("Transcribing with task-specific configuration..."); - - TranscriptionResult result = client.transcribe(options); - - System.out.println("✓ Enhanced mode with task-specific configuration"); - System.out.println("Task type: " + enhancedMode.getTask()); - System.out.println("Enabled: " + enhancedMode.isEnabled()); if (result.getPhrases() != null && !result.getPhrases().isEmpty()) { - System.out.println("\nTranscription phrases:"); + System.out.println("\nPhrases with speakers:"); result.getPhrases().forEach(phrase -> - System.out.println(" [" + phrase.getOffset() + " ms] " + phrase.getText()) + System.out.println(" [Speaker " + phrase.getSpeaker() + ", " + + phrase.getOffset() + " ms] " + phrase.getText()) ); } System.out.println(); } catch (IOException e) { - System.err.println("✗ Error reading audio file: " + e.getMessage() + "\n"); + System.err.println("Error reading audio file: " + e.getMessage() + "\n"); } catch (Exception e) { - System.err.println("✗ Error during transcription: " + e.getMessage() + "\n"); + System.err.println("Error during transcription: " + e.getMessage() + "\n"); } } /** - * Demonstrates combining multiple enhanced mode features for optimal results. + * Helper method demonstrating how to combine all enhanced mode features. + * This is a reusable pattern for high-quality LLM-enhanced transcription. */ // BEGIN: com.azure.ai.speech.transcription.enhancedmode.complete private static TranscriptionResult transcribeWithFullEnhancedMode( @@ -301,22 +120,26 @@ private static TranscriptionResult transcribeWithFullEnhancedMode( AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename(filename); - // Configure comprehensive enhanced mode settings + // Configure comprehensive LLM-enhanced mode settings + // Always include lexical format prompt for best results EnhancedModeOptions enhancedMode = new EnhancedModeOptions() - .setTask("interview") - .setTargetLanguage("en-US") + .setTask("transcribe") .setPrompts(Arrays.asList( - "Technical interview about cloud architecture", - "Topics: Azure, microservices, Kubernetes, DevOps", - "Key terms: containerization, scalability, CI/CD" + "Output must be in lexical format." )); - // Create transcription options with enhanced mode + // Enable diarization for speaker identification + TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions() + .setMaxSpeakers(5); + + // Create transcription options with all features enabled TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) - .setLocales(Arrays.asList("en-US")) - .setEnhancedModeOptions(enhancedMode); + .setLocales(Arrays.asList()) + .setEnhancedModeOptions(enhancedMode) + .setDiarizationOptions(diarizationOptions) + .setProfanityFilterMode(ProfanityFilterMode.MASKED); - // Transcribe with all enhanced mode features + // Transcribe with full LLM-enhanced mode and diarization return client.transcribe(options); } // END: com.azure.ai.speech.transcription.enhancedmode.complete diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java deleted file mode 100644 index 0f9620589b4d..000000000000 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ErrorHandlingSample.java +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.ai.speech.transcription; - -// BEGIN: com.azure.ai.speech.transcription.error.imports -import com.azure.ai.speech.transcription.models.AudioFileDetails; -import com.azure.ai.speech.transcription.models.TranscriptionOptions; -import com.azure.ai.speech.transcription.models.TranscriptionResult; -import com.azure.core.credential.KeyCredential; -import com.azure.core.credential.TokenCredential; -import com.azure.core.exception.ClientAuthenticationException; -import com.azure.core.exception.HttpResponseException; -import com.azure.core.http.HttpResponse; -import com.azure.core.util.BinaryData; -import com.azure.identity.DefaultAzureCredentialBuilder; -import com.azure.identity.CredentialUnavailableException; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -// END: com.azure.ai.speech.transcription.error.imports - -/** - * Sample demonstrates proper error handling patterns when using Azure AI Speech Transcription. - * - * This sample shows how to handle: - * - Authentication errors (invalid API key, Azure AD token errors, or endpoint) - * - Invalid audio format errors - * - File not found errors - * - Service-side errors (rate limiting, service unavailable) - * - Network errors - */ -public class ErrorHandlingSample { - /** - * Main method to run the error handling sample. - * - * @param args command line arguments (not used) - */ - public static void main(String[] args) { - System.out.println("Azure AI Speech Transcription - Error Handling Sample"); - System.out.println("======================================================\n"); - - // Example 1: Handling API Key authentication errors - demonstrateAuthenticationErrorHandling(); - - // Example 2: Handling Azure AD authentication errors - demonstrateAzureAdAuthenticationErrorHandling(); - - // Example 3: Handling file I/O errors - demonstrateFileErrorHandling(); - - // Example 4: Handling service errors - demonstrateServiceErrorHandling(); - - // Example 5: Comprehensive error handling - demonstrateComprehensiveErrorHandling(); - } - - /** - * Demonstrates handling API Key authentication-related errors. - */ - private static void demonstrateAuthenticationErrorHandling() { - System.out.println("Example 1: API Key Authentication Error Handling"); - System.out.println("-------------------------------------------------"); - - // Intentionally use invalid credentials to demonstrate error handling - String invalidEndpoint = "https://invalid-endpoint.cognitiveservices.azure.com/"; - String invalidApiKey = "invalid-api-key"; - - // BEGIN: com.azure.ai.speech.transcription.error.authentication.apikey - try { - TranscriptionClient client = new TranscriptionClientBuilder() - .endpoint(invalidEndpoint) - .credential(new KeyCredential(invalidApiKey)) - .buildClient(); - - // This will fail with authentication error - byte[] dummyAudio = new byte[1024]; - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(dummyAudio)); - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - - client.transcribe(options); - - } catch (ClientAuthenticationException e) { - // Specific exception for authentication failures - System.err.println("✗ Authentication failed!"); - System.err.println(" Error: " + e.getMessage()); - System.err.println(" → Please verify your API key and endpoint are correct"); - System.err.println(" → Ensure your Azure resource is active and not expired\n"); - } catch (Exception e) { - System.err.println("✗ Unexpected error: " + e.getMessage() + "\n"); - } - // END: com.azure.ai.speech.transcription.error.authentication.apikey - } - - /** - * Demonstrates handling Azure AD authentication-related errors. - */ - private static void demonstrateAzureAdAuthenticationErrorHandling() { - System.out.println("Example 2: Azure AD Authentication Error Handling"); - System.out.println("--------------------------------------------------"); - - String endpoint = System.getenv("SPEECH_ENDPOINT"); - if (endpoint == null) { - endpoint = "https://example.cognitiveservices.azure.com/"; - } - - // BEGIN: com.azure.ai.speech.transcription.error.authentication.azuread - try { - TokenCredential credential = new DefaultAzureCredentialBuilder().build(); - TranscriptionClient client = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(credential) - .buildClient(); - - // Attempt to transcribe (may fail if Azure AD not configured) - byte[] dummyAudio = new byte[1024]; - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(dummyAudio)); - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - - client.transcribe(options); - - } catch (CredentialUnavailableException e) { - // No Azure AD credential sources are available - System.err.println("✗ Azure AD credentials unavailable!"); - System.err.println(" Error: " + e.getMessage()); - System.err.println(" → Ensure you have configured at least one credential source:"); - System.err.println(" - Managed Identity (for Azure-hosted apps)"); - System.err.println(" - Azure CLI (run 'az login')"); - System.err.println(" - Environment variables (AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET)"); - System.err.println(" - Visual Studio Code or IntelliJ authentication\n"); - } catch (ClientAuthenticationException e) { - // Authentication token invalid or expired - System.err.println("✗ Azure AD authentication failed!"); - System.err.println(" Error: " + e.getMessage()); - System.err.println(" → Verify your identity has 'Cognitive Services User' role assigned"); - System.err.println(" → Check if your token has expired or is invalid"); - System.err.println(" → Ensure Azure AD authentication is enabled on the resource\n"); - } catch (Exception e) { - System.err.println("✗ Unexpected error: " + e.getMessage() + "\n"); - } - // END: com.azure.ai.speech.transcription.error.authentication.azuread - } - - /** - * Demonstrates handling file I/O errors. - */ - private static void demonstrateFileErrorHandling() { - System.out.println("Example 3: File Error Handling"); - System.out.println("-------------------------------"); - - String endpoint = System.getenv("SPEECH_ENDPOINT"); - String apiKey = System.getenv("SPEECH_API_KEY"); - - if (endpoint == null || apiKey == null) { - System.out.println("⚠ SPEECH_ENDPOINT or SPEECH_API_KEY not set, skipping example\n"); - return; - } - - TranscriptionClient client = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .buildClient(); - - // Try to load a non-existent file - String audioFilePath = "non-existent-file.wav"; - - // BEGIN: com.azure.ai.speech.transcription.error.file-io - try { - byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - - client.transcribe(options); - - } catch (IOException e) { - // Handle file I/O errors - System.err.println("✗ File error occurred!"); - System.err.println(" Error: " + e.getMessage()); - System.err.println(" → Verify the audio file path is correct"); - System.err.println(" → Ensure you have read permissions for the file"); - System.err.println(" → Check that the file exists\n"); - } catch (Exception e) { - System.err.println("✗ Unexpected error: " + e.getMessage() + "\n"); - } - // END: com.azure.ai.speech.transcription.error.file-io - } - - /** - * Demonstrates handling service-side errors. - */ - private static void demonstrateServiceErrorHandling() { - System.out.println("Example 3: Service Error Handling"); - System.out.println("----------------------------------"); - - String endpoint = System.getenv("SPEECH_ENDPOINT"); - String apiKey = System.getenv("SPEECH_API_KEY"); - - if (endpoint == null || apiKey == null) { - System.out.println("⚠ SPEECH_ENDPOINT or SPEECH_API_KEY not set, skipping example\n"); - return; - } - - TranscriptionClient client = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .buildClient(); - - try { - // Create invalid audio data to trigger service error - byte[] invalidAudio = new byte[10]; // Too small to be valid audio - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(invalidAudio)) - .setFilename("invalid.wav"); - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - - client.transcribe(options); - - // BEGIN: com.azure.ai.speech.transcription.error.service-errors - } catch (HttpResponseException e) { - // Handle HTTP response errors from the service - System.err.println("✗ Service error occurred!"); - System.err.println(" Status code: " + e.getResponse().getStatusCode()); - System.err.println(" Error: " + e.getMessage()); - - HttpResponse response = e.getResponse(); - int statusCode = response.getStatusCode(); - - if (statusCode == 400) { - System.err.println(" → Bad Request: Check your audio format and request parameters"); - } else if (statusCode == 401) { - System.err.println(" → Unauthorized: Verify your API key"); - } else if (statusCode == 403) { - System.err.println(" → Forbidden: Check your subscription permissions"); - } else if (statusCode == 429) { - System.err.println(" → Rate Limited: Too many requests, please retry later"); - } else if (statusCode >= 500) { - System.err.println(" → Server Error: The service is experiencing issues, please retry"); - } - System.err.println(); - // END: com.azure.ai.speech.transcription.error.service-errors - } catch (Exception e) { - System.err.println("✗ Unexpected error: " + e.getMessage() + "\n"); - } - } - - /** - * Demonstrates comprehensive error handling with all best practices. - */ - private static void demonstrateComprehensiveErrorHandling() { - System.out.println("Example 4: Comprehensive Error Handling"); - System.out.println("----------------------------------------"); - - String endpoint = System.getenv("SPEECH_ENDPOINT"); - String apiKey = System.getenv("SPEECH_API_KEY"); - - if (endpoint == null || apiKey == null) { - System.err.println("✗ Configuration error: Environment variables not set"); - System.err.println(" → Please set SPEECH_ENDPOINT and SPEECH_API_KEY"); - System.err.println(); - return; - } - - TranscriptionClient client = null; - - try { - // Step 1: Create client - client = new TranscriptionClientBuilder() - .endpoint(endpoint) - .credential(new KeyCredential(apiKey)) - .buildClient(); - System.out.println("✓ Client created successfully"); - - // Step 2: Read audio file with validation - String audioFilePath = "sample-audio.wav"; - - if (!Files.exists(Paths.get(audioFilePath))) { - throw new IllegalArgumentException("Audio file not found: " + audioFilePath); - } - - byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); - System.out.println("✓ Audio file loaded (" + audioData.length + " bytes)"); - - // Step 3: Validate audio size - final int maxFileSize = 250 * 1024 * 1024; // 250 MB - if (audioData.length > maxFileSize) { - throw new IllegalArgumentException( - "Audio file too large: " + audioData.length + " bytes (max: " + maxFileSize + ")"); - } - System.out.println("✓ Audio size validated"); - - // Step 4: Prepare transcription request - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename(audioFilePath); - TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - System.out.println("✓ Request prepared"); - - // BEGIN: com.azure.ai.speech.transcription.error.retry-logic - // Step 5: Transcribe with retry logic - int maxRetries = 3; - int retryCount = 0; - TranscriptionResult result = null; - - while (retryCount < maxRetries) { - try { - System.out.println(" Attempting transcription (attempt " + (retryCount + 1) + "/" + maxRetries + ")..."); - result = client.transcribe(options); - break; // Success, exit retry loop - } catch (HttpResponseException e) { - if (e.getResponse().getStatusCode() == 429 || e.getResponse().getStatusCode() >= 500) { - // Retryable error - retryCount++; - if (retryCount < maxRetries) { - long backoffMs = (long) (1000 * Math.pow(2, retryCount - 1)); // Exponential backoff - System.out.println(" → Retryable error, waiting " + backoffMs + "ms before retry..."); - Thread.sleep(backoffMs); - } else { - throw e; // Max retries reached - } - } else { - throw e; // Non-retryable error - } - } - } - // END: com.azure.ai.speech.transcription.error.retry-logic - - // Step 6: Process results - if (result != null) { - System.out.println("\n✓ Transcription completed successfully!"); - System.out.println(" Duration: " + result.getDuration() + " ms"); - if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { - System.out.println(" Phrases: " + result.getCombinedPhrases().size()); - } - } - - } catch (IllegalArgumentException e) { - System.err.println("\n✗ Validation error: " + e.getMessage()); - } catch (ClientAuthenticationException e) { - System.err.println("\n✗ Authentication error: " + e.getMessage()); - System.err.println(" → Check your API key and endpoint"); - } catch (HttpResponseException e) { - System.err.println("\n✗ Service error: " + e.getMessage()); - System.err.println(" → Status code: " + e.getResponse().getStatusCode()); - } catch (IOException e) { - System.err.println("\n✗ File I/O error: " + e.getMessage()); - } catch (InterruptedException e) { - System.err.println("\n✗ Interrupted during retry: " + e.getMessage()); - Thread.currentThread().interrupt(); - } catch (Exception e) { - System.err.println("\n✗ Unexpected error: " + e.getMessage()); - e.printStackTrace(); - } - - System.out.println(); - } -} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md index a4701b66bb33..bc94eba7737f 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md @@ -87,15 +87,15 @@ The samples will automatically detect which authentication method to use based o ## Available Samples -### BasicTranscriptionSample.java +### TranscribeAudioFileSample.java -**Champion scenario**: Simple audio transcription +**Champion scenario**: Basic audio transcription from a file Demonstrates the most common use case - transcribing a single audio file with minimal configuration. **Key features**: -- Creating a TranscriptionClient with API Key or Azure AD authentication +- Creating a TranscriptionClient - Reading an audio file - Transcribing with default options - Processing results @@ -104,73 +104,124 @@ Demonstrates the most common use case - transcribing a single audio file with mi ```bash cd sdk/cognitiveservices/azure-ai-speech-transcription -mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.BasicTranscriptionSample" +mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.TranscribeAudioFileSample" ``` --- -### AdvancedTranscriptionSample.java +### TranscribeFromUrlSample.java -**Champion scenario**: Complex transcription with custom configuration +**Champion scenario**: Transcribe audio from a URL -Shows how to use advanced features for production scenarios. +Demonstrates how to transcribe audio directly from a URL without downloading the file locally. **Key features**: -- Custom client configuration (logging, retry policies) -- Both API Key and Azure AD authentication examples -- Advanced transcription options (locale, profanity filtering) -- Speaker diarization (identifying different speakers) -- Detailed result processing with word-level timings +- Creating TranscriptionOptions with a URL +- Transcribing remote audio files **Run**: ```bash -mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.AdvancedTranscriptionSample" +mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.TranscribeFromUrlSample" ``` --- -### AsyncTranscriptionSample.java +### TranscribeMultiLanguageSample.java -**Champion scenario**: Asynchronous transcription with reactive programming +**Champion scenario**: Multi-language transcription -Demonstrates non-blocking operations using TranscriptionAsyncClient and Project Reactor. +Demonstrates how to transcribe audio containing multiple languages with automatic language detection. **Key features**: -- Creating a TranscriptionAsyncClient with both authentication methods -- Using reactive patterns (subscribe, block, timeout) -- Error handling in async operations -- Different async patterns for various use cases +- Automatic language detection +- Handling multi-language results **Run**: ```bash -mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.AsyncTranscriptionSample" +mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.TranscribeMultiLanguageSample" ``` --- -### ErrorHandlingSample.java +### EnhancedModeSample.java -**Champion scenario**: Robust error handling +**Champion scenario**: Enhanced transcription quality -Shows how to properly handle errors and exceptions in production code. +Demonstrates how to use enhanced mode with custom prompts and other advanced features. **Key features**: -- API Key authentication error handling -- Azure AD authentication error handling (token expiration, missing credentials) -- File I/O error handling -- Service error handling (rate limiting, server errors) -- Retry logic with exponential backoff -- Comprehensive error handling pattern +- Using EnhancedModeOptions +- Providing custom prompts for better accuracy +- Specifying task types **Run**: ```bash -mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.ErrorHandlingSample" +mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.EnhancedModeSample" +``` + +--- + +### TranscribeWithDiarizationSample.java + +**Champion scenario**: Speaker diarization + +Demonstrates how to identify different speakers in the audio. + +**Key features**: + +- Enabling speaker diarization +- Configuring max speakers +- Processing speaker-separated results + +**Run**: + +```bash +mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.TranscribeWithDiarizationSample" +``` + +--- + +### TranscribeWithPhraseListSample.java + +**Champion scenario**: Improving accuracy with phrase lists + +Demonstrates how to use a phrase list to improve recognition of specific terms. + +**Key features**: + +- Creating a PhraseListOptions +- Adding custom phrases and boosting their probability +- Improving accuracy for domain-specific terminology + +**Run**: + +```bash +mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.TranscribeWithPhraseListSample" +``` + +--- + +### TranscribeWithProfanityFilterSample.java + +**Champion scenario**: Profanity filtering + +Demonstrates how to configure profanity filtering options. + +**Key features**: + +- Setting ProfanityFilterMode (Masked, Removed, None) +- Handling filtered results + +**Run**: + +```bash +mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.TranscribeWithProfanityFilterSample" ``` --- diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java index 49a1bfe2a104..a814389f8993 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java @@ -6,6 +6,7 @@ import com.azure.ai.speech.transcription.models.AudioFileDetails; import com.azure.ai.speech.transcription.models.EnhancedModeOptions; +import com.azure.ai.speech.transcription.models.PhraseListOptions; import com.azure.ai.speech.transcription.models.ProfanityFilterMode; import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; import com.azure.ai.speech.transcription.models.TranscriptionOptions; @@ -244,11 +245,14 @@ public void enhancedModeBasic() throws Exception { AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) .setFilename("audio.wav"); - // Enable enhanced mode for improved transcription quality - EnhancedModeOptions enhancedMode = new EnhancedModeOptions(); + // Enable enhanced mode for improved transcription quality with lexical format + EnhancedModeOptions enhancedMode = new EnhancedModeOptions() + .setPrompts(java.util.Arrays.asList( + "Output must be in lexical format." + )); TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) - .setLocales(java.util.Arrays.asList("en-US")) + .setLocales(java.util.Arrays.asList("en-US", "es-ES")) .setEnhancedModeOptions(enhancedMode); TranscriptionResult result = client.transcribe(options); @@ -271,15 +275,17 @@ public void enhancedModeWithPrompts() throws Exception { .setFilename("audio.wav"); // Use prompts to guide transcription with domain-specific terminology + // Always include lexical format prompt for best results EnhancedModeOptions enhancedMode = new EnhancedModeOptions() .setPrompts(java.util.Arrays.asList( + "Output must be in lexical format.", "Medical consultation discussing hypertension and diabetes", "Common medications: metformin, lisinopril, atorvastatin", "Patient symptoms and treatment plan" )); TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) - .setLocales(java.util.Arrays.asList("en-US")) + .setLocales(java.util.Arrays.asList("en-US", "es-ES")) .setEnhancedModeOptions(enhancedMode); TranscriptionResult result = client.transcribe(options); @@ -366,5 +372,91 @@ public void transcribeWithAudioFileDetails() throws Exception { }); // END: readme-sample-transcribeWithAudioFileDetails } + + /** + * Sample for multi-language transcription. + */ + public void transcribeMultiLanguage() throws Exception { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionoptions.multilanguage + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + + // Configure transcription WITHOUT specifying locales + // This allows the service to auto-detect and transcribe multiple languages + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); + + TranscriptionResult result = client.transcribe(options); + + result.getPhrases().forEach(phrase -> { + System.out.println("Language: " + phrase.getLocale()); + System.out.println("Text: " + phrase.getText()); + }); + // END: com.azure.ai.speech.transcription.transcriptionoptions.multilanguage + } + + /** + * Sample for enhanced mode transcription. + */ + public void transcribeEnhancedMode() throws Exception { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionoptions.enhancedmode + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + + EnhancedModeOptions enhancedMode = new EnhancedModeOptions() + .setTask("transcribe") + .setPrompts(java.util.Arrays.asList("Output must be in lexical format.")); + + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) + .setEnhancedModeOptions(enhancedMode); + + TranscriptionResult result = client.transcribe(options); + + System.out.println("Transcription: " + result.getCombinedPhrases().get(0).getText()); + // END: com.azure.ai.speech.transcription.transcriptionoptions.enhancedmode + } + + /** + * Sample for transcription with phrase list. + */ + public void transcribeWithPhraseList() throws Exception { + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint("https://.cognitiveservices.azure.com/") + .credential(new KeyCredential("")) + .buildClient(); + + // BEGIN: com.azure.ai.speech.transcription.transcriptionoptions.phraselist + byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); + + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename("audio.wav"); + + PhraseListOptions phraseListOptions = new PhraseListOptions() + .setPhrases(java.util.Arrays.asList("Azure", "Cognitive Services")) + .setBiasingWeight(5.0); + + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) + .setPhraseListOptions(phraseListOptions); + + TranscriptionResult result = client.transcribe(options); + + result.getCombinedPhrases().forEach(phrase -> { + System.out.println(phrase.getText()); + }); + // END: com.azure.ai.speech.transcription.transcriptionoptions.phraselist + } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java new file mode 100644 index 000000000000..ebd5e30aa64b --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java @@ -0,0 +1,60 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.util.BinaryData; + +import java.nio.file.Files; +import java.nio.file.Paths; + +/** + * Simplest possible example of transcribing an audio file. + * + * This sample demonstrates the absolute minimum code needed to: + * 1. Create a client + * 2. Load an audio file + * 3. Transcribe it + * 4. Get the text result + */ +public class TranscribeAudioFileSample { + public static void main(String[] args) { + try { + // Get credentials from environment variables + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + // Create client + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + + // Load audio file + String audioFilePath = "src/samples/assets/sample-audio.wav"; + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + + // Create audio file details + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + // Transcribe + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); + TranscriptionResult result = client.transcribe(options); + + // Print result + System.out.println("Transcription:"); + result.getCombinedPhrases().forEach(phrase -> + System.out.println(phrase.getText()) + ); + + } catch (Exception e) { + System.err.println("Error: " + e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeFromUrlSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeFromUrlSample.java new file mode 100644 index 000000000000..b1f77c0beba9 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeFromUrlSample.java @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.AzureKeyCredential; +import java.util.Arrays; + +/** + * Sample demonstrates how to transcribe audio from a URL. + */ +public class TranscribeFromUrlSample { + + /** + * Main method to invoke this demo. + * + * @param args Unused arguments to the program. + */ + public static void main(String[] args) { + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + if (endpoint == null || apiKey == null) { + System.err.println("Please set SPEECH_ENDPOINT and SPEECH_API_KEY environment variables."); + System.exit(1); + } + + // Create the transcription client + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new AzureKeyCredential(apiKey)) + .buildClient(); + + System.out.println("Azure AI Speech Transcription - Transcribe from URL Sample"); + System.out.println("============================================================\n"); + + // Audio file URL (must be publicly accessible) + // Using sample audio from Azure documentation + String audioUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-speech-sdk/master/sampledata/audiofiles/aboutSpeechSdk.wav"; + + System.out.println("Transcribing audio from URL: " + audioUrl); + System.out.println(); + + // Create transcription options with audio URL + TranscriptionOptions options = new TranscriptionOptions(audioUrl) + .setLocales(Arrays.asList("en-US")); + + // Transcribe the audio from URL + TranscriptionResult result = client.transcribe(options); + + // Display results + System.out.println("Transcription Results:"); + System.out.println("---------------------"); + System.out.println("Duration: " + result.getDuration() + "\n"); + + if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { + System.out.println("Combined text: " + result.getCombinedPhrases().get(0).getText()); + } + + System.out.println(); + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java new file mode 100644 index 000000000000..6be7061cceda --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java @@ -0,0 +1,108 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.TranscribedPhrase; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.AzureKeyCredential; +import com.azure.core.util.BinaryData; +import java.nio.file.Files; +import java.nio.file.Paths; + +/** + * Sample demonstrates how to transcribe audio containing multiple languages. + * + * When locales are NOT specified, the service automatically detects and transcribes + * multiple languages within the same audio file, switching between them as needed. + * This is useful for: + * - Multilingual conversations + * - Code-switched speech (e.g., Spanish-English) + * - International meetings or interviews + */ +public class TranscribeMultiLanguageSample { + + /** + * Main method to invoke this demo. + * + * @param args Unused arguments to the program. + */ + public static void main(String[] args) { + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + if (endpoint == null || apiKey == null) { + System.err.println("Please set SPEECH_ENDPOINT and SPEECH_API_KEY environment variables."); + System.exit(1); + } + + System.out.println("Azure AI Speech Transcription - Multi-Language Sample"); + System.out.println("=====================================================\n"); + + // Create the transcription client + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new AzureKeyCredential(apiKey)) + .buildClient(); + + try { + // Load audio file + String audioFilePath = "src/samples/assets/sample-audio.wav"; + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails fileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + // Configure transcription WITHOUT specifying locales + // This allows the service to auto-detect and transcribe multiple languages + // within the same audio file, switching between them as needed + TranscriptionOptions options = new TranscriptionOptions(fileDetails); + + System.out.println("Transcribing with automatic multi-language detection..."); + System.out.println("(No locale specified - service will detect all languages)\n"); + + // Transcribe the audio + TranscriptionResult result = client.transcribe(options); + + // Display results + System.out.println("Transcription Results:"); + System.out.println("---------------------"); + System.out.println("Duration: " + result.getDuration()); + System.out.println("Total phrases found: " + (result.getPhrases() != null ? result.getPhrases().size() : 0)); + System.out.println("Total combined phrases: " + (result.getCombinedPhrases() != null ? result.getCombinedPhrases().size() : 0)); + System.out.println(); + + // Show detailed phrases with timestamps + if (result.getPhrases() != null && !result.getPhrases().isEmpty()) { + System.out.println("Detailed Phrases:"); + System.out.println("-----------------"); + + for (int i = 0; i < result.getPhrases().size(); i++) { + TranscribedPhrase phrase = result.getPhrases().get(i); + long offsetMs = phrase.getOffset(); + long durationMs = phrase.getDuration().toMillis(); + + System.out.println("\n[Phrase " + (i + 1) + "] " + offsetMs + "ms - " + (offsetMs + durationMs) + "ms"); + System.out.println("Locale: " + phrase.getLocale()); + System.out.println("Text: " + phrase.getText()); + } + } + + // Also show combined phrases per channel + if (result.getCombinedPhrases() != null && !result.getCombinedPhrases().isEmpty()) { + System.out.println("\n\nCombined Transcription (All Languages):"); + System.out.println("========================================"); + result.getCombinedPhrases().forEach(phrase -> { + System.out.println(phrase.getText()); + }); + } + + System.out.println("\nNote: When no locales are specified, the service transcribes all languages"); + System.out.println("present in the audio. However, the locale field in each phrase may not always"); + System.out.println("accurately reflect the actual language of that specific phrase."); } catch (Exception e) { + System.err.println("Error: " + e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java new file mode 100644 index 000000000000..bc76e6ef3885 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java @@ -0,0 +1,87 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.TranscribedPhrase; +import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.util.BinaryData; + +import java.nio.file.Files; +import java.nio.file.Paths; + +/** + * Sample demonstrates using speaker diarization to identify different speakers in audio. + * + * Speaker diarization detects and separates different speakers in the audio, labeling + * each transcribed segment with a speaker ID. This is useful for: + * - Meeting transcriptions + * - Interview recordings + * - Multi-person conversations + * - Podcast transcriptions + */ +public class TranscribeWithDiarizationSample { + public static void main(String[] args) { + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + if (endpoint == null || apiKey == null) { + System.err.println("Please set SPEECH_ENDPOINT and SPEECH_API_KEY environment variables"); + return; + } + + System.out.println("Azure AI Speech Transcription - Speaker Diarization Sample"); + System.out.println("===========================================================\n"); + + // Create client + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + + try { + // Load audio file + String audioFilePath = "src/samples/assets/sample-audio.wav"; + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + // Configure speaker diarization + TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions() + .setMaxSpeakers(5); // Maximum number of speakers to detect (2-36) + + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) + .setDiarizationOptions(diarizationOptions); + + System.out.println("Transcribing with speaker diarization (max 5 speakers)...\n"); + + // Transcribe with diarization + TranscriptionResult result = client.transcribe(options); + + // Display results organized by speaker + System.out.println("Transcription with Speaker Information:"); + System.out.println("----------------------------------------"); + + if (result.getPhrases() != null && !result.getPhrases().isEmpty()) { + for (TranscribedPhrase phrase : result.getPhrases()) { + int speakerId = phrase.getSpeaker() != null ? phrase.getSpeaker() : 0; + double startTime = phrase.getOffset() / 1000.0; + double endTime = (phrase.getOffset() + phrase.getDuration().toMillis()) / 1000.0; + + System.out.println(String.format("\n[Speaker %d] (%.2fs - %.2fs)", + speakerId, startTime, endTime)); + System.out.println(phrase.getText()); + } + } + + + } catch (Exception e) { + System.err.println("Error: " + e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java new file mode 100644 index 000000000000..653eab1f8a69 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java @@ -0,0 +1,98 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.PhraseListOptions; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.util.BinaryData; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; + +/** + * Sample demonstrates using a phrase list to improve recognition accuracy for specific terms. + * + * Phrase lists help the speech service better recognize domain-specific terminology, + * proper nouns, and uncommon words that might otherwise be misrecognized. + */ +public class TranscribeWithPhraseListSample { + public static void main(String[] args) { + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + if (endpoint == null || apiKey == null) { + System.err.println("Please set SPEECH_ENDPOINT and SPEECH_API_KEY environment variables"); + return; + } + + System.out.println("Azure AI Speech Transcription - Phrase List Sample"); + System.out.println("====================================================\n"); + + // Create client + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + + try { + // Load audio file + String audioFilePath = "src/samples/assets/sample-audio.wav"; + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + // Create phrase list with custom terms + // Add phrases that appear in your audio for better recognition + PhraseListOptions phraseListOptions = new PhraseListOptions() + .setPhrases(Arrays.asList( + "Mary", + "El Mundo", + "Secret Garden", + "empleada doméstica", + "habitación" + )) + .setBiasingWeight(5.0); // Weight range: 1.0-20.0 (higher = stronger bias) + + // Create transcription options with phrase list + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) + .setPhraseListOptions(phraseListOptions); + + System.out.println("Custom phrase list:"); + phraseListOptions.getPhrases().forEach(phrase -> + System.out.println(" - " + phrase) + ); + System.out.println("\nBiasing weight: " + phraseListOptions.getBiasingWeight()); + System.out.println("\nTranscribing with phrase list...\n"); + + // Transcribe + TranscriptionResult result = client.transcribe(options); + + System.out.println("Transcription result:"); + System.out.println("---------------------"); + result.getCombinedPhrases().forEach(phrase -> + System.out.println(phrase.getText()) + ); + + // Print individual phrases with timing information + if (result.getPhrases() != null && !result.getPhrases().isEmpty()) { + System.out.println("\nDetailed phrases:"); + result.getPhrases().forEach(phrase -> + System.out.println(String.format(" [%dms]: %s", + phrase.getOffset(), + phrase.getText())) + ); + } + + System.out.println("\n Transcription completed successfully!"); + + } catch (Exception e) { + System.err.println("Error: " + e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java new file mode 100644 index 000000000000..2d7cbbdcccc5 --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java @@ -0,0 +1,81 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.speech.transcription; + +import com.azure.ai.speech.transcription.models.AudioFileDetails; +import com.azure.ai.speech.transcription.models.ProfanityFilterMode; +import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.ai.speech.transcription.models.TranscriptionResult; +import com.azure.core.credential.KeyCredential; +import com.azure.core.util.BinaryData; + +import java.nio.file.Files; +import java.nio.file.Paths; + +/** + * Sample demonstrates profanity filtering in Azure AI Speech Transcription. + * Shows the difference between NONE (raw), MASKED (f***), REMOVED (omitted), and TAGS (XML tagged). + */ +public class TranscribeWithProfanityFilterSample { + /** + * Main method to run the profanity filter sample. + * + * @param args command line arguments (not used) + */ + public static void main(String[] args) { + System.out.println("Azure AI Speech Transcription - Profanity Filter Sample"); + System.out.println("==========================================================\n"); + + String endpoint = System.getenv("SPEECH_ENDPOINT"); + String apiKey = System.getenv("SPEECH_API_KEY"); + + if (endpoint == null || apiKey == null) { + System.err.println("Please set SPEECH_ENDPOINT and SPEECH_API_KEY environment variables"); + return; + } + + try { + // Create the transcription client + TranscriptionClient client = new TranscriptionClientBuilder() + .endpoint(endpoint) + .credential(new KeyCredential(apiKey)) + .buildClient(); + + // Load audio file + String audioFilePath = "src/samples/assets/sample-profanity.wav"; + byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath)); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) + .setFilename(audioFilePath); + + // Demonstrate different profanity filter modes + ProfanityFilterMode[] modes = { + ProfanityFilterMode.NONE, + ProfanityFilterMode.MASKED, + ProfanityFilterMode.REMOVED, + ProfanityFilterMode.TAGS + }; + + for (ProfanityFilterMode mode : modes) { + System.out.println("Transcribing with profanity filter mode: " + mode); + System.out.println("----------------------------------------------"); + + // Create transcription options with profanity filter + TranscriptionOptions options = new TranscriptionOptions(audioFileDetails) + .setProfanityFilterMode(mode); + + // Perform transcription + TranscriptionResult result = client.transcribe(options); + + // Display results + System.out.println("Combined text: " + result.getCombinedPhrases().get(0).getText()); + System.out.println(); + } + + + } catch (Exception e) { + System.err.println("Error during transcription: " + e.getMessage()); + e.printStackTrace(); + } + } +} From c0da94c88c2c9195703d80b7d2d82743db55e76e Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 12 Dec 2025 11:13:57 -0800 Subject: [PATCH 29/45] fix cspell --- .github/CODEOWNERS | 6 +++--- .vscode/cspell.json | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7db045636ca9..413b9732d5cf 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -263,11 +263,11 @@ # ServiceOwners: @rhurey # PRLabel: %Speech Transcription -/sdk/cognitiveservices/azure-ai-speech-transcription/ @amber-yujueWang @rhurey @xitzhang @Azure/azure-java-sdk +/sdk/cognitiveservices/azure-ai-speech-transcription/ @amber-yujueWang @rhurey @xitzhang @Azure/azure-java-sdk @pankopon # ServiceLabel: %Speech Transcription -# AzureSdkOwners: @amber-yujueWang @rhurey @xitzhang -# ServiceOwners: @rhurey @xitzhang @amber-yujueWang +# AzureSdkOwners: @amber-yujueWang @rhurey @xitzhang @pankopon +# ServiceOwners: @rhurey @xitzhang @amber-yujueWang @pankopon # PRLabel: %Cognitive - Text Analytics /sdk/textanalytics/ @samvaity @quentinRobinson @Azure/azure-java-sdk diff --git a/.vscode/cspell.json b/.vscode/cspell.json index 2117c33300a9..ba9a59610843 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -280,10 +280,12 @@ "doclinting", "doctitle", "dlocal", + "doméstica", "dtlk", "dtlksd", "dummyrg", "eastus", + "empleada", "embedme", "encryptor", "endtoend", @@ -309,6 +311,7 @@ "hana", "hanaonazure", "hdfs", + "habitación", "hdinsight", "healthdataaiservices", "HKLM", @@ -358,6 +361,7 @@ "mgmt", "mibps", "Mirena", + "misrecognized", "Mockito", "Mordor", "mosca", @@ -365,6 +369,7 @@ "msal", "msix", "MSRC", + "Mundo", "netapp", "Netezza", "odata", From 62418e878f337edeafa0e9ddec42006bd928355a Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 12 Dec 2025 11:13:57 -0800 Subject: [PATCH 30/45] fix cspell --- .github/CODEOWNERS | 6 +++--- .vscode/cspell.json | 21 ------------------- .../azure-ai-speech-transcription/cspell.json | 16 ++++++++++++++ 3 files changed, 19 insertions(+), 24 deletions(-) create mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/cspell.json diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7db045636ca9..413b9732d5cf 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -263,11 +263,11 @@ # ServiceOwners: @rhurey # PRLabel: %Speech Transcription -/sdk/cognitiveservices/azure-ai-speech-transcription/ @amber-yujueWang @rhurey @xitzhang @Azure/azure-java-sdk +/sdk/cognitiveservices/azure-ai-speech-transcription/ @amber-yujueWang @rhurey @xitzhang @Azure/azure-java-sdk @pankopon # ServiceLabel: %Speech Transcription -# AzureSdkOwners: @amber-yujueWang @rhurey @xitzhang -# ServiceOwners: @rhurey @xitzhang @amber-yujueWang +# AzureSdkOwners: @amber-yujueWang @rhurey @xitzhang @pankopon +# ServiceOwners: @rhurey @xitzhang @amber-yujueWang @pankopon # PRLabel: %Cognitive - Text Analytics /sdk/textanalytics/ @samvaity @quentinRobinson @Azure/azure-java-sdk diff --git a/.vscode/cspell.json b/.vscode/cspell.json index 2117c33300a9..3eebb52c6caa 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -98,12 +98,10 @@ "sdk/containerregistry/azure-containers-containerregistry/**", "sdk/cosmos/azure-cosmos-dotnet-benchmark/**", "sdk/cosmos/azure-cosmos-benchmark/**", - "sdk/cosmos/azure-cosmos-spark_3/**", "sdk/cosmos/azure-cosmos-spark_3-1_2-12/**", "sdk/cosmos/azure-cosmos-spark_3-2_2-12/**", "sdk/cosmos/azure-cosmos-spark_3-3_2-12/**", "sdk/cosmos/azure-cosmos-spark_3-4_2-12/**", - "sdk/cosmos/azure-cosmos-spark_3-5/**", "sdk/cosmos/azure-cosmos-spark_3-5_2-12/**", "sdk/cosmos/azure-cosmos-spark-account-data-resolver-sample/**", "sdk/cosmos/fabric-cosmos-spark-auth_3/**", @@ -223,22 +221,17 @@ "autodetection", "awps", "azconfig", - "azuread", "azsdk", "azsynapse", "azurecr", "azurestackhci", "backoff", "boringssl", - "BYOS", "BYOD", - "dexec", - "diarization", "Dgpg", "Dskip", "mvnw", "TBLPROPERTIES", - "CSDL", "Cyclomatic", "branchcoverage", "cacerts", @@ -293,12 +286,10 @@ "Esto", "etag", "euap", - "evals", "eventhub", "eventhubs", "failondeprecatedstatus", "FHIR", - "FOURX", "filereports", "gapra", "gltf", @@ -319,7 +310,6 @@ "includable", "includables", "idnum", - "inpainting", "insights", "intellij", "Intellij", @@ -408,7 +398,6 @@ "SERIALVERSIONID", "servicebus", "sftdl", - "SIXX", "skus", "snomed", "sonatype", @@ -871,16 +860,6 @@ "ubinary", "UBINARY" ] - }, - { - "filename": "/sdk/ai/azure-ai-voicelive/**", - "words": [ - "Dexec", - "viseme", - "VISEME", - "webrtc", - "WEBRTC" - ] }, { "filename": "/sdk/datalakeanalytics/**", diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/cspell.json b/sdk/cognitiveservices/azure-ai-speech-transcription/cspell.json new file mode 100644 index 000000000000..4c33070b4f8d --- /dev/null +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/cspell.json @@ -0,0 +1,16 @@ +{ + "version": "0.2", + "language": "en", + "words": [ + "azuread", + "BYOD", + "BYOS", + "dexec", + "diarization", + "doméstica", + "empleada", + "habitación", + "misrecognized", + "Mundo" + ] +} From 6bf7a5d7f65b57796611efc330209f8e402b24ed Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 12 Dec 2025 11:29:04 -0800 Subject: [PATCH 31/45] fix codeownerlint --- .github/CODEOWNERS | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 413b9732d5cf..7db045636ca9 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -263,11 +263,11 @@ # ServiceOwners: @rhurey # PRLabel: %Speech Transcription -/sdk/cognitiveservices/azure-ai-speech-transcription/ @amber-yujueWang @rhurey @xitzhang @Azure/azure-java-sdk @pankopon +/sdk/cognitiveservices/azure-ai-speech-transcription/ @amber-yujueWang @rhurey @xitzhang @Azure/azure-java-sdk # ServiceLabel: %Speech Transcription -# AzureSdkOwners: @amber-yujueWang @rhurey @xitzhang @pankopon -# ServiceOwners: @rhurey @xitzhang @amber-yujueWang @pankopon +# AzureSdkOwners: @amber-yujueWang @rhurey @xitzhang +# ServiceOwners: @rhurey @xitzhang @amber-yujueWang # PRLabel: %Cognitive - Text Analytics /sdk/textanalytics/ @samvaity @quentinRobinson @Azure/azure-java-sdk From d91ab162562448ab988bcda56ba16969cac8350b Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 12 Dec 2025 11:31:30 -0800 Subject: [PATCH 32/45] fix cspell --- .vscode/cspell.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.vscode/cspell.json b/.vscode/cspell.json index 57d58e090aba..3eebb52c6caa 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -273,12 +273,10 @@ "doclinting", "doctitle", "dlocal", - "doméstica", "dtlk", "dtlksd", "dummyrg", "eastus", - "empleada", "embedme", "encryptor", "endtoend", @@ -302,7 +300,6 @@ "hana", "hanaonazure", "hdfs", - "habitación", "hdinsight", "healthdataaiservices", "HKLM", @@ -351,7 +348,6 @@ "mgmt", "mibps", "Mirena", - "misrecognized", "Mockito", "Mordor", "mosca", @@ -359,7 +355,6 @@ "msal", "msix", "MSRC", - "Mundo", "netapp", "Netezza", "odata", From aa71822c350541e3bf34290eda9bf95ea74726c4 Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 12 Dec 2025 11:34:57 -0800 Subject: [PATCH 33/45] fix codeowner lint --- .github/CODEOWNERS | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 413b9732d5cf..7db045636ca9 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -263,11 +263,11 @@ # ServiceOwners: @rhurey # PRLabel: %Speech Transcription -/sdk/cognitiveservices/azure-ai-speech-transcription/ @amber-yujueWang @rhurey @xitzhang @Azure/azure-java-sdk @pankopon +/sdk/cognitiveservices/azure-ai-speech-transcription/ @amber-yujueWang @rhurey @xitzhang @Azure/azure-java-sdk # ServiceLabel: %Speech Transcription -# AzureSdkOwners: @amber-yujueWang @rhurey @xitzhang @pankopon -# ServiceOwners: @rhurey @xitzhang @amber-yujueWang @pankopon +# AzureSdkOwners: @amber-yujueWang @rhurey @xitzhang +# ServiceOwners: @rhurey @xitzhang @amber-yujueWang # PRLabel: %Cognitive - Text Analytics /sdk/textanalytics/ @samvaity @quentinRobinson @Azure/azure-java-sdk From 49fea43fd8bd5863625695fc2f46c9debff0b956 Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 12 Dec 2025 15:30:09 -0800 Subject: [PATCH 34/45] update tests --- .../azure-ai-speech-transcription/assets.json | 2 +- .../TranscribeMultiLanguageSample.java | 3 +- .../azure/ai/speech/transcription/README.md | 64 ++++++++++--- .../TranscriptionAsyncClientTest.java | 90 +++++++++-------- .../TranscriptionClientTest.java | 16 ++++ .../TranscriptionClientTestBase.java | 96 +++++++++++++------ 6 files changed, 189 insertions(+), 82 deletions(-) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/assets.json b/sdk/cognitiveservices/azure-ai-speech-transcription/assets.json index b87270f0fd55..b17c2a5d9d23 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/assets.json +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/assets.json @@ -1 +1 @@ -{"AssetsRepo":"Azure/azure-sdk-assets","AssetsRepoPrefixPath":"java","TagPrefix":"java/cognitiveservices/azure-ai-speech-transcription","Tag": "java/cognitiveservices/azure-ai-speech-transcription_5be01e978d"} \ No newline at end of file +{"AssetsRepo":"Azure/azure-sdk-assets","AssetsRepoPrefixPath":"java","TagPrefix":"java/cognitiveservices/azure-ai-speech-transcription","Tag": "java/cognitiveservices/azure-ai-speech-transcription_3b50d0dce8"} \ No newline at end of file diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java index 6be7061cceda..8c5066109660 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java @@ -100,7 +100,8 @@ public static void main(String[] args) { System.out.println("\nNote: When no locales are specified, the service transcribes all languages"); System.out.println("present in the audio. However, the locale field in each phrase may not always"); - System.out.println("accurately reflect the actual language of that specific phrase."); } catch (Exception e) { + System.out.println("accurately reflect the actual language of that specific phrase."); + } catch (Exception e) { System.err.println("Error: " + e.getMessage()); e.printStackTrace(); } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md index cbdc20d4635b..be9f7a37b622 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md @@ -6,9 +6,9 @@ This directory contains tests for the Azure AI Speech Transcription client libra The tests are organized as follows: -- **TranscriptionClientTestBase.java**: Base class containing common test infrastructure, helper methods, and validation logic -- **TranscriptionClientTest.java**: Tests for the synchronous `TranscriptionClient` -- **TranscriptionAsyncClientTest.java**: Tests for the asynchronous `TranscriptionAsyncClient` +- **TranscriptionClientTestBase.java**: Base class containing common test infrastructure, helper methods, and validation logic. Includes support for both file-based and URL-based transcription. +- **TranscriptionClientTest.java**: Tests for the synchronous `TranscriptionClient` (14 tests) +- **TranscriptionAsyncClientTest.java**: Tests for the asynchronous `TranscriptionAsyncClient` (16 tests) - **generated/**: Auto-generated test templates (for reference only) ## Prerequisites @@ -47,7 +47,9 @@ export SPEECH_API_KEY="" ## Configure Test Proxy -The Azure SDK for Java uses a test proxy for recording and playing back HTTP interactions. Configure the test mode by setting the `AZURE_TEST_MODE` environment variable: +The Azure SDK for Java uses a test proxy for recording and playing back HTTP interactions. This library has been migrated to use the test proxy following the [Test Proxy Migration Guide](https://github.com/Azure/azure-sdk-for-java/blob/main/eng/common/testproxy/README.md). + +Test recordings are stored in the [azure-sdk-assets](https://github.com/Azure/azure-sdk-assets) repository and referenced via the `assets.json` file. Configure the test mode by setting the `AZURE_TEST_MODE` environment variable: ### Live Mode (against live service) @@ -63,7 +65,11 @@ This mode makes real HTTP calls to the Azure service. Use this when you want to $env:AZURE_TEST_MODE = "RECORD" ``` -This mode makes real HTTP calls and records them for later playback. Recorded sessions are saved in the `session-records` directory. +This mode makes real HTTP calls and records them for later playback. Recordings are managed by the test-proxy tool and can be pushed to the azure-sdk-assets repository using: + +```bash +test-proxy push -a assets.json +``` ### Playback Mode (use recordings) @@ -105,9 +111,10 @@ mvn test -Dtest=TranscriptionClientTest#testTranscribeSyncBasicFromFile ### Synchronous Tests (TranscriptionClientTest) -Tests for the synchronous `TranscriptionClient`, including: +Tests for the synchronous `TranscriptionClient` (14 tests), including: - Basic transcription from file +- Transcription from URL (using publicly accessible audio URL) - Transcription with language specification - Transcription with multiple languages - Transcription with speaker diarization @@ -118,7 +125,11 @@ Tests for the synchronous `TranscriptionClient`, including: ### Asynchronous Tests (TranscriptionAsyncClientTest) -Tests for the asynchronous `TranscriptionAsyncClient`, mirroring the synchronous tests but using reactive programming patterns with `Mono` and `Flux`. +Tests for the asynchronous `TranscriptionAsyncClient` (16 tests), mirroring the synchronous tests but using reactive programming patterns with `Mono` and `Flux`. Includes additional tests for: + +- Transcription from URL (using publicly accessible audio URL) +- Error handling with invalid language codes +- Placeholder tests for empty audio data and cancellation scenarios ## Authentication @@ -135,8 +146,9 @@ To test with token-based authentication, some tests use `createClient(false, tru 1. **Missing environment variables**: Ensure `SPEECH_ENDPOINT` and `SPEECH_API_KEY` are set correctly 2. **Missing sample audio file**: Make sure you have a `sample.wav` file in the test directory (WAV, MP3, or OGG format, shorter than 2 hours, smaller than 250 MB) -3. **Test proxy issues**: If playback tests fail, try running in LIVE or RECORD mode first -4. **Network issues**: Check your network connection and firewall settings +3. **URL transcription failures**: URL-based transcription requires a specific API key tier that supports this feature. If URL tests fail with 401 errors, verify your Speech resource supports URL transcription. +4. **Test proxy issues**: If playback tests fail, try running in LIVE or RECORD mode first to regenerate recordings +5. **Network issues**: Check your network connection and firewall settings ### Enable Detailed Logging @@ -158,15 +170,45 @@ $env:AZURE_LOG_LEVEL = "verbose" The current tests cover: - ✅ Client instantiation with different authentication methods -- ✅ Basic transcription functionality +- ✅ Basic transcription functionality from files +- ✅ Transcription from publicly accessible URLs - ✅ Transcription with various options (language, diarization, profanity filter, timestamps) - ✅ Both synchronous and asynchronous clients - ✅ Methods with and without `Response` wrappers - ✅ Custom RequestOptions and headers +- ✅ Error handling (invalid language codes) Areas for future enhancement: -- ⬜ Error handling scenarios (invalid input, network errors, etc.) +- ⏳ Empty audio data handling (placeholder test exists) +- ⏳ Cancellation scenarios (placeholder test exists) - ⬜ Performance tests - ⬜ Concurrent request handling - ⬜ Edge cases (very long audio, multiple channels, etc.) + +## Recording Sanitizers + +The tests use the test-proxy's built-in sanitizers to automatically redact sensitive information from recordings: + +- API keys and authentication tokens +- Connection strings and passwords +- Account names and identifiers +- Hostnames in URLs + +Some default sanitizers (AZSDK2003, AZSDK2030, AZSDK3430, AZSDK3493) are explicitly removed to preserve resource identifiers needed for proper request matching during playback. + +## Managing Test Recordings + +### Restore recordings from assets repo + +```bash +test-proxy restore -a assets.json +``` + +### Push new recordings to assets repo + +```bash +test-proxy push -a assets.json +``` + +This creates a new tag in the azure-sdk-assets repository and updates `assets.json` with the new tag reference. diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java index 430064d26afc..2d46371ee25d 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java @@ -6,6 +6,7 @@ import com.azure.ai.speech.transcription.models.ProfanityFilterMode; import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions; import com.azure.ai.speech.transcription.models.TranscriptionOptions; +import com.azure.core.exception.HttpResponseException; import com.azure.core.http.HttpHeaderName; import com.azure.core.http.rest.RequestOptions; import org.junit.jupiter.api.Test; @@ -157,22 +158,18 @@ public void testTranscribeAsyncWithAllOptionsFromFileWithResponse() { @Test public void testTranscribeAsyncWithAudioUrl() { - // Test with audio URL option createClient(true, true, sync); - // Note: This test is commented out because it requires: - // 1. A valid, publicly accessible URL in live/record mode - // 2. Proper recording of the service response - // 3. The audio file at the URL must be in a supported format - // To enable this test: - // - Provide a valid audio URL - // - Uncomment the lines below - // - Run in RECORD mode to capture the interaction - // String methodName = new Object() { - // }.getClass().getEnclosingMethod().getName(); - // TranscriptionOptions options = new TranscriptionOptions("https://example.com/sample.wav"); - // options.setLocales(Arrays.asList("en-US")); - // doTranscription(methodName, sync, false, audioFile, options, null); + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + // Using a publicly accessible sample audio file from Azure samples + String audioUrl + = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-speech-sdk/master/sampledata/audiofiles/aboutSpeechSdk.wav"; + TranscriptionOptions options = new TranscriptionOptions(audioUrl).setLocales(Arrays.asList("en-US")); + + // For URL-based transcription, we don't pass the local audio file path + doTranscriptionWithUrl(methodName, sync, options); } @Test @@ -221,43 +218,56 @@ public void testTranscribeAsyncWithProfanityModeTags() { public void testTranscribeAsyncWithEmptyAudioData() { createClient(true, true, sync); - // Test with empty audio data - this should result in a service error - // Note: Depending on service behavior, this may throw HttpResponseException - // The exact behavior should be validated based on actual service responses - // Example implementation: - // StepVerifier.create(getAsyncClient().transcribe(emptyRequestContent)) - // .expectError(HttpResponseException.class) - // .verify(Duration.ofSeconds(30)); + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + // Test with minimal audio data - service should handle gracefully + TranscriptionOptions options = new TranscriptionOptions((String) null); + + doTranscription(methodName, sync, false, audioFile, options, null); } @Test public void testTranscribeAsyncWithInvalidLanguageCode() { createClient(true, true, sync); - // Note: This test requires actual service call to verify behavior - // In PLAYBACK mode, this would replay the recorded error response - // Example implementation with StepVerifier: - // TranscriptionOptions options = new TranscriptionOptions().setLocales(Arrays.asList("invalid-locale")); - // StepVerifier.create(getAsyncClient().transcribe(requestContentWithInvalidLocale)) - // .expectErrorMatches(throwable -> throwable instanceof HttpResponseException - // && ((HttpResponseException) throwable).getResponse().getStatusCode() == 400) - // .verify(Duration.ofSeconds(30)); + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + // Use invalid language code to trigger service error + TranscriptionOptions options + = new TranscriptionOptions((String) null).setLocales(Arrays.asList("invalid-locale-code")); + + // The service should return a 400 error for invalid locale + // doTranscription wraps exceptions in RuntimeException, so we catch that + try { + doTranscription(methodName, sync, false, audioFile, options, null); + // Should not reach here - the above should throw an exception + throw new AssertionError("Expected RuntimeException with HttpResponseException cause but none was thrown"); + } catch (RuntimeException e) { + // Expected behavior - verify the cause is HttpResponseException with 400 status + if (!(e.getCause() instanceof HttpResponseException)) { + throw new AssertionError( + "Expected RuntimeException cause to be HttpResponseException but got: " + e.getCause().getClass()); + } + HttpResponseException httpException = (HttpResponseException) e.getCause(); + if (httpException.getResponse().getStatusCode() != 400) { + throw new AssertionError( + "Expected 400 status code but got: " + httpException.getResponse().getStatusCode()); + } + } } @Test public void testTranscribeAsyncCancellation() { createClient(true, true, sync); - // Test that async operations can be cancelled properly - // This verifies that the reactive streams support cancellation - - // Note: Cancellation testing would typically involve subscribing and then cancelling - // Example pattern (commented out as it requires specific test setup): - // String methodName = new Object() { - // }.getClass().getEnclosingMethod().getName(); - // TranscriptionOptions options = new TranscriptionOptions(); - // Disposable subscription = getAsyncClient().transcribe(requestContent).subscribe(); - // subscription.dispose(); - // Verify that resources are cleaned up appropriately + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + // Test cancellation behavior with a normal transcription request + TranscriptionOptions options = new TranscriptionOptions((String) null); + + doTranscription(methodName, sync, false, audioFile, options, null); } } diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java index 3b225a1e7f76..0d9b261ccf44 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java @@ -170,6 +170,22 @@ public void testTranscribeSyncWithMultipleChannels() { doTranscription(methodName, sync, false, audioFile, options, null); } + @Test + public void testTranscribeSyncWithAudioUrl() { + createClient(true, true, sync); + + String methodName = new Object() { + }.getClass().getEnclosingMethod().getName(); + + // Using a publicly accessible sample audio file from Azure samples + String audioUrl + = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-speech-sdk/master/sampledata/audiofiles/aboutSpeechSdk.wav"; + TranscriptionOptions options = new TranscriptionOptions(audioUrl).setLocales(Arrays.asList("en-US")); + + // For URL-based transcription, we don't pass the local audio file path + doTranscriptionWithUrl(methodName, sync, options); + } + /*********************************************************************************** * * ERROR HANDLING TESTS diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java index 58bf684fd14b..06c1c60518f9 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java @@ -117,9 +117,12 @@ protected void createClient(Boolean useKeyAuth, Boolean useRealKey, Boolean sync transcriptionClientBuilder.credential(new KeyCredential(key)); } - // Set recording filters + // Configure sanitizers - must be done after registering the record policy or playback client if (!interceptorManager.isLiveMode()) { - // Remove sanitizers that might interfere with transcription-specific headers + // Remove default sanitizers that would interfere with Speech service recordings: + // - AZSDK3430 (id sanitizer): Preserve resource identifiers needed for request matching + // - AZSDK3493 (name sanitizer): Preserve resource names needed for request matching + // - AZSDK2003, AZSDK2030: URI-related sanitizers that may affect Speech endpoints interceptorManager.removeSanitizers("AZSDK2003", "AZSDK2030", "AZSDK3430", "AZSDK3493"); } @@ -130,6 +133,33 @@ protected void createClient(Boolean useKeyAuth, Boolean useRealKey, Boolean sync } } + /** + * Performs transcription with audio URL and validates the result. + * + * @param testName A label that uniquely defines the test. Used in console printout. + * @param sync 'true' to use synchronous client, 'false' to use asynchronous client. + * @param options TranscriptionOptions with audioUrl set + */ + protected void doTranscriptionWithUrl(String testName, Boolean sync, TranscriptionOptions options) { + try { + // Verify that audioUrl is set + assertNotNull(options.getAudioUrl(), "AudioUrl must be set for URL-based transcription"); + assertFalse(options.getAudioUrl().isEmpty(), "AudioUrl must not be empty"); + + TranscriptionResult result = null; + if (sync) { + result = client.transcribe(options); + } else { + result = asyncClient.transcribe(options).block(); + } + + validateTranscriptionResult(testName, result); + } catch (Exception e) { + LOGGER.error("Error in test {}: {}", testName, e.getMessage()); + throw new RuntimeException(e); + } + } + /** * Performs transcription and validates the result. * @@ -166,21 +196,25 @@ protected void doTranscription(String testName, Boolean sync, Boolean transcribe if (!transcribeWithResponse) { result = client.transcribe(options); } else { - // For transcribeWithResponse, we need to manually prepare the multipart request body if (requestOptions == null) { - requestOptions = new RequestOptions(); + // Use the new transcribeWithResponse(TranscriptionOptions) convenience method + Response response = client.transcribeWithResponse(options); + printHttpRequestAndResponse(response); + result = response.getValue(); + } else { + // When custom RequestOptions are needed, use the lower-level API + BinaryData multipartBody + = new com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper( + requestOptions) + .serializeJsonField("definition", options) + .serializeFileField("audio", audioFileDetails.getContent(), + audioFileDetails.getContentType(), audioFileDetails.getFilename()) + .end() + .getRequestBody(); + Response response = client.transcribeWithResponse(multipartBody, requestOptions); + printHttpRequestAndResponse(response); + result = response.getValue().toObject(TranscriptionResult.class); } - BinaryData multipartBody - = new com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper(requestOptions) - .serializeJsonField("definition", options) - .serializeFileField("audio", audioFileDetails.getContent(), - audioFileDetails.getContentType(), audioFileDetails.getFilename()) - .end() - .getRequestBody(); - - Response response = client.transcribeWithResponse(multipartBody, requestOptions); - printHttpRequestAndResponse(response); - result = response.getValue().toObject(TranscriptionResult.class); } validateTranscriptionResult(testName, result); } else { @@ -188,22 +222,26 @@ protected void doTranscription(String testName, Boolean sync, Boolean transcribe if (!transcribeWithResponse) { result = asyncClient.transcribe(options).block(); } else { - // For transcribeWithResponse, we need to manually prepare the multipart request body if (requestOptions == null) { - requestOptions = new RequestOptions(); + // Use the new transcribeWithResponse(TranscriptionOptions) convenience method + Response response = asyncClient.transcribeWithResponse(options).block(); + printHttpRequestAndResponse(response); + result = response.getValue(); + } else { + // When custom RequestOptions are needed, use the lower-level API + BinaryData multipartBody + = new com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper( + requestOptions) + .serializeJsonField("definition", options) + .serializeFileField("audio", audioFileDetails.getContent(), + audioFileDetails.getContentType(), audioFileDetails.getFilename()) + .end() + .getRequestBody(); + Response response + = asyncClient.transcribeWithResponse(multipartBody, requestOptions).block(); + printHttpRequestAndResponse(response); + result = response.getValue().toObject(TranscriptionResult.class); } - BinaryData multipartBody - = new com.azure.ai.speech.transcription.implementation.MultipartFormDataHelper(requestOptions) - .serializeJsonField("definition", options) - .serializeFileField("audio", audioFileDetails.getContent(), - audioFileDetails.getContentType(), audioFileDetails.getFilename()) - .end() - .getRequestBody(); - - Response response - = asyncClient.transcribeWithResponse(multipartBody, requestOptions).block(); - printHttpRequestAndResponse(response); - result = response.getValue().toObject(TranscriptionResult.class); } validateTranscriptionResult(testName, result); } From 05514023ce45bd6fe5646c3013457d7ef1e6c832 Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 12 Dec 2025 15:48:46 -0800 Subject: [PATCH 35/45] update broken links --- .../azure-ai-speech-transcription/CHANGELOG.md | 2 +- .../src/test/java/com/azure/ai/speech/transcription/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md b/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md index b36b5e47a44b..2064b41329db 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md @@ -1,6 +1,6 @@ # Release History -## 1.0.0-beta.1 (2025-11-14) +## 1.0.0-beta.1 (2025-12-12) ### Features Added diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md index be9f7a37b622..bcdab60d5319 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md @@ -47,7 +47,7 @@ export SPEECH_API_KEY="" ## Configure Test Proxy -The Azure SDK for Java uses a test proxy for recording and playing back HTTP interactions. This library has been migrated to use the test proxy following the [Test Proxy Migration Guide](https://github.com/Azure/azure-sdk-for-java/blob/main/eng/common/testproxy/README.md). +The Azure SDK for Java uses a test proxy for recording and playing back HTTP interactions. This library has been migrated to use the test proxy following the [Test Proxy Migration Guide](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/core/azure-core-test/TestProxyMigrationGuide.md). Test recordings are stored in the [azure-sdk-assets](https://github.com/Azure/azure-sdk-assets) repository and referenced via the `assets.json` file. Configure the test mode by setting the `AZURE_TEST_MODE` environment variable: From f9cc844180b552f43957bdf374801cc856a76a85 Mon Sep 17 00:00:00 2001 From: wangamber Date: Fri, 12 Dec 2025 16:21:50 -0800 Subject: [PATCH 36/45] checkout cspell --- .vscode/cspell.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.vscode/cspell.json b/.vscode/cspell.json index 3eebb52c6caa..b692e840c4cc 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -98,10 +98,12 @@ "sdk/containerregistry/azure-containers-containerregistry/**", "sdk/cosmos/azure-cosmos-dotnet-benchmark/**", "sdk/cosmos/azure-cosmos-benchmark/**", + "sdk/cosmos/azure-cosmos-spark_3/**", "sdk/cosmos/azure-cosmos-spark_3-1_2-12/**", "sdk/cosmos/azure-cosmos-spark_3-2_2-12/**", "sdk/cosmos/azure-cosmos-spark_3-3_2-12/**", "sdk/cosmos/azure-cosmos-spark_3-4_2-12/**", + "sdk/cosmos/azure-cosmos-spark_3-5/**", "sdk/cosmos/azure-cosmos-spark_3-5_2-12/**", "sdk/cosmos/azure-cosmos-spark-account-data-resolver-sample/**", "sdk/cosmos/fabric-cosmos-spark-auth_3/**", @@ -232,6 +234,7 @@ "Dskip", "mvnw", "TBLPROPERTIES", + "CSDL", "Cyclomatic", "branchcoverage", "cacerts", @@ -286,10 +289,12 @@ "Esto", "etag", "euap", + "evals", "eventhub", "eventhubs", "failondeprecatedstatus", "FHIR", + "FOURX", "filereports", "gapra", "gltf", @@ -310,6 +315,7 @@ "includable", "includables", "idnum", + "inpainting", "insights", "intellij", "Intellij", @@ -398,6 +404,7 @@ "SERIALVERSIONID", "servicebus", "sftdl", + "SIXX", "skus", "snomed", "sonatype", @@ -860,6 +867,16 @@ "ubinary", "UBINARY" ] + }, + { + "filename": "/sdk/ai/azure-ai-voicelive/**", + "words": [ + "Dexec", + "viseme", + "VISEME", + "webrtc", + "WEBRTC" + ] }, { "filename": "/sdk/datalakeanalytics/**", From 82ed087aae074cdadabfba37b1e61afcc3cf81f9 Mon Sep 17 00:00:00 2001 From: wangamber Date: Wed, 17 Dec 2025 17:38:05 -0800 Subject: [PATCH 37/45] update readme and modify enabled property for EnhancedModeOptions --- .../README.md | 5 +- .../azure-ai-speech-transcription/README.md | 67 +++++------------- .../SpeechTranscriptionCustomization.java | 60 ++++++++++++++++ .../TranscriptionAsyncClient.java | 2 +- .../transcription/TranscriptionClient.java | 2 +- .../models/AudioFileDetails.java | 28 +++++++- .../models/EnhancedModeOptions.java | 12 ++++ .../transcription/EnhancedModeSample.java | 4 +- .../azure/ai/speech/transcription/README.md | 14 ++-- .../speech/transcription/ReadmeSamples.java | 68 ++++--------------- .../TranscribeAudioFileSample.java | 3 +- .../TranscribeMultiLanguageSample.java | 3 +- .../TranscribeWithDiarizationSample.java | 3 +- .../TranscribeWithPhraseListSample.java | 3 +- .../TranscribeWithProfanityFilterSample.java | 3 +- ...riptionAsyncClientJavaDocCodeSnippets.java | 12 ++-- ...ranscriptionClientJavaDocCodeSnippets.java | 10 ++- .../azure/ai/speech/transcription/README.md | 2 +- .../TranscriptionClientTestBase.java | 4 +- 19 files changed, 158 insertions(+), 147 deletions(-) diff --git a/sdk/agrifood/azure-verticals-agrifood-farming/README.md b/sdk/agrifood/azure-verticals-agrifood-farming/README.md index c7986b0b630a..0e9da5017918 100644 --- a/sdk/agrifood/azure-verticals-agrifood-farming/README.md +++ b/sdk/agrifood/azure-verticals-agrifood-farming/README.md @@ -103,8 +103,9 @@ Farm hierarchy is a collection of below entities. ```java readme-sample-createFarmHierarchy // Create Party -JSONObject object = new JSONObject().appendField("name", "party1"); -BinaryData party = BinaryData.fromObject(object); +Map partyData = new HashMap<>(); +partyData.put("name", "party1"); +BinaryData party = BinaryData.fromObject(partyData); partiesClient.createOrUpdateWithResponse("contoso-party", party, null).block(); // Get Party diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md index b27cef28dd8c..082177b1cc68 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md @@ -1,6 +1,6 @@ # Azure AI Speech Transcription client library for Java -The Azure AI Speech Transcription client library provides a simple and efficient way to convert audio to text using Azure Cognitive Services. This library enables you to transcribe audio files with features like speaker diarization, profanity filtering, and phrase hints for improved accuracy. +The Azure AI Speech Transcription client library provides a simple and efficient way to convert audio to text using Azure Cognitive Services. This library enables you to transcribe audio with features like speaker diarization, profanity filtering, and phrase hints for improved accuracy. ## Documentation @@ -30,9 +30,9 @@ Various documentation is available to help you get started: ``` [//]: # ({x-version-update-end}) -#### Optional: For Azure AD Authentication +#### Optional: For Entra ID Authentication -If you plan to use Azure AD authentication (recommended for production), also add the `azure-identity` dependency: +If you plan to use Entra ID authentication (recommended for production), also add the `azure-identity` dependency: ```xml @@ -65,11 +65,9 @@ TranscriptionClient client = new TranscriptionClientBuilder() .buildClient(); ``` -#### Option 2: Azure AD OAuth2 Authentication (Recommended for Production) +#### Option 2: Entra ID OAuth2 Authentication (Recommended for Production) -For production scenarios, it's recommended to use Azure Active Directory (Azure AD) authentication with managed identities or service principals. This provides better security and easier credential management. - -The OAuth2 scope for Azure Cognitive Services is: `https://cognitiveservices.azure.com/.default` +For production scenarios, it's recommended to use Entra ID authentication with managed identities or service principals. This provides better security and easier credential management. ```java import com.azure.identity.DefaultAzureCredential; @@ -84,12 +82,12 @@ TranscriptionClient client = new TranscriptionClientBuilder() .buildClient(); ``` -**Note:** To use Azure AD authentication, you need to: +**Note:** To use Entra ID authentication, you need to: 1. Add the `azure-identity` dependency to your project 2. Assign the appropriate role (e.g., "Cognitive Services User") to your managed identity or service principal -3. Ensure your Cognitive Services resource has Azure AD authentication enabled +3. Ensure your Cognitive Services resource has Entra ID authentication enabled -For more information on Azure AD authentication, see: +For more information on Entra ID authentication, see: - [Authenticate with Azure Identity](https://learn.microsoft.com/azure/developer/java/sdk/identity) - [Azure Cognitive Services authentication](https://learn.microsoft.com/azure/ai-services/authentication) @@ -97,7 +95,7 @@ For more information on Azure AD authentication, see: ### TranscriptionClient -The `TranscriptionClient` is the primary interface for interacting with the Speech Transcription service. It provides methods to transcribe audio files to text. +The `TranscriptionClient` is the primary interface for interacting with the Speech Transcription service. It provides methods to transcribe audio to text. ### TranscriptionAsyncClient @@ -105,7 +103,7 @@ The `TranscriptionAsyncClient` provides asynchronous methods for transcribing au ### Audio Formats -The service supports various audio formats including WAV, MP3, OGG, and more. Audio files must be: +The service supports various audio formats including WAV, MP3, OGG, and more. Audio must be: - Shorter than 2 hours in duration - Smaller than 250 MB in size @@ -135,8 +133,7 @@ try { byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); // Create audio file details - AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename("audio.wav"); + AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); // Create transcription options TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); @@ -176,36 +173,6 @@ result.getCombinedPhrases().forEach(phrase -> { }); ``` -### Transcribe using AudioFileDetails constructor - -You can also create `TranscriptionOptions` directly with `AudioFileDetails`: - -```java readme-sample-transcribeWithAudioFileDetails -TranscriptionClient client = new TranscriptionClientBuilder() - .endpoint("https://.cognitiveservices.azure.com/") - .credential(new KeyCredential("")) - .buildClient(); - -// Read audio file -byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); - -// Create audio file details -AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename("audio.wav") - .setContentType("audio/wav"); - -// Create transcription options with AudioFileDetails -TranscriptionOptions options = new TranscriptionOptions(audioFileDetails); - -// Transcribe audio -TranscriptionResult result = client.transcribe(options); - -// Process results -result.getCombinedPhrases().forEach(phrase -> { - System.out.println(phrase.getText()); -}); -``` - ### Transcribe with multi-language support The service can automatically detect and transcribe multiple languages within the same audio file. @@ -213,8 +180,7 @@ The service can automatically detect and transcribe multiple languages within th ```java com.azure.ai.speech.transcription.transcriptionoptions.multilanguage byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); -AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename("audio.wav"); +AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); // Configure transcription WITHOUT specifying locales // This allows the service to auto-detect and transcribe multiple languages @@ -235,10 +201,10 @@ Enhanced mode provides advanced features to improve transcription accuracy with ```java com.azure.ai.speech.transcription.transcriptionoptions.enhancedmode byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); -AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename("audio.wav"); +AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); EnhancedModeOptions enhancedMode = new EnhancedModeOptions() + .setEnabled(true) .setTask("transcribe") .setPrompts(java.util.Arrays.asList("Output must be in lexical format.")); @@ -257,8 +223,7 @@ You can use a phrase list to improve recognition accuracy for specific terms. ```java com.azure.ai.speech.transcription.transcriptionoptions.phraselist byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav")); -AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)) - .setFilename("audio.wav"); +AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData)); PhraseListOptions phraseListOptions = new PhraseListOptions() .setPhrases(java.util.Arrays.asList("Azure", "Cognitive Services")) @@ -299,7 +264,7 @@ You can enable logging to debug issues with the client library. The Azure client #### Authentication errors -- Verify that your API key is correct and has not expired +- Verify that your API key is correct - Ensure your endpoint URL matches your Azure resource region #### Audio format errors diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java index 3a7eba39e97a..c2b44471266b 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java @@ -59,6 +59,14 @@ public void customize(LibraryCustomization customization, Logger logger) { logger.info("Customizing TranscriptionDiarizationOptions.toJson()"); customizeDiarizationOptionsToJson(models); + // Customize EnhancedModeOptions to add setter for enabled property + logger.info("Customizing EnhancedModeOptions to add setEnabled() method"); + customizeEnhancedModeOptions(models); + + // Customize AudioFileDetails.getFilename() to auto-generate filename from contentType if not set + logger.info("Customizing AudioFileDetails.getFilename() to auto-generate filename"); + customizeAudioFileDetailsGetFilename(models); + // Add AudioFileDetails field and constructors to TranscriptionOptions, make setAudioUrl private, remove no-arg constructor logger .info("Customizing TranscriptionOptions to add AudioFileDetails support and remove no-arg constructor"); @@ -111,6 +119,58 @@ private void customizeDiarizationOptionsToJson(PackageCustomization packageCusto }); } + /** + * Customize AudioFileDetails.getFilename() to auto-generate a filename from contentType if not explicitly set. + * This allows developers to omit setFilename() and have the SDK automatically provide a sensible default. + * + * @param packageCustomization the package customization + */ + private void customizeAudioFileDetailsGetFilename(PackageCustomization packageCustomization) { + packageCustomization.getClass("AudioFileDetails").customizeAst(ast -> { + ast.getClassByName("AudioFileDetails").ifPresent(clazz -> { + clazz.getMethodsByName("getFilename").forEach(method -> { + method.setBody(parseBlock( + "{ if (this.filename != null && !this.filename.isEmpty()) { return this.filename; } " + + "if (\"audio/wav\".equalsIgnoreCase(this.contentType)) { return \"audio.wav\"; } " + + "if (\"audio/mpeg\".equalsIgnoreCase(this.contentType) || \"audio/mp3\".equalsIgnoreCase(this.contentType)) { return \"audio.mp3\"; } " + + "if (\"audio/ogg\".equalsIgnoreCase(this.contentType)) { return \"audio.ogg\"; } " + + "if (\"audio/flac\".equalsIgnoreCase(this.contentType)) { return \"audio.flac\"; } " + + "if (\"audio/webm\".equalsIgnoreCase(this.contentType)) { return \"audio.webm\"; } " + + "if (\"audio/opus\".equalsIgnoreCase(this.contentType)) { return \"audio.opus\"; } " + + "return \"audio\"; }")); + method.setJavadocComment( + new Javadoc(parseText("Get the filename property: The filename of the file. " + + "If not explicitly set, a filename will be auto-generated from the contentType.")) + .addBlockTag("return", "the filename value, or an auto-generated filename if not set.")); + }); + }); + }); + } + + /** + * Customize the EnhancedModeOptions to add a setter for the enabled property. + * The enabled property must be explicitly set by users to enable enhanced mode features. + * + * @param packageCustomization the package customization + */ + private void customizeEnhancedModeOptions(PackageCustomization packageCustomization) { + packageCustomization.getClass("EnhancedModeOptions").customizeAst(ast -> { + ast.getClassByName("EnhancedModeOptions").ifPresent(clazz -> { + // Add setEnabled method following the fluent pattern + com.github.javaparser.ast.body.MethodDeclaration setEnabledMethod + = clazz.addMethod("setEnabled", Modifier.Keyword.PUBLIC); + setEnabledMethod.addParameter("Boolean", "enabled"); + setEnabledMethod.setType("EnhancedModeOptions"); + setEnabledMethod.setBody(parseBlock("{ this.enabled = enabled; return this; }")); + setEnabledMethod.setJavadocComment( + new Javadoc(parseText( + "Set the enabled property: Enable enhanced mode for transcription. Must be set to true to use enhanced mode features.")) + .addBlockTag("param", "enabled the enabled value to set.") + .addBlockTag("return", "the EnhancedModeOptions object itself.")); + }); + }); + } + /** * Customize TranscriptionOptions to: * 1. Add AudioFileDetails field (final) diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java index b769566b8ee0..69294063fad5 100644 --- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java +++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java @@ -48,7 +48,7 @@ public final class TranscriptionAsyncClient { /** * Transcribes the provided audio stream. *

Response Body Schema

- * + * *
      * {@code
      * {
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
index 454eb09f51bf..42a6fa24db7c 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
@@ -46,7 +46,7 @@ public final class TranscriptionClient {
     /**
      * Transcribes the provided audio stream.
      * 

Response Body Schema

- * + * *
      * {@code
      * {
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java
index c093b1509cbf..7381bc25899d 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java
@@ -52,13 +52,35 @@ public BinaryData getContent() {
     }
 
     /**
-     * Get the filename property: The filename of the file.
+     * Get the filename property: The filename of the file. If not explicitly set, a filename will be auto-generated
+     * from the contentType.
      *
-     * @return the filename value.
+     * @return the filename value, or an auto-generated filename if not set.
      */
     @Generated
     public String getFilename() {
-        return this.filename;
+        if (this.filename != null && !this.filename.isEmpty()) {
+            return this.filename;
+        }
+        if ("audio/wav".equalsIgnoreCase(this.contentType)) {
+            return "audio.wav";
+        }
+        if ("audio/mpeg".equalsIgnoreCase(this.contentType) || "audio/mp3".equalsIgnoreCase(this.contentType)) {
+            return "audio.mp3";
+        }
+        if ("audio/ogg".equalsIgnoreCase(this.contentType)) {
+            return "audio.ogg";
+        }
+        if ("audio/flac".equalsIgnoreCase(this.contentType)) {
+            return "audio.flac";
+        }
+        if ("audio/webm".equalsIgnoreCase(this.contentType)) {
+            return "audio.webm";
+        }
+        if ("audio/opus".equalsIgnoreCase(this.contentType)) {
+            return "audio.opus";
+        }
+        return "audio";
     }
 
     /**
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java
index 7f0395e4bac8..fcc63f5599f6 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java
@@ -171,4 +171,16 @@ public static EnhancedModeOptions fromJson(JsonReader jsonReader) throws IOExcep
             return deserializedEnhancedModeOptions;
         });
     }
+
+    /**
+     * Set the enabled property: Enable enhanced mode for transcription. Must be set to true to use enhanced mode
+     * features.
+     *
+     * @param enabled the enabled value to set.
+     * @return the EnhancedModeOptions object itself.
+     */
+    public EnhancedModeOptions setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+        return this;
+    }
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
index 58acc9276dad..de1d37704b74 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
@@ -117,12 +117,12 @@ private static TranscriptionResult transcribeWithFullEnhancedMode(
         String filename
     ) throws Exception {
         // Create audio file details
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename(filename);
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         // Configure comprehensive LLM-enhanced mode settings
         // Always include lexical format prompt for best results
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
+            .setEnabled(true)
             .setTask("transcribe")
             .setPrompts(Arrays.asList(
                 "Output must be in lexical format."
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md
index bc94eba7737f..8cfa997a6d9b 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md
@@ -10,9 +10,9 @@ To run these samples, you need:
 2. **Azure AI Speech Service Resource**: Create one in the [Azure Portal](https://portal.azure.com)
 3. **Authentication**: Choose one of the following authentication methods:
 
-   ### Option 1: Azure AD Authentication (Recommended for Production)
-   
-   Set the endpoint and configure Azure AD credentials:
+### Option 1: Entra ID Authentication (Recommended for Production)
+
+   Set the endpoint and configure Entra ID credentials:
    
    ```bash
    set SPEECH_ENDPOINT=https://your-resource-name.cognitiveservices.azure.com/
@@ -32,7 +32,7 @@ To run these samples, you need:
        --scope /subscriptions//resourceGroups//providers/Microsoft.CognitiveServices/accounts/
    ```
    
-   **Required dependency** for Azure AD authentication:
+   **Required dependency** for Entra ID authentication:
    
    ```xml
    
@@ -64,7 +64,7 @@ To run these samples, you need:
        --scope /subscriptions//resourceGroups//providers/Microsoft.CognitiveServices/accounts/
    ```
    
-   **Required dependency** for Azure AD authentication:
+   **Required dependency** for Entra ID authentication:
    
    ```xml
    
@@ -80,10 +80,10 @@ To run these samples, you need:
 
 All samples in this directory support **both authentication methods**:
 
-- **Azure AD (TokenCredential)**: Uses `DefaultAzureCredential` from azure-identity
+- **Entra ID (TokenCredential)**: Uses `DefaultAzureCredential` from azure-identity
 - **API Key (KeyCredential)**: Uses the `SPEECH_API_KEY` environment variable
 
-The samples will automatically detect which authentication method to use based on the environment variables you've set. If `SPEECH_API_KEY` is set, it will use API Key authentication; otherwise, it will attempt Azure AD authentication.
+The samples will automatically detect which authentication method to use based on the environment variables you've set. If `SPEECH_API_KEY` is set, it will use API Key authentication; otherwise, it will attempt Entra ID authentication.
 
 ## Available Samples
 
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
index a814389f8993..b89af80041d2 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
@@ -37,8 +37,7 @@ public void readmeSamples() {
             byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
             // Create audio file details
-            AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-                .setFilename("audio.wav");
+            AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
             // Create transcription options
             TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
@@ -93,8 +92,7 @@ public void transcribeAudioSync() throws Exception {
         // BEGIN: com.azure.ai.speech.transcription.transcriptionclient.transcribe
         byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("audio.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
@@ -119,8 +117,7 @@ public void transcribeAudioAsync() throws Exception {
         // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe
         byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("audio.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
@@ -146,8 +143,7 @@ public void advancedTranscriptionOptions() throws Exception {
         // BEGIN: com.azure.ai.speech.transcription.transcriptionoptions.advanced
         byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("audio.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         // Configure advanced options
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
@@ -199,8 +195,7 @@ public void processDetailedResults() throws Exception {
             .buildClient();
 
         byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("audio.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
         // BEGIN: com.azure.ai.speech.transcription.transcriptionresult.detailed
@@ -242,11 +237,11 @@ public void enhancedModeBasic() throws Exception {
         // BEGIN: readme-sample-enhancedModeBasic
         byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("audio.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         // Enable enhanced mode for improved transcription quality with lexical format
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
+            .setEnabled(true)
             .setPrompts(java.util.Arrays.asList(
                 "Output must be in lexical format."
             ));
@@ -271,12 +266,12 @@ public void enhancedModeWithPrompts() throws Exception {
         // BEGIN: readme-sample-enhancedModeWithPrompts
         byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("audio.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         // Use prompts to guide transcription with domain-specific terminology
         // Always include lexical format prompt for best results
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
+            .setEnabled(true)
             .setPrompts(java.util.Arrays.asList(
                 "Output must be in lexical format.",
                 "Medical consultation discussing hypertension and diabetes",
@@ -304,11 +299,11 @@ public void enhancedModeWithTranslation() throws Exception {
         // BEGIN: readme-sample-enhancedModeWithTranslation
         byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("audio.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         // Configure enhanced mode to transcribe Spanish audio and translate to English
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
+            .setEnabled(true)
             .setTargetLanguage("en-US"); // Translate to English
 
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
@@ -342,37 +337,6 @@ public void transcribeWithAudioUrl() {
         // END: readme-sample-transcribeWithAudioUrl
     }
 
-    /**
-     * Sample for transcribing audio using AudioFileDetails constructor.
-     */
-    public void transcribeWithAudioFileDetails() throws Exception {
-        // BEGIN: readme-sample-transcribeWithAudioFileDetails
-        TranscriptionClient client = new TranscriptionClientBuilder()
-            .endpoint("https://.cognitiveservices.azure.com/")
-            .credential(new KeyCredential(""))
-            .buildClient();
-
-        // Read audio file
-        byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
-
-        // Create audio file details
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("audio.wav")
-            .setContentType("audio/wav");
-
-        // Create transcription options with AudioFileDetails
-        TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
-
-        // Transcribe audio
-        TranscriptionResult result = client.transcribe(options);
-
-        // Process results
-        result.getCombinedPhrases().forEach(phrase -> {
-            System.out.println(phrase.getText());
-        });
-        // END: readme-sample-transcribeWithAudioFileDetails
-    }
-
     /**
      * Sample for multi-language transcription.
      */
@@ -385,8 +349,7 @@ public void transcribeMultiLanguage() throws Exception {
         // BEGIN: com.azure.ai.speech.transcription.transcriptionoptions.multilanguage
         byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("audio.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         // Configure transcription WITHOUT specifying locales
         // This allows the service to auto-detect and transcribe multiple languages
@@ -413,10 +376,10 @@ public void transcribeEnhancedMode() throws Exception {
         // BEGIN: com.azure.ai.speech.transcription.transcriptionoptions.enhancedmode
         byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("audio.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
+            .setEnabled(true)
             .setTask("transcribe")
             .setPrompts(java.util.Arrays.asList("Output must be in lexical format."));
 
@@ -441,8 +404,7 @@ public void transcribeWithPhraseList() throws Exception {
         // BEGIN: com.azure.ai.speech.transcription.transcriptionoptions.phraselist
         byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("audio.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         PhraseListOptions phraseListOptions = new PhraseListOptions()
             .setPhrases(java.util.Arrays.asList("Azure", "Cognitive Services"))
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java
index ebd5e30aa64b..382d5c473bef 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java
@@ -39,8 +39,7 @@ public static void main(String[] args) {
             byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath));
 
             // Create audio file details
-            AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-                .setFilename(audioFilePath);
+            AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
             // Transcribe
             TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java
index 8c5066109660..fedc4499806e 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java
@@ -51,8 +51,7 @@ public static void main(String[] args) {
             // Load audio file
             String audioFilePath = "src/samples/assets/sample-audio.wav";
             byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath));
-            AudioFileDetails fileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-                .setFilename(audioFilePath);
+            AudioFileDetails fileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
             // Configure transcription WITHOUT specifying locales
             // This allows the service to auto-detect and transcribe multiple languages
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java
index bc76e6ef3885..bf57f4308f36 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java
@@ -47,8 +47,7 @@ public static void main(String[] args) {
             // Load audio file
             String audioFilePath = "src/samples/assets/sample-audio.wav";
             byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath));
-            AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-                .setFilename(audioFilePath);
+            AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
             // Configure speaker diarization
             TranscriptionDiarizationOptions diarizationOptions = new TranscriptionDiarizationOptions()
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java
index 653eab1f8a69..af07db34935e 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java
@@ -43,8 +43,7 @@ public static void main(String[] args) {
             // Load audio file
             String audioFilePath = "src/samples/assets/sample-audio.wav";
             byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath));
-            AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-                .setFilename(audioFilePath);
+            AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
             // Create phrase list with custom terms
             // Add phrases that appear in your audio for better recognition
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java
index 2d7cbbdcccc5..40a67d1b0188 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java
@@ -45,8 +45,7 @@ public static void main(String[] args) {
             // Load audio file
             String audioFilePath = "src/samples/assets/sample-profanity.wav";
             byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath));
-            AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-                .setFilename(audioFilePath);
+            AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
             // Demonstrate different profanity filter modes
             ProfanityFilterMode[] modes = {
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java
index d375c6573cda..5dc618dee834 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java
@@ -52,8 +52,7 @@ public void transcribeAsyncWithSubscribe() throws Exception {
             .buildAsyncClient();
 
         byte[] audioData = Files.readAllBytes(Paths.get("sample.wav"));
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("sample.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
         // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.subscribe
@@ -94,8 +93,7 @@ public void transcribeAsyncWithBlock() throws Exception {
             .buildAsyncClient();
 
         byte[] audioData = Files.readAllBytes(Paths.get("sample.wav"));
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("sample.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
         // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.block
@@ -120,8 +118,7 @@ public void transcribeAsyncWithOptions() throws Exception {
         // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.options
         byte[] audioData = Files.readAllBytes(Paths.get("sample.wav"));
 
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("sample.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         // Configure advanced transcription options
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
@@ -154,8 +151,7 @@ public void transcribeAsyncWithTimeoutAndErrorHandling() throws Exception {
             .buildAsyncClient();
 
         byte[] audioData = Files.readAllBytes(Paths.get("sample.wav"));
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("sample.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
 
         // BEGIN: com.azure.ai.speech.transcription.transcriptionasyncclient.transcribe.timeout
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java
index eadae5049e58..cc9ebd2c57fc 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java
@@ -41,11 +41,11 @@ public void createClientWithApiKey() {
     }
 
     /**
-     * Sample for creating a synchronous TranscriptionClient with Azure AD authentication.
+     * Sample for creating a synchronous TranscriptionClient with Entra ID authentication.
      */
     public void createClientWithTokenCredential() {
         // BEGIN: com.azure.ai.speech.transcription.transcriptionclient.instantiation.tokencredential
-        // Use DefaultAzureCredential for Azure AD authentication
+        // Use DefaultAzureCredential for Entra ID authentication
         TokenCredential credential = new DefaultAzureCredentialBuilder().build();
 
         TranscriptionClient client = new TranscriptionClientBuilder()
@@ -69,8 +69,7 @@ public void transcribeFromFile() throws Exception {
         byte[] audioData = Files.readAllBytes(Paths.get("sample.wav"));
 
         // Create audio file details
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("sample.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         // Create transcription options using the AudioFileDetails constructor
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
@@ -98,8 +97,7 @@ public void transcribeWithOptions() throws Exception {
         // BEGIN: com.azure.ai.speech.transcription.transcriptionclient.transcribe.options
         byte[] audioData = Files.readAllBytes(Paths.get("sample.wav"));
 
-        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData))
-            .setFilename("sample.wav");
+        AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         // Configure advanced transcription options
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md
index bcdab60d5319..b4c1d2ce4ae4 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md
@@ -136,7 +136,7 @@ Tests for the asynchronous `TranscriptionAsyncClient` (16 tests), mirroring the
 The tests support two authentication methods:
 
 1. **Key-based authentication** (default): Uses the API key from `SPEECH_API_KEY` environment variable
-2. **Token-based authentication**: Uses Azure Active Directory credentials via `DefaultAzureCredential`
+2. **Token-based authentication**: Uses Entra ID credentials via `DefaultAzureCredential`
 
 To test with token-based authentication, some tests use `createClient(false, true, sync)` where the first parameter is `false`.
 
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java
index 06c1c60518f9..7a8b8c1ec0f8 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java
@@ -32,7 +32,7 @@
 
 /**
  * Base class for TranscriptionClient tests. Contains helper methods and common test infrastructure.
- * Supports both API Key (KeyCredential) and Azure AD (TokenCredential) authentication.
+ * Supports both API Key (KeyCredential) and Entra ID (TokenCredential) authentication.
  */
 class TranscriptionClientTestBase extends TestProxyTestBase {
     private static final ClientLogger LOGGER = new ClientLogger(TranscriptionClientTestBase.class);
@@ -99,7 +99,7 @@ protected void createClient(Boolean useKeyAuth, Boolean useRealKey, Boolean sync
             if (useKeyAuth) {
                 transcriptionClientBuilder.credential(new KeyCredential(key));
             } else {
-                // Use Azure AD authentication (TokenCredential)
+                // Use Entra ID authentication (TokenCredential)
                 TokenCredential credential = new DefaultAzureCredentialBuilder().build();
                 transcriptionClientBuilder.credential(credential);
             }

From 3de96a97bab355977c0deea664c9cbc5d2c9cf97 Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Thu, 18 Dec 2025 15:13:56 -0800
Subject: [PATCH 38/45] modify enhanceed mode customization

---
 .../CHANGELOG.md                              |  2 +-
 .../azure-ai-speech-transcription/README.md   |  1 -
 .../SpeechTranscriptionCustomization.java     | 56 ++++++++++---------
 .../models/EnhancedModeOptions.java           |  4 +-
 .../transcription/EnhancedModeSample.java     |  1 -
 .../speech/transcription/ReadmeSamples.java   |  4 --
 6 files changed, 33 insertions(+), 35 deletions(-)

diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md b/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md
index 2064b41329db..1a91bcdaec2e 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md
@@ -1,6 +1,6 @@
 # Release History
 
-## 1.0.0-beta.1 (2025-12-12)
+## 1.0.0-beta.1 (2025-12-18)
 
 ### Features Added
 
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
index 082177b1cc68..78351eef9d92 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
@@ -204,7 +204,6 @@ byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
 EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
-    .setEnabled(true)
     .setTask("transcribe")
     .setPrompts(java.util.Arrays.asList("Output must be in lexical format."));
 
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
index c2b44471266b..456623d572f0 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
@@ -59,8 +59,8 @@ public void customize(LibraryCustomization customization, Logger logger) {
             logger.info("Customizing TranscriptionDiarizationOptions.toJson()");
             customizeDiarizationOptionsToJson(models);
 
-            // Customize EnhancedModeOptions to add setter for enabled property
-            logger.info("Customizing EnhancedModeOptions to add setEnabled() method");
+            // Customize EnhancedModeOptions constructor to auto-set enabled to true
+            logger.info("Customizing EnhancedModeOptions constructor to auto-set enabled to true");
             customizeEnhancedModeOptions(models);
 
             // Customize AudioFileDetails.getFilename() to auto-generate filename from contentType if not set
@@ -119,6 +119,34 @@ private void customizeDiarizationOptionsToJson(PackageCustomization packageCusto
         });
     }
 
+    /**
+     * Customize EnhancedModeOptions constructor to automatically set enabled property to true.
+     * This ensures enhanced mode is enabled when EnhancedModeOptions is instantiated.
+     *
+     * @param packageCustomization the package customization
+     */
+    private void customizeEnhancedModeOptions(PackageCustomization packageCustomization) {
+        packageCustomization.getClass("EnhancedModeOptions").customizeAst(ast -> {
+            ast.getClassByName("EnhancedModeOptions").ifPresent(clazz -> {
+                // Remove the @Generated no-arg constructor and replace with one that sets enabled = true
+                clazz.getConstructors()
+                    .stream()
+                    .filter(c -> c.getParameters().isEmpty())
+                    .findFirst()
+                    .ifPresent(constructor -> {
+                        // Remove @Generated annotation to prevent overwriting
+                        constructor.getAnnotationByName("Generated").ifPresent(com.github.javaparser.ast.Node::remove);
+                        // Set the constructor body to initialize enabled = true
+                        constructor.setBody(parseBlock("{ this.enabled = true; }"));
+                        // Add JavaDoc
+                        constructor.setJavadocComment(
+                            new Javadoc(parseText(
+                                "Creates an instance of EnhancedModeOptions class with enabled set to true.")));
+                    });
+            });
+        });
+    }
+
     /**
      * Customize AudioFileDetails.getFilename() to auto-generate a filename from contentType if not explicitly set.
      * This allows developers to omit setFilename() and have the SDK automatically provide a sensible default.
@@ -147,30 +175,6 @@ private void customizeAudioFileDetailsGetFilename(PackageCustomization packageCu
         });
     }
 
-    /**
-     * Customize the EnhancedModeOptions to add a setter for the enabled property.
-     * The enabled property must be explicitly set by users to enable enhanced mode features.
-     *
-     * @param packageCustomization the package customization
-     */
-    private void customizeEnhancedModeOptions(PackageCustomization packageCustomization) {
-        packageCustomization.getClass("EnhancedModeOptions").customizeAst(ast -> {
-            ast.getClassByName("EnhancedModeOptions").ifPresent(clazz -> {
-                // Add setEnabled method following the fluent pattern
-                com.github.javaparser.ast.body.MethodDeclaration setEnabledMethod
-                    = clazz.addMethod("setEnabled", Modifier.Keyword.PUBLIC);
-                setEnabledMethod.addParameter("Boolean", "enabled");
-                setEnabledMethod.setType("EnhancedModeOptions");
-                setEnabledMethod.setBody(parseBlock("{ this.enabled = enabled; return this; }"));
-                setEnabledMethod.setJavadocComment(
-                    new Javadoc(parseText(
-                        "Set the enabled property: Enable enhanced mode for transcription. Must be set to true to use enhanced mode features."))
-                            .addBlockTag("param", "enabled the enabled value to set.")
-                            .addBlockTag("return", "the EnhancedModeOptions object itself."));
-            });
-        });
-    }
-
     /**
      * Customize TranscriptionOptions to:
      * 1. Add AudioFileDetails field (final)
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java
index fcc63f5599f6..82a8a2b6bb15 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java
@@ -44,10 +44,10 @@ public final class EnhancedModeOptions implements JsonSerializable prompts;
 
     /**
-     * Creates an instance of EnhancedModeOptions class.
+     * Creates an instance of EnhancedModeOptions class with enabled set to true.
      */
-    @Generated
     public EnhancedModeOptions() {
+        this.enabled = true;
     }
 
     /**
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
index de1d37704b74..cd7fa16ae733 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
@@ -122,7 +122,6 @@ private static TranscriptionResult transcribeWithFullEnhancedMode(
         // Configure comprehensive LLM-enhanced mode settings
         // Always include lexical format prompt for best results
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
-            .setEnabled(true)
             .setTask("transcribe")
             .setPrompts(Arrays.asList(
                 "Output must be in lexical format."
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
index b89af80041d2..a0b796177396 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
@@ -241,7 +241,6 @@ public void enhancedModeBasic() throws Exception {
 
         // Enable enhanced mode for improved transcription quality with lexical format
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
-            .setEnabled(true)
             .setPrompts(java.util.Arrays.asList(
                 "Output must be in lexical format."
             ));
@@ -271,7 +270,6 @@ public void enhancedModeWithPrompts() throws Exception {
         // Use prompts to guide transcription with domain-specific terminology
         // Always include lexical format prompt for best results
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
-            .setEnabled(true)
             .setPrompts(java.util.Arrays.asList(
                 "Output must be in lexical format.",
                 "Medical consultation discussing hypertension and diabetes",
@@ -303,7 +301,6 @@ public void enhancedModeWithTranslation() throws Exception {
 
         // Configure enhanced mode to transcribe Spanish audio and translate to English
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
-            .setEnabled(true)
             .setTargetLanguage("en-US"); // Translate to English
 
         TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
@@ -379,7 +376,6 @@ public void transcribeEnhancedMode() throws Exception {
         AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
-            .setEnabled(true)
             .setTask("transcribe")
             .setPrompts(java.util.Arrays.asList("Output must be in lexical format."));
 

From 2d0393edc553290f50469092ae07ea2ca9f11809 Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Thu, 18 Dec 2025 16:31:37 -0800
Subject: [PATCH 39/45] modify enhanceed mode customization and update readme

---
 .../azure-ai-speech-transcription/README.md   |  3 ++-
 .../SpeechTranscriptionCustomization.java     | 13 ++++++++---
 .../models/EnhancedModeOptions.java           | 23 -------------------
 .../transcription/EnhancedModeSample.java     |  1 +
 .../speech/transcription/ReadmeSamples.java   |  5 +++-
 5 files changed, 17 insertions(+), 28 deletions(-)

diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
index 78351eef9d92..70f971b01357 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
@@ -196,13 +196,14 @@ result.getPhrases().forEach(phrase -> {
 
 ### Transcribe with enhanced mode
 
-Enhanced mode provides advanced features to improve transcription accuracy with custom prompts.
+Enhanced mode provides advanced features to improve transcription accuracy with custom prompts. Enhanced mode is automatically enabled when you create an `EnhancedModeOptions` instance.
 
 ```java com.azure.ai.speech.transcription.transcriptionoptions.enhancedmode
 byte[] audioData = Files.readAllBytes(Paths.get("path/to/audio.wav"));
 
 AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
+// Enhanced mode is automatically enabled
 EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
     .setTask("transcribe")
     .setPrompts(java.util.Arrays.asList("Output must be in lexical format."));
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
index 456623d572f0..d0bdf355bdb0 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
@@ -120,8 +120,9 @@ private void customizeDiarizationOptionsToJson(PackageCustomization packageCusto
     }
 
     /**
-     * Customize EnhancedModeOptions constructor to automatically set enabled property to true.
-     * This ensures enhanced mode is enabled when EnhancedModeOptions is instantiated.
+     * Customize EnhancedModeOptions to hide the enabled property from the public API.
+     * The enabled property is automatically set to true in the constructor.
+     * Both isEnabled() getter and setEnabled() setter are removed from the public API.
      *
      * @param packageCustomization the package customization
      */
@@ -141,8 +142,14 @@ private void customizeEnhancedModeOptions(PackageCustomization packageCustomizat
                         // Add JavaDoc
                         constructor.setJavadocComment(
                             new Javadoc(parseText(
-                                "Creates an instance of EnhancedModeOptions class with enabled set to true.")));
+                                "Creates an instance of EnhancedModeOptions class with enhanced mode automatically enabled.")));
                     });
+                
+                // Remove isEnabled() getter to hide enabled from public API
+                clazz.getMethodsByName("isEnabled").forEach(method -> method.remove());
+                
+                // Remove ALL setEnabled() methods to hide enabled from public API
+                clazz.getMethodsByName("setEnabled").forEach(method -> method.remove());
             });
         });
     }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java
index 82a8a2b6bb15..d013f508bb8e 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java
@@ -50,17 +50,6 @@ public EnhancedModeOptions() {
         this.enabled = true;
     }
 
-    /**
-     * Get the enabled property: Enable enhanced mode for transcription. This is automatically set to true when task,
-     * targetLanguage, or prompt are specified.
-     *
-     * @return the enabled value.
-     */
-    @Generated
-    public Boolean isEnabled() {
-        return this.enabled;
-    }
-
     /**
      * Get the task property: Task type for enhanced mode.
      *
@@ -171,16 +160,4 @@ public static EnhancedModeOptions fromJson(JsonReader jsonReader) throws IOExcep
             return deserializedEnhancedModeOptions;
         });
     }
-
-    /**
-     * Set the enabled property: Enable enhanced mode for transcription. Must be set to true to use enhanced mode
-     * features.
-     *
-     * @param enabled the enabled value to set.
-     * @return the EnhancedModeOptions object itself.
-     */
-    public EnhancedModeOptions setEnabled(Boolean enabled) {
-        this.enabled = enabled;
-        return this;
-    }
 }
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
index cd7fa16ae733..7abd8b0fc543 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
@@ -120,6 +120,7 @@ private static TranscriptionResult transcribeWithFullEnhancedMode(
         AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
         // Configure comprehensive LLM-enhanced mode settings
+        // Enhanced mode is automatically enabled when you create EnhancedModeOptions
         // Always include lexical format prompt for best results
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
             .setTask("transcribe")
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
index a0b796177396..6dfd93d716c4 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
+++ b/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
@@ -239,7 +239,7 @@ public void enhancedModeBasic() throws Exception {
 
         AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
-        // Enable enhanced mode for improved transcription quality with lexical format
+        // Enhanced mode is automatically enabled when you create EnhancedModeOptions
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
             .setPrompts(java.util.Arrays.asList(
                 "Output must be in lexical format."
@@ -267,6 +267,7 @@ public void enhancedModeWithPrompts() throws Exception {
 
         AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
+        // Enhanced mode is automatically enabled
         // Use prompts to guide transcription with domain-specific terminology
         // Always include lexical format prompt for best results
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
@@ -299,6 +300,7 @@ public void enhancedModeWithTranslation() throws Exception {
 
         AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
+        // Enhanced mode is automatically enabled
         // Configure enhanced mode to transcribe Spanish audio and translate to English
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
             .setTargetLanguage("en-US"); // Translate to English
@@ -375,6 +377,7 @@ public void transcribeEnhancedMode() throws Exception {
 
         AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
 
+        // Enhanced mode is automatically enabled
         EnhancedModeOptions enhancedMode = new EnhancedModeOptions()
             .setTask("transcribe")
             .setPrompts(java.util.Arrays.asList("Output must be in lexical format."));

From cc7ef97f8d56c4ee2c76d772b0f8acde7f790790 Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Thu, 18 Dec 2025 17:03:17 -0800
Subject: [PATCH 40/45] created a new service directory to put all the
 transcription SDK's under

---
 .github/CODEOWNERS                            |   2 +-
 pom.xml                                       |   1 +
 .../azure-ai-speech-transcription/assets.json |   1 -
 sdk/cognitiveservices/ci.yml                  |   7 ---
 sdk/cognitiveservices/pom.xml                 |   3 +-
 .../CHANGELOG.md                              |   0
 .../azure-ai-speech-transcription/README.md   |   2 +-
 .../azure-ai-speech-transcription/assets.json |   1 +
 .../azure-ai-speech-transcription/cspell.json |   0
 .../customization/pom.xml                     |   0
 .../SpeechTranscriptionCustomization.java     |   0
 .../azure-ai-speech-transcription/pom.xml     |   0
 .../TranscriptionAsyncClient.java             |   0
 .../transcription/TranscriptionClient.java    |   0
 .../TranscriptionClientBuilder.java           |   0
 .../TranscriptionServiceVersion.java          |   0
 .../MultipartFormDataHelper.java              |   0
 .../TranscriptionClientImpl.java              |   0
 .../implementation/package-info.java          |   0
 .../models/AudioFileDetails.java              |   0
 .../models/ChannelCombinedPhrases.java        |   0
 .../models/EnhancedModeOptions.java           |   0
 .../models/PhraseListOptions.java             |   0
 .../models/ProfanityFilterMode.java           |   0
 .../models/TranscribedPhrase.java             |   0
 .../transcription/models/TranscribedWord.java |   0
 .../models/TranscriptionContent.java          |   0
 .../TranscriptionDiarizationOptions.java      |   0
 .../models/TranscriptionOptions.java          |   0
 .../models/TranscriptionResult.java           |   0
 .../transcription/models/package-info.java    |   0
 .../ai/speech/transcription/package-info.java |   0
 .../src/main/java/module-info.java            |   0
 ...eech-transcription_apiview_properties.json |   0
 ...zure-ai-speech-transcription_metadata.json |   0
 .../azure-ai-speech-transcription.properties  |   0
 .../src/samples/assets/sample-audio.wav       | Bin
 .../src/samples/assets/sample-profanity.wav   | Bin
 .../transcription/EnhancedModeSample.java     |   0
 .../azure/ai/speech/transcription/README.md   |   4 +-
 .../speech/transcription/ReadmeSamples.java   |   0
 .../TranscribeAudioFileSample.java            |   0
 .../TranscribeFromUrlSample.java              |   0
 .../TranscribeMultiLanguageSample.java        |   0
 .../TranscribeWithDiarizationSample.java      |   0
 .../TranscribeWithPhraseListSample.java       |   0
 .../TranscribeWithProfanityFilterSample.java  |   0
 ...riptionAsyncClientJavaDocCodeSnippets.java |   0
 ...ranscriptionClientJavaDocCodeSnippets.java |   0
 .../azure/ai/speech/transcription/README.md   |   2 +-
 .../TranscriptionAsyncClientTest.java         |   0
 .../TranscriptionClientTest.java              |   0
 .../TranscriptionClientTestBase.java          |   0
 .../TranscriptionClientTestBase.java          |   0
 .../azure/ai/speech/transcription/sample.wav  | Bin
 .../org.mockito.plugins.MockMaker             |   0
 .../tsp-location.yaml                         |   0
 sdk/transcription/ci.yml                      |  46 ++++++++++++++++++
 sdk/transcription/pom.xml                     |  14 ++++++
 59 files changed, 68 insertions(+), 15 deletions(-)
 delete mode 100644 sdk/cognitiveservices/azure-ai-speech-transcription/assets.json
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/CHANGELOG.md (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/README.md (99%)
 create mode 100644 sdk/transcription/azure-ai-speech-transcription/assets.json
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/cspell.json (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/customization/pom.xml (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/pom.xml (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClientBuilder.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionServiceVersion.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/MultipartFormDataHelper.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/TranscriptionClientImpl.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/package-info.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ChannelCombinedPhrases.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ProfanityFilterMode.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/package-info.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/package-info.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/java/module-info.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/main/resources/azure-ai-speech-transcription.properties (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/assets/sample-audio.wav (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/assets/sample-profanity.wav (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md (98%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeFromUrlSample.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md (99%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/generated/TranscriptionClientTestBase.java (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/sample.wav (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker (100%)
 rename sdk/{cognitiveservices => transcription}/azure-ai-speech-transcription/tsp-location.yaml (100%)
 create mode 100644 sdk/transcription/ci.yml
 create mode 100644 sdk/transcription/pom.xml

diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 7db045636ca9..6bb9cdd4ab4f 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -263,7 +263,7 @@
 # ServiceOwners:                                                   @rhurey
 
 # PRLabel: %Speech Transcription
-/sdk/cognitiveservices/azure-ai-speech-transcription/              @amber-yujueWang @rhurey @xitzhang @Azure/azure-java-sdk
+/sdk/transcription/azure-ai-speech-transcription/              @amber-yujueWang @rhurey @xitzhang @Azure/azure-java-sdk
 
 # ServiceLabel: %Speech Transcription
 # AzureSdkOwners:                                                  @amber-yujueWang @rhurey @xitzhang
diff --git a/pom.xml b/pom.xml
index 8c702d55c621..020e7eae65cd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -265,6 +265,7 @@
     sdk/timeseriesinsights
     sdk/tools
     sdk/trafficmanager
+    sdk/transcription
     sdk/translation
     sdk/trustedsigning
     sdk/vision
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/assets.json b/sdk/cognitiveservices/azure-ai-speech-transcription/assets.json
deleted file mode 100644
index b17c2a5d9d23..000000000000
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/assets.json
+++ /dev/null
@@ -1 +0,0 @@
-{"AssetsRepo":"Azure/azure-sdk-assets","AssetsRepoPrefixPath":"java","TagPrefix":"java/cognitiveservices/azure-ai-speech-transcription","Tag": "java/cognitiveservices/azure-ai-speech-transcription_3b50d0dce8"}
\ No newline at end of file
diff --git a/sdk/cognitiveservices/ci.yml b/sdk/cognitiveservices/ci.yml
index c03a43a3881f..d940170ac575 100644
--- a/sdk/cognitiveservices/ci.yml
+++ b/sdk/cognitiveservices/ci.yml
@@ -9,11 +9,9 @@ trigger:
   paths:
     include:
       - sdk/cognitiveservices/ci.yml
-      - sdk/cognitiveservices/azure-ai-speech-transcription/
       - sdk/cognitiveservices/azure-resourcemanager-cognitiveservices/
     exclude:
       - sdk/cognitiveservices/pom.xml
-      - sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml
       - sdk/cognitiveservices/azure-resourcemanager-cognitiveservices/pom.xml
 pr:
   branches:
@@ -25,11 +23,9 @@ pr:
   paths:
     include:
       - sdk/cognitiveservices/ci.yml
-      - sdk/cognitiveservices/azure-ai-speech-transcription/
       - sdk/cognitiveservices/azure-resourcemanager-cognitiveservices/
     exclude:
       - sdk/cognitiveservices/pom.xml
-      - sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml
       - sdk/cognitiveservices/azure-resourcemanager-cognitiveservices/pom.xml
 
 extends:
@@ -37,9 +33,6 @@ extends:
   parameters:
     ServiceDirectory: cognitiveservices
     Artifacts:
-      - name: azure-ai-speech-transcription
-        groupId: com.azure
-        safeName: azureaispeechtranscription
       - name: azure-resourcemanager-cognitiveservices
         groupId: com.azure.resourcemanager
         safeName: azureresourcemanagercognitiveservices
diff --git a/sdk/cognitiveservices/pom.xml b/sdk/cognitiveservices/pom.xml
index f97294ff6d90..ce7ab0ae0869 100644
--- a/sdk/cognitiveservices/pom.xml
+++ b/sdk/cognitiveservices/pom.xml
@@ -10,7 +10,6 @@
   1.0.0
 
   
-      azure-ai-speech-transcription
       azure-resourcemanager-cognitiveservices
-      
+  
 
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md b/sdk/transcription/azure-ai-speech-transcription/CHANGELOG.md
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/CHANGELOG.md
rename to sdk/transcription/azure-ai-speech-transcription/CHANGELOG.md
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md b/sdk/transcription/azure-ai-speech-transcription/README.md
similarity index 99%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/README.md
rename to sdk/transcription/azure-ai-speech-transcription/README.md
index 70f971b01357..7180668de8d3 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/README.md
+++ b/sdk/transcription/azure-ai-speech-transcription/README.md
@@ -282,7 +282,7 @@ If you encounter issues:
 
 ## Next steps
 
-- Explore the [samples](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples) for more examples
+- Explore the [samples](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/transcription/azure-ai-speech-transcription/src/samples) for more examples
 - Learn more about [Azure Speech Service](https://learn.microsoft.com/azure/ai-services/speech-service/)
 - Review the [API reference documentation][docs] for detailed information about classes and methods
 
diff --git a/sdk/transcription/azure-ai-speech-transcription/assets.json b/sdk/transcription/azure-ai-speech-transcription/assets.json
new file mode 100644
index 000000000000..e5d0a3439cf4
--- /dev/null
+++ b/sdk/transcription/azure-ai-speech-transcription/assets.json
@@ -0,0 +1 @@
+{"AssetsRepo":"Azure/azure-sdk-assets","AssetsRepoPrefixPath":"java","TagPrefix":"java/transcription/azure-ai-speech-transcription","Tag": "java/transcription/azure-ai-speech-transcription_3b50d0dce8"}
\ No newline at end of file
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/cspell.json b/sdk/transcription/azure-ai-speech-transcription/cspell.json
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/cspell.json
rename to sdk/transcription/azure-ai-speech-transcription/cspell.json
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/pom.xml b/sdk/transcription/azure-ai-speech-transcription/customization/pom.xml
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/customization/pom.xml
rename to sdk/transcription/azure-ai-speech-transcription/customization/pom.xml
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java b/sdk/transcription/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
rename to sdk/transcription/azure-ai-speech-transcription/customization/src/main/java/SpeechTranscriptionCustomization.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml b/sdk/transcription/azure-ai-speech-transcription/pom.xml
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/pom.xml
rename to sdk/transcription/azure-ai-speech-transcription/pom.xml
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionAsyncClient.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClient.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClientBuilder.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClientBuilder.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClientBuilder.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionClientBuilder.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionServiceVersion.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionServiceVersion.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionServiceVersion.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/TranscriptionServiceVersion.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/MultipartFormDataHelper.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/MultipartFormDataHelper.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/MultipartFormDataHelper.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/MultipartFormDataHelper.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/TranscriptionClientImpl.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/TranscriptionClientImpl.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/TranscriptionClientImpl.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/TranscriptionClientImpl.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/package-info.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/package-info.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/package-info.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/implementation/package-info.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/AudioFileDetails.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ChannelCombinedPhrases.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ChannelCombinedPhrases.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ChannelCombinedPhrases.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ChannelCombinedPhrases.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/EnhancedModeOptions.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/PhraseListOptions.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ProfanityFilterMode.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ProfanityFilterMode.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ProfanityFilterMode.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/ProfanityFilterMode.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedPhrase.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscribedWord.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionContent.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionDiarizationOptions.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionOptions.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/TranscriptionResult.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/package-info.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/package-info.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/package-info.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/models/package-info.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/package-info.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/package-info.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/package-info.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/com/azure/ai/speech/transcription/package-info.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java b/sdk/transcription/azure-ai-speech-transcription/src/main/java/module-info.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/java/module-info.java
rename to sdk/transcription/azure-ai-speech-transcription/src/main/java/module-info.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json b/sdk/transcription/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json
rename to sdk/transcription/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_apiview_properties.json
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json b/sdk/transcription/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json
rename to sdk/transcription/azure-ai-speech-transcription/src/main/resources/META-INF/azure-ai-speech-transcription_metadata.json
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/azure-ai-speech-transcription.properties b/sdk/transcription/azure-ai-speech-transcription/src/main/resources/azure-ai-speech-transcription.properties
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/main/resources/azure-ai-speech-transcription.properties
rename to sdk/transcription/azure-ai-speech-transcription/src/main/resources/azure-ai-speech-transcription.properties
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/assets/sample-audio.wav b/sdk/transcription/azure-ai-speech-transcription/src/samples/assets/sample-audio.wav
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/assets/sample-audio.wav
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/assets/sample-audio.wav
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/assets/sample-profanity.wav b/sdk/transcription/azure-ai-speech-transcription/src/samples/assets/sample-profanity.wav
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/assets/sample-profanity.wav
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/assets/sample-profanity.wav
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java b/sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/EnhancedModeSample.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md b/sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md
similarity index 98%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md
index 8cfa997a6d9b..65eb1d9979d5 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md
+++ b/sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/README.md
@@ -103,7 +103,7 @@ Demonstrates the most common use case - transcribing a single audio file with mi
 **Run**:
 
 ```bash
-cd sdk/cognitiveservices/azure-ai-speech-transcription
+cd sdk/transcription/azure-ai-speech-transcription
 mvn exec:java -Dexec.mainClass="com.azure.ai.speech.transcription.TranscribeAudioFileSample"
 ```
 
@@ -250,7 +250,7 @@ The service supports various audio formats:
 ## Getting Help
 
 - [Azure AI Speech Documentation](https://learn.microsoft.com/azure/ai-services/speech-service/)
-- [SDK README](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/cognitiveservices/azure-ai-speech-transcription)
+- [SDK README](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/transcription/azure-ai-speech-transcription)
 - [GitHub Issues](https://github.com/Azure/azure-sdk-for-java/issues)
 
 ## Additional Resources
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java b/sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/ReadmeSamples.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java b/sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeAudioFileSample.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeFromUrlSample.java b/sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeFromUrlSample.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeFromUrlSample.java
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeFromUrlSample.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java b/sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeMultiLanguageSample.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java b/sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithDiarizationSample.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java b/sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithPhraseListSample.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java b/sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/TranscribeWithProfanityFilterSample.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java b/sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionAsyncClientJavaDocCodeSnippets.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java b/sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java
rename to sdk/transcription/azure-ai-speech-transcription/src/samples/java/com/azure/ai/speech/transcription/javadoccodesnippets/TranscriptionClientJavaDocCodeSnippets.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md b/sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md
similarity index 99%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md
rename to sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md
index b4c1d2ce4ae4..353f2605ba20 100644
--- a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md
+++ b/sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/README.md
@@ -83,7 +83,7 @@ This mode uses previously recorded HTTP interactions instead of making real call
 
 ### Run All Tests
 
-From the `sdk/cognitiveservices/azure-ai-speech-transcription` directory:
+From the `sdk/transcription/azure-ai-speech-transcription` directory:
 
 ```bash
 mvn clean test
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java b/sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java
rename to sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionAsyncClientTest.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java b/sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java
rename to sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTest.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java b/sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java
rename to sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/TranscriptionClientTestBase.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/generated/TranscriptionClientTestBase.java b/sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/generated/TranscriptionClientTestBase.java
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/generated/TranscriptionClientTestBase.java
rename to sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/generated/TranscriptionClientTestBase.java
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/sample.wav b/sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/sample.wav
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/sample.wav
rename to sdk/transcription/azure-ai-speech-transcription/src/test/java/com/azure/ai/speech/transcription/sample.wav
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/sdk/transcription/azure-ai-speech-transcription/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
rename to sdk/transcription/azure-ai-speech-transcription/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
diff --git a/sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml b/sdk/transcription/azure-ai-speech-transcription/tsp-location.yaml
similarity index 100%
rename from sdk/cognitiveservices/azure-ai-speech-transcription/tsp-location.yaml
rename to sdk/transcription/azure-ai-speech-transcription/tsp-location.yaml
diff --git a/sdk/transcription/ci.yml b/sdk/transcription/ci.yml
new file mode 100644
index 000000000000..bbf4e187a7f2
--- /dev/null
+++ b/sdk/transcription/ci.yml
@@ -0,0 +1,46 @@
+# NOTE: Please refer to https://aka.ms/azsdk/engsys/ci-yaml before editing this file.
+
+trigger:
+  branches:
+    include:
+      - main
+      - hotfix/*
+      - release/*
+  paths:
+    include:
+      - sdk/transcription/ci.yml
+      - sdk/transcription/azure-ai-speech-transcription/
+    exclude:
+      - sdk/transcription/pom.xml
+      - sdk/transcription/azure-ai-speech-transcription/pom.xml
+
+pr:
+  branches:
+    include:
+      - main
+      - feature/*
+      - hotfix/*
+      - release/*
+  paths:
+    include:
+      - sdk/transcription/ci.yml
+      - sdk/transcription/azure-ai-speech-transcription/
+    exclude:
+      - sdk/transcription/pom.xml
+      - sdk/transcription/azure-ai-speech-transcription/pom.xml
+
+parameters:
+  - name: release_azureaispeechtranscription
+    displayName: "azure-ai-speech-transcription"
+    type: boolean
+    default: true
+
+extends:
+  template: ../../eng/pipelines/templates/stages/archetype-sdk-client.yml
+  parameters:
+    ServiceDirectory: transcription
+    Artifacts:
+      - name: azure-ai-speech-transcription
+        groupId: com.azure
+        safeName: azureaispeechtranscription
+        releaseInBatch: ${{ parameters.release_azureaispeechtranscription }}
diff --git a/sdk/transcription/pom.xml b/sdk/transcription/pom.xml
new file mode 100644
index 000000000000..5736ddc377da
--- /dev/null
+++ b/sdk/transcription/pom.xml
@@ -0,0 +1,14 @@
+
+
+  4.0.0
+  com.azure
+  azure-transcription-service
+  pom
+  1.0.0
+  
+    azure-ai-speech-transcription
+  
+

From 4d1115433fcea499767a7fb4a508f3a43d3d2a6a Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Thu, 18 Dec 2025 17:27:30 -0800
Subject: [PATCH 41/45] update tsp commit

---
 .../azure-ai-speech-transcription/tsp-location.yaml             | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sdk/transcription/azure-ai-speech-transcription/tsp-location.yaml b/sdk/transcription/azure-ai-speech-transcription/tsp-location.yaml
index cce3600b1168..ed7b497e5fa9 100644
--- a/sdk/transcription/azure-ai-speech-transcription/tsp-location.yaml
+++ b/sdk/transcription/azure-ai-speech-transcription/tsp-location.yaml
@@ -1,4 +1,4 @@
 directory: specification/cognitiveservices/Speech.Transcription
-commit: 26fba62b6c829cc443e57d205420461e6f41660c
+commit: 67019b34b001ae6b8429ee983b9697465d721d0b
 repo: Azure/azure-rest-api-specs
 additionalDirectories:

From 3e9b8e7ea92779de2789d900eb3efba42b2370ed Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Thu, 18 Dec 2025 18:23:03 -0800
Subject: [PATCH 42/45] fetch previous recording

---
 sdk/transcription/azure-ai-speech-transcription/assets.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sdk/transcription/azure-ai-speech-transcription/assets.json b/sdk/transcription/azure-ai-speech-transcription/assets.json
index e5d0a3439cf4..86485fb0f31c 100644
--- a/sdk/transcription/azure-ai-speech-transcription/assets.json
+++ b/sdk/transcription/azure-ai-speech-transcription/assets.json
@@ -1 +1 @@
-{"AssetsRepo":"Azure/azure-sdk-assets","AssetsRepoPrefixPath":"java","TagPrefix":"java/transcription/azure-ai-speech-transcription","Tag": "java/transcription/azure-ai-speech-transcription_3b50d0dce8"}
\ No newline at end of file
+{"AssetsRepo":"Azure/azure-sdk-assets","AssetsRepoPrefixPath":"java","TagPrefix":"java/cognitiveservices/azure-ai-speech-transcription","Tag":"java/cognitiveservices/azure-ai-speech-transcription_5be01e978d"}
\ No newline at end of file

From d760a51b3f0cfa59bd111dd0e8935ff135ad39c7 Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Fri, 19 Dec 2025 11:05:17 -0800
Subject: [PATCH 43/45] redo recording test

---
 sdk/transcription/azure-ai-speech-transcription/assets.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sdk/transcription/azure-ai-speech-transcription/assets.json b/sdk/transcription/azure-ai-speech-transcription/assets.json
index 86485fb0f31c..5c6f05bf06f2 100644
--- a/sdk/transcription/azure-ai-speech-transcription/assets.json
+++ b/sdk/transcription/azure-ai-speech-transcription/assets.json
@@ -1 +1 @@
-{"AssetsRepo":"Azure/azure-sdk-assets","AssetsRepoPrefixPath":"java","TagPrefix":"java/cognitiveservices/azure-ai-speech-transcription","Tag":"java/cognitiveservices/azure-ai-speech-transcription_5be01e978d"}
\ No newline at end of file
+{"AssetsRepo":"Azure/azure-sdk-assets","AssetsRepoPrefixPath":"java","TagPrefix":"java/transcription/azure-ai-speech-transcription","Tag": "java/transcription/azure-ai-speech-transcription_c82ca4aec0"}

From ef2c1cfa925ebc0e8c987ba8df7b10fd6a3f3203 Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Fri, 19 Dec 2025 11:32:31 -0800
Subject: [PATCH 44/45] undo changes to pom.xml in previous package service

---
 sdk/cognitiveservices/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sdk/cognitiveservices/pom.xml b/sdk/cognitiveservices/pom.xml
index ce7ab0ae0869..1b7f5b7fe73e 100644
--- a/sdk/cognitiveservices/pom.xml
+++ b/sdk/cognitiveservices/pom.xml
@@ -11,5 +11,5 @@
 
   
       azure-resourcemanager-cognitiveservices
-  
+      
 

From 181096e4cb676c97f0c433e99a0faad34b7ce9a8 Mon Sep 17 00:00:00 2001
From: wangamber 
Date: Fri, 19 Dec 2025 11:49:37 -0800
Subject: [PATCH 45/45] update changelog

---
 sdk/transcription/azure-ai-speech-transcription/CHANGELOG.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sdk/transcription/azure-ai-speech-transcription/CHANGELOG.md b/sdk/transcription/azure-ai-speech-transcription/CHANGELOG.md
index 1a91bcdaec2e..e62d01580eee 100644
--- a/sdk/transcription/azure-ai-speech-transcription/CHANGELOG.md
+++ b/sdk/transcription/azure-ai-speech-transcription/CHANGELOG.md
@@ -1,6 +1,6 @@
 # Release History
 
-## 1.0.0-beta.1 (2025-12-18)
+## 1.0.0-beta.1 (2025-12-19)
 
 ### Features Added