diff --git a/ElevenLabs-DotNet-Tests/TestFixture_04_TextToSpeechEndpoint.cs b/ElevenLabs-DotNet-Tests/TestFixture_04_TextToSpeechEndpoint.cs index 545f487..8624b6a 100644 --- a/ElevenLabs-DotNet-Tests/TestFixture_04_TextToSpeechEndpoint.cs +++ b/ElevenLabs-DotNet-Tests/TestFixture_04_TextToSpeechEndpoint.cs @@ -43,5 +43,25 @@ public async Task Test_02_StreamTextToSpeech() Assert.NotNull(voiceClip); Console.WriteLine(voiceClip.Id); } + + [Test] + public async Task Test_TurboV2_5_LanguageEnforced_TextToSpeech() + { + Assert.NotNull(ElevenLabsClient.TextToSpeechEndpoint); + var voice = Voices.Voice.Adam; + Assert.NotNull(voice); + var defaultVoiceSettings = await ElevenLabsClient.VoicesEndpoint.GetDefaultVoiceSettingsAsync(); + var voiceClip = await ElevenLabsClient.TextToSpeechEndpoint.TextToSpeechAsync( + "Příliš žluťoučký kůň úpěl ďábelské ódy", + voice, + defaultVoiceSettings, + Models.Model.TurboV2_5, + OutputFormat.MP3_44100_192, + null, + "cs"); + + Assert.NotNull(voiceClip); + Console.WriteLine(voiceClip.Id); + } } } \ No newline at end of file diff --git a/ElevenLabs-DotNet/TextToSpeech/TextToSpeechEndpoint.cs b/ElevenLabs-DotNet/TextToSpeech/TextToSpeechEndpoint.cs index bfe7098..b2f8287 100644 --- a/ElevenLabs-DotNet/TextToSpeech/TextToSpeechEndpoint.cs +++ b/ElevenLabs-DotNet/TextToSpeech/TextToSpeechEndpoint.cs @@ -43,6 +43,10 @@ public TextToSpeechEndpoint(ElevenLabsClient client) : base(client) { } /// /// Optional, to use. Defaults to . /// + /// + /// Optional, Language code (ISO 639-1) used to enforce a language for the model. Currently only supports language enforcement. + /// For other models, an error will be returned if language code is provided. + /// /// /// Output format of the generated audio.
/// Defaults to @@ -64,10 +68,10 @@ public TextToSpeechEndpoint(ElevenLabsClient client) : base(client) { } /// /// Optional, . /// . - public async Task TextToSpeechAsync(string text, Voice voice, VoiceSettings voiceSettings = null, Model model = null, OutputFormat outputFormat = OutputFormat.MP3_44100_128, int? optimizeStreamingLatency = null, Func partialClipCallback = null, CancellationToken cancellationToken = default) + public async Task TextToSpeechAsync(string text, Voice voice, VoiceSettings voiceSettings = null, Model model = null, OutputFormat outputFormat = OutputFormat.MP3_44100_128, int? optimizeStreamingLatency = null, string languageCode = null, Func partialClipCallback = null, CancellationToken cancellationToken = default) { var defaultVoiceSettings = voiceSettings ?? voice.Settings ?? await client.VoicesEndpoint.GetDefaultVoiceSettingsAsync(cancellationToken); - return await TextToSpeechAsync(new TextToSpeechRequest(voice, text, Encoding.UTF8, defaultVoiceSettings, outputFormat, optimizeStreamingLatency, model), partialClipCallback, cancellationToken).ConfigureAwait(false); + return await TextToSpeechAsync(new TextToSpeechRequest(voice, text, Encoding.UTF8, defaultVoiceSettings, outputFormat, optimizeStreamingLatency, model, languageCode), partialClipCallback, cancellationToken).ConfigureAwait(false); } /// diff --git a/ElevenLabs-DotNet/TextToSpeech/TextToSpeechRequest.cs b/ElevenLabs-DotNet/TextToSpeech/TextToSpeechRequest.cs index 1ca2a29..ca3014e 100644 --- a/ElevenLabs-DotNet/TextToSpeech/TextToSpeechRequest.cs +++ b/ElevenLabs-DotNet/TextToSpeech/TextToSpeechRequest.cs @@ -31,6 +31,10 @@ public TextToSpeechRequest(string text, Model model, VoiceSettings voiceSettings /// /// Optional, to use. Defaults to . /// + /// + /// Optional, Language code (ISO 639-1) used to enforce a language for the model. Currently only supports language enforcement. + /// For other models, an error will be returned if language code is provided. + /// /// /// Output format of the generated audio.
/// Defaults to @@ -57,6 +61,7 @@ public TextToSpeechRequest( OutputFormat outputFormat = OutputFormat.MP3_44100_128, int? optimizeStreamingLatency = null, Model model = null, + string languageCode = null, string previousText = null) { if (string.IsNullOrWhiteSpace(text)) @@ -80,6 +85,11 @@ public TextToSpeechRequest( text = Encoding.UTF8.GetString(encoding.GetBytes(text)); } + if (!string.IsNullOrEmpty(languageCode) && model != Models.Model.TurboV2_5) + { + throw new ArgumentException($"Currently only Turbo v2.5 model supports language enforcement.", nameof(languageCode)); + } + Text = text; Model = model ?? Models.Model.MultiLingualV2; Voice = voice; @@ -87,6 +97,7 @@ public TextToSpeechRequest( PreviousText = previousText; OutputFormat = outputFormat; OptimizeStreamingLatency = optimizeStreamingLatency; + LanguageCode = languageCode; } [JsonPropertyName("text")] @@ -95,6 +106,9 @@ public TextToSpeechRequest( [JsonPropertyName("model_id")] public string Model { get; } + [JsonPropertyName("language_code")] + public string LanguageCode { get; } + [JsonIgnore] public Voice Voice { get; }