diff --git a/src/Custom/Audio/AudioClient.cs b/src/Custom/Audio/AudioClient.cs index 90ab2f4c3..e145075bb 100644 --- a/src/Custom/Audio/AudioClient.cs +++ b/src/Custom/Audio/AudioClient.cs @@ -229,6 +229,8 @@ public virtual AsyncCollectionResult Transcri Argument.AssertNotNull(audio, nameof(audio)); Argument.AssertNotNullOrEmpty(audioFilename, nameof(audioFilename)); + EnsureModelSupportsStreaming(); + MultiPartFormDataBinaryContent content = CreatePerCallTranscriptionOptions(options, stream: true) .ToMultipartContent(audio, audioFilename); @@ -245,6 +247,8 @@ public virtual AsyncCollectionResult Transcri { Argument.AssertNotNullOrEmpty(audioFilePath, nameof(audioFilePath)); + EnsureModelSupportsStreaming(); + FileStream inputStream = File.OpenRead(audioFilePath); MultiPartFormDataBinaryContent content @@ -266,6 +270,8 @@ public virtual CollectionResult TranscribeAud Argument.AssertNotNull(audio, nameof(audio)); Argument.AssertNotNullOrEmpty(audioFilename, nameof(audioFilename)); + EnsureModelSupportsStreaming(); + MultiPartFormDataBinaryContent content = CreatePerCallTranscriptionOptions(options, stream: true) .ToMultipartContent(audio, audioFilename); @@ -282,6 +288,8 @@ public virtual CollectionResult TranscribeAud { Argument.AssertNotNullOrEmpty(audioFilePath, nameof(audioFilePath)); + EnsureModelSupportsStreaming(); + FileStream inputStream = File.OpenRead(audioFilePath); MultiPartFormDataBinaryContent content @@ -296,6 +304,20 @@ MultiPartFormDataBinaryContent content return result; } + private void EnsureModelSupportsStreaming() + { + if (string.Equals(_model, "whisper-1", StringComparison.OrdinalIgnoreCase)) + { + string isEnabled = Environment.GetEnvironmentVariable("OPENAI_ENABLE_WHISPER_1_STREAMING"); + if (!string.Equals(isEnabled, "true", StringComparison.OrdinalIgnoreCase)) + { + throw new NotSupportedException( + "The selected model 'whisper-1' does not support streaming transcription. " + + "Please use a compatible model or set the environment variable 'OPENAI_ENABLE_WHISPER_1_STREAMING=true' to bypass this check."); + } + } + } + #endregion #region TranslateAudio diff --git a/tests/Audio/TranscriptionTests.cs b/tests/Audio/TranscriptionTests.cs index 3132654e3..65f8b0988 100644 --- a/tests/Audio/TranscriptionTests.cs +++ b/tests/Audio/TranscriptionTests.cs @@ -322,4 +322,30 @@ public async Task StreamingTranscriptionWorks(AudioSourceKind audioSourceKind) inputStream?.Dispose(); } + + [Test] + [TestCase(AudioSourceKind.UsingStream)] + [TestCase(AudioSourceKind.UsingFilePath)] + public void StreamingTranscriptionThrowsForWhisperModel(AudioSourceKind audioSourceKind) + { + AudioClient client = GetTestClient(TestScenario.Audio_Whisper); + string filename = "audio_hello_world.mp3"; + string path = Path.Combine("Assets", filename); + + if (audioSourceKind == AudioSourceKind.UsingStream) + { + using FileStream inputStream = File.OpenRead(path); + Assert.Throws(() => + { + _ = client.TranscribeAudioStreamingAsync(inputStream, filename); + }); + } + else if (audioSourceKind == AudioSourceKind.UsingFilePath) + { + Assert.Throws(() => + { + _ = client.TranscribeAudioStreamingAsync(path); + }); + } + } }