Metinden konuşma sentezi

GitHub'da Başvuru belgeleri | Paketi (NuGet) | Ek Örnekler

Bu nasıl yapılır kılavuzunda, metinden konuşmaya sentez yapmaya yönelik yaygın tasarım desenlerini öğreneceksiniz.

Aşağıdaki alanlar hakkında daha fazla bilgi için bkz. Metin okuma nedir?

  • Yanıtları bellek içi akışlar olarak alma.
  • Çıkış örnek hızını ve bit hızını özelleştirme.
  • Konuşma Sentezi İşaretlemeyi Dili (SSML) kullanarak sentez istekleri gönderme.
  • Sinir seslerini kullanma.
  • Olaylara abone olma ve sonuçlar üzerinde işlem yapmak.

Sentez dilini ve sesini seçin

Konuşma tanıma hizmetindeki metin okuma özelliği 400'den fazla sesi ve 140'tan fazla dili ve çeşidi destekler. Listenin tamamını alabilir veya Ses Galerisi'nde deneyebilirsiniz.

Giriş metninizle eşleşecek dili veya sesini SpeechConfig belirtin ve belirtilen sesi kullanın. Aşağıdaki kod parçacığı bu tekniğin nasıl çalıştığını gösterir:

static async Task SynthesizeAudioAsync()
{
    var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    // Set either the `SpeechSynthesisVoiceName` or `SpeechSynthesisLanguage`.
    speechConfig.SpeechSynthesisLanguage = "en-US"; 
    speechConfig.SpeechSynthesisVoiceName = "en-US-AvaMultilingualNeural";
}

Tüm sinir sesleri çok dillidir ve kendi dillerinde ve İngilizcede akıcıdır. Örneğin, İngilizce giriş metni "Konuşmayı denemek için sabırsızlanıyorum" ise ve öğesini seçerseniz es-ES-ElviraNeural, metin İspanyolca vurgulu İngilizce olarak konuşulur.

Ses, giriş metninin dilini konuşmazsa Konuşma hizmeti sentezlenmiş ses oluşturmaz. Desteklenen sinir seslerinin tam listesi için bkz . Konuşma hizmeti için dil ve ses desteği.

Not

Varsayılan ses, Ses Listesi API'sinden yerel ayar başına döndürülen ilk sestir.

Konuşan ses, öncelik sırasına göre aşağıdaki gibi belirlenir:

  • veya SpeechSynthesisLanguageseçeneğini ayarlamazsanızSpeechSynthesisVoiceName, için en-US varsayılan ses konuşarak ifade eder.
  • Yalnızca ayarını yaparsanız SpeechSynthesisLanguage, belirtilen yerel ayar için varsayılan ses konuşu.
  • Hem hem de SpeechSynthesisVoiceNameSpeechSynthesisLanguage ayarlandıysa, SpeechSynthesisLanguage ayar yoksayılır. Konuşmaları kullanarak SpeechSynthesisVoiceName belirttiğiniz ses.
  • Ses öğesi Konuşma Sentezi Biçimlendirme Dili (SSML) kullanılarak ayarlanırsa ve SpeechSynthesisVoiceNameSpeechSynthesisLanguage ayarları yoksayılır.

Konuşmayı dosyaya sentezle

SpeechSynthesizer nesnesi oluşturun. Aşağıdaki kod parçacıklarında gösterilen bu nesne, metinden konuşma dönüştürmelerine ve çıkışları konuşmacılara, dosyalara veya diğer çıkış akışlarına çalıştırır. SpeechSynthesizer parametre olarak kabul eder:

  1. işlevini kullanarak FromWavFileOutput() çıktıyı otomatik olarak bir .wav dosyasına yazmak için bir AudioConfigörnek oluşturun. Bir using deyimiyle örneği oluşturma.

    static async Task SynthesizeAudioAsync()
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
        using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
    }
    

    Bu bağlamdaki bir using deyim yönetilmeyen kaynakları otomatik olarak atar ve nesnenin elden çıkarıldıktan sonra kapsamın dışına çıkmasına neden olur.

  2. Başka using bir deyimle örnek SpeechSynthesizer örneği oluşturun. Nesnenizi speechConfig ve audioConfig nesnesini parametre olarak geçirin. Konuşmayı sentezlemek ve dosyaya yazmak için bir metin dizesiyle komutunu çalıştırın SpeakTextAsync() .

static async Task SynthesizeAudioAsync()
{
    var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
    using var speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    await speechSynthesizer.SpeakTextAsync("I'm excited to try text to speech");
}

Programı çalıştırdığınızda, belirttiğiniz konuma yazılan sentezlenmiş bir .wav dosyası oluşturur. Bu sonuç, en temel kullanımın iyi bir örneğidir. Ardından, özel senaryolarla çalışmak için çıkışı özelleştirebilir ve çıkış yanıtını bellek içi akış olarak işleyebilirsiniz.

Hoparlör çıkışına sentezle

Sentezlenmiş konuşmanın çıkışını konuşmacı gibi geçerli etkin çıkış cihazına göndermek için örneği oluştururken parametresini atın AudioConfigSpeechSynthesizer . Bir örnek aşağıda verilmiştir:

static async Task SynthesizeAudioAsync()
{
    var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    using var speechSynthesizer = new SpeechSynthesizer(speechConfig);
    await speechSynthesizer.SpeakTextAsync("I'm excited to try text to speech");
}

Bellek içi akış olarak sonuç alma

Sonuçta elde edilen ses verilerini bir dosyaya doğrudan yazmak yerine bellek içi akış olarak kullanabilirsiniz. Bellek içi akışla özel davranışlar oluşturabilirsiniz:

  • Elde edilen bayt dizisini özel aşağı akış hizmetleri için aranabilir bir akış olarak soyutlar.
  • Sonucu diğer API'lerle veya hizmetlerle tümleştirin.
  • Ses verilerini değiştirin, özel .wav üst bilgileri yazın ve ilgili görevleri gerçekleştirin.

Bu değişikliği önceki örnekte yapabilirsiniz. İlk olarak, artan denetim için çıkış davranışını bu noktadan itibaren el ile yönettiğiniz için bloğu kaldırın AudioConfig . Oluşturucuda SpeechSynthesizer değerini AudioConfig geçirinnull.

Not

önceki konuşmacı çıkış örneğinde olduğu gibi yerine için AudioConfiggeçirildiğindenull, geçerli etkin çıkış cihazında ses varsayılan olarak yürütülmüyor.

Sonucu bir SpeechSynthesisResult değişkenine kaydedin. özelliği, AudioData çıkış verileri için bir byte [] örnek içerir. Bu byte [] örnekle el ile çalışabilir veya bellek içi akışı yönetmek için AudioDataStream sınıfını kullanabilirsiniz.

Bu örnekte, sonuçtan AudioDataStream.FromResult() bir akış almak için statik işlevini kullanırsınız:

static async Task SynthesizeAudioAsync()
{
    var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    using var speechSynthesizer = new SpeechSynthesizer(speechConfig, null);

    var result = await speechSynthesizer.SpeakTextAsync("I'm excited to try text to speech");
    using var stream = AudioDataStream.FromResult(result);
}

Bu noktada, sonuçta elde stream edilen nesneyi kullanarak herhangi bir özel davranışı uygulayabilirsiniz.

Ses biçimini özelleştirme

Aşağıdakiler dahil olmak üzere ses çıkış özniteliklerini özelleştirebilirsiniz:

  • Ses dosyası türü
  • Örnekleme hızı
  • Bit derinliği

Ses biçimini değiştirmek için nesnedeki SetSpeechSynthesisOutputFormat()SpeechConfig işlevini kullanırsınız. Bu işlev SpeechSynthesisOutputFormat türünde bir enum örnek bekler. Çıkış biçimini seçmek için öğesini enum kullanın. Kullanılabilir biçimler için ses biçimleri listesine bakın.

Gereksinimlerinize bağlı olarak farklı dosya türleri için çeşitli seçenekler vardır. Tanımı gereği, gibi Raw24Khz16BitMonoPcm ham biçimler ses üst bilgileri içermez. Ham biçimleri yalnızca şu durumlardan birinde kullanın:

  • Aşağı akış uygulamanızın ham bir bit akışının kodunu çözebileceğini biliyorsunuz.
  • Bit derinliği, örnek hızı ve kanal sayısı gibi faktörlere göre el ile üst bilgiler oluşturmayı planlıyorsunuz.

Bu örnek, nesne üzerinde ayar SpeechSynthesisOutputFormatSpeechConfig yaparak yüksek aslına uygun RIFF biçimini Riff24Khz16BitMonoPcm belirtir. Önceki bölümdeki örneğe benzer şekilde, sonucun bellek içi akışını almak için AudioDataStream kullanırsınız ve sonra bunu bir dosyaya yazarsınız.

static async Task SynthesizeAudioAsync()
{
    var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    speechConfig.SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm);

    using var speechSynthesizer = new SpeechSynthesizer(speechConfig, null);
    var result = await speechSynthesizer.SpeakTextAsync("I'm excited to try text to speech");

    using var stream = AudioDataStream.FromResult(result);
    await stream.SaveToWaveFileAsync("path/to/write/file.wav");
}

Programı çalıştırdığınızda, belirtilen yola bir .wav dosyası yazar.

Konuşma özelliklerini özelleştirmek için SSML kullanma

XML şemasından isteklerinizi göndererek metindeki ses perdesi, söyleniş, konuşma hızı, ses düzeyi ve diğer yönlerde ince ayar yapmak için SSML kullanabilirsiniz. Bu bölümde sesi değiştirme örneği gösterilmektedir. Daha fazla bilgi için bkz . Konuşma Sentezi biçimlendirme diline genel bakış.

Özelleştirme için SSML kullanmaya başlamak için sesi değiştiren küçük bir değişiklik yaparsınız.

  1. Kök proje dizininizde SSML yapılandırması için yeni bir XML dosyası oluşturun.

    <speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
      <voice name="en-US-AvaMultilingualNeural">
        When you're on the freeway, it's a good idea to use a GPS.
      </voice>
    </speak>
    

    Bu örnekte dosya ssml.xml. Kök öğe her zaman <speak>şeklindedir. Bir <voice> öğedeki metni kaydırmak, parametresini kullanarak sesi değiştirmenize name olanak tanır. Desteklenen sinir seslerinin tam listesi için bkz . Desteklenen diller.

  2. XML dosyanıza başvurmak için konuşma sentezi isteğini değiştirin. İstek çoğunlukla aynıdır, ancak işlevini kullanmak SpeakTextAsync() yerine kullanırsınız SpeakSsmlAsync(). Bu işlev bir XML dizesi bekler. İlk olarak, kullanarak File.ReadAllText()SSML yapılandırmanızı dize olarak yükleyin. Bu noktadan itibaren sonuç nesnesi önceki örneklerle tamamen aynıdır.

    Not

    Visual Studio kullanıyorsanız derleme yapılandırmanız büyük olasılıkla XML dosyanızı varsayılan olarak bulamaz. XML dosyasına sağ tıklayın ve Özellikler'i seçin. Derleme Eylemini İçerik olarak değiştirin. Kopyala'yı Her zaman Kopyala olarak Çıkış Dizinine değiştirin.

    public static async Task SynthesizeAudioAsync()
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
        using var speechSynthesizer = new SpeechSynthesizer(speechConfig, null);
    
        var ssml = File.ReadAllText("./ssml.xml");
        var result = await speechSynthesizer.SpeakSsmlAsync(ssml);
    
        using var stream = AudioDataStream.FromResult(result);
        await stream.SaveToWaveFileAsync("path/to/write/file.wav");
    }
    

Not

SSML kullanmadan sesi değiştirmek için özelliğini kullanarak SpeechConfig.SpeechSynthesisVoiceName = "en-US-AvaMultilingualNeural";üzerinde SpeechConfig ayarlayabilirsiniz.

Sentezleyici olaylarına abone olma

Metinden konuşmaya işleme ve sonuçlar hakkında daha fazla içgörü elde etmek isteyebilirsiniz. Örneğin, sentezleyicinin ne zaman başlayıp durduğu hakkında bilgi edinmek veya sentez sırasında karşılaşılan diğer olaylar hakkında bilgi edinmek isteyebilirsiniz.

Metin okuma için SpeechSynthesizer'ı kullanırken bu tablodaki olaylara abone olabilirsiniz:

Olay Açıklama Kullanım örneği
BookmarkReached Yer işaretine ulaşıldığını gösterir. Bir yer işaretine ulaşılan olayı tetikleyebilmek için SSML'de bir bookmark öğe gerekir. Bu olay, sentezin başlangıcı ile öğesi arasındaki çıkış sesinin bookmark geçen süresini raporlar. Olayın Text özelliği, yer işaretinin mark özniteliğinde ayarladığınız dize değeridir. Öğeler bookmark konuşulmuyor. Ses akışındaki her işaretçinin bookmark uzaklığını almak için SSML'ye özel işaretçiler eklemek için öğesini kullanabilirsiniz. bookmark öğesi, metin veya etiket dizisindeki belirli bir konuma başvurmak için kullanılabilir.
SynthesisCanceled Konuşma sentezinin iptal edildiğine dair sinyaller. Sentezin ne zaman iptal edildiğini doğrulayabilirsiniz.
SynthesisCompleted Konuşma sentezi tamamlandı sinyalleri. Sentezin ne zaman tamamladığını doğrulayabilirsiniz.
SynthesisStarted Konuşma sentezi başladığının sinyalleri. Sentezin ne zaman başladığını doğrulayabilirsiniz.
Synthesizing Konuşma sentezin devam ettiğinin sinyalleri. Bu olay, SDK Konuşma hizmetinden her ses öbek aldığında tetikler. Sentez devam ederken onaylayabilirsiniz.
VisemeReceived Bir viseme olayının alındığını gösterir. Visemeler genellikle gözlemlenen konuşmadaki önemli pozları temsil etmek için kullanılır. Önemli pozlar dudaklar, çene ve dilin belirli bir foneme üretmedeki konumunu içerir. Konuşma sesi yürütülürken bir karakterin yüzüne animasyon eklemek için visemes kullanabilirsiniz.
WordBoundary Bir sözcük sınırının alındığını gösterir. Bu olay her yeni konuşulan sözcüğün, noktalama işaretinin ve tümcenin başında oluşturulur. Olay, çıkış sesinin başından itibaren geçerli sözcüğün saat uzaklığını onay işaretleriyle bildirir. Bu olay ayrıca, konuşulmak üzere olan sözcüğün hemen öncesinde giriş metnindeki veya SSML'deki karakter konumunu bildirir. Bu olay genellikle metnin ve ilgili sesin göreli konumlarını almak için kullanılır. Yeni bir sözcük hakkında bilgi edinmek ve ardından zamanlamaya göre işlem yapmak isteyebilirsiniz. Örneğin, konuşulan sözcükleri ne zaman ve ne kadar süreyle vurgulayabileceğinize karar vermenize yardımcı olabilecek bilgiler alabilirsiniz.

Not

Çıkış ses verileri kullanılabilir hale geldikçe olaylar tetiklenir ve bu da çıkış cihazına kayıttan yürütmeden daha hızlıdır. Çağıranın akışı ve gerçek zamanlı olarak uygun şekilde eşitlemesi gerekir.

Konuşma sentezi için olaylara nasıl abone olunduğunu gösteren bir örnek aşağıda verilmiştır. Hızlı başlangıçtaki yönergeleri izleyebilirsiniz, ancak bu Program.cs dosyasının içeriğini aşağıdaki C# koduyla değiştirebilirsiniz:

using Microsoft.CognitiveServices.Speech;

class Program 
{
    // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
    static string speechKey = Environment.GetEnvironmentVariable("SPEECH_KEY");
    static string speechRegion = Environment.GetEnvironmentVariable("SPEECH_REGION");

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription(speechKey, speechRegion);
         
        var speechSynthesisVoiceName  = "en-US-AvaMultilingualNeural";  
        var ssml = @$"<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'>
            <voice name='{speechSynthesisVoiceName}'>
                <mstts:viseme type='redlips_front'/>
                The rainbow has seven colors: <bookmark mark='colors_list_begin'/>Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark='colors_list_end'/>.
            </voice>
        </speak>";

        // Required for sentence-level WordBoundary events
        speechConfig.SetProperty(PropertyId.SpeechServiceResponse_RequestSentenceBoundary, "true");

        using (var speechSynthesizer = new SpeechSynthesizer(speechConfig))
        {
            // Subscribe to events

            speechSynthesizer.BookmarkReached += (s, e) =>
            {
                Console.WriteLine($"BookmarkReached event:" +
                    $"\r\n\tAudioOffset: {(e.AudioOffset + 5000) / 10000}ms" +
                    $"\r\n\tText: \"{e.Text}\".");
            };

            speechSynthesizer.SynthesisCanceled += (s, e) =>
            {
                Console.WriteLine("SynthesisCanceled event");
            };

            speechSynthesizer.SynthesisCompleted += (s, e) =>
            {                
                Console.WriteLine($"SynthesisCompleted event:" +
                    $"\r\n\tAudioData: {e.Result.AudioData.Length} bytes" +
                    $"\r\n\tAudioDuration: {e.Result.AudioDuration}");
            };

            speechSynthesizer.SynthesisStarted += (s, e) =>
            {
                Console.WriteLine("SynthesisStarted event");
            };

            speechSynthesizer.Synthesizing += (s, e) =>
            {
                Console.WriteLine($"Synthesizing event:" +
                    $"\r\n\tAudioData: {e.Result.AudioData.Length} bytes");
            };

            speechSynthesizer.VisemeReceived += (s, e) =>
            {
                Console.WriteLine($"VisemeReceived event:" +
                    $"\r\n\tAudioOffset: {(e.AudioOffset + 5000) / 10000}ms" +
                    $"\r\n\tVisemeId: {e.VisemeId}");
            };

            speechSynthesizer.WordBoundary += (s, e) =>
            {
                Console.WriteLine($"WordBoundary event:" +
                    // Word, Punctuation, or Sentence
                    $"\r\n\tBoundaryType: {e.BoundaryType}" +
                    $"\r\n\tAudioOffset: {(e.AudioOffset + 5000) / 10000}ms" +
                    $"\r\n\tDuration: {e.Duration}" +
                    $"\r\n\tText: \"{e.Text}\"" +
                    $"\r\n\tTextOffset: {e.TextOffset}" +
                    $"\r\n\tWordLength: {e.WordLength}");
            };

            // Synthesize the SSML
            Console.WriteLine($"SSML to synthesize: \r\n{ssml}");
            var speechSynthesisResult = await speechSynthesizer.SpeakSsmlAsync(ssml);

            // Output the results
            switch (speechSynthesisResult.Reason)
            {
                case ResultReason.SynthesizingAudioCompleted:
                    Console.WriteLine("SynthesizingAudioCompleted result");
                    break;
                case ResultReason.Canceled:
                    var cancellation = SpeechSynthesisCancellationDetails.FromResult(speechSynthesisResult);
                    Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");

                    if (cancellation.Reason == CancellationReason.Error)
                    {
                        Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
                        Console.WriteLine($"CANCELED: ErrorDetails=[{cancellation.ErrorDetails}]");
                        Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
                    }
                    break;
                default:
                    break;
            }
        }

        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }
}

GitHub'da daha fazla metin okuma örneği bulabilirsiniz.

Özel uç nokta kullanma

Özel uç nokta, metin okuma istekleri için kullanılan standart uç noktayla işlevsel olarak aynıdır.

Bir fark, Konuşma SDK'sı EndpointId aracılığıyla özel sesinizi kullanmak için belirtilmesi gerektiğidir. Metin okuma hızlı başlangıcıyla başlayıp kodu ve SpeechSynthesisVoiceNameile EndpointId güncelleştirebilirsiniz.

var speechConfig = SpeechConfig.FromSubscription(speechKey, speechRegion);     
speechConfig.SpeechSynthesisVoiceName = "YourCustomVoiceName";
speechConfig.EndpointId = "YourEndpointId";

Konuşma Sentezi biçimlendirme dili (SSML) aracılığıyla özel bir ses kullanmak için, ses adı olarak model adını belirtin. Bu örnekte ses kullanılır YourCustomVoiceName .

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="YourCustomVoiceName">
        This is the text that is spoken. 
    </voice>
</speak>

Kapsayıcı çalıştırma ve kullanma

Konuşma kapsayıcıları, Konuşma SDK'sı ve Konuşma CLI'sı aracılığıyla erişilen websocket tabanlı sorgu uç noktası API'leri sağlar. Varsayılan olarak, Konuşma SDK'sı ve Konuşma CLI'sı genel Konuşma hizmetini kullanır. Kapsayıcıyı kullanmak için başlatma yöntemini değiştirmeniz gerekir. Anahtar ve bölge yerine kapsayıcı ana bilgisayar URL'si kullanın.

Kapsayıcılar hakkında daha fazla bilgi için bkz . Docker ile Konuşma kapsayıcılarını yükleme ve çalıştırma.

GitHub'da Başvuru belgeleri | Paketi (NuGet) | Ek Örnekler

Bu nasıl yapılır kılavuzunda, metinden konuşmaya sentez yapmaya yönelik yaygın tasarım desenlerini öğreneceksiniz.

Aşağıdaki alanlar hakkında daha fazla bilgi için bkz. Metin okuma nedir?

  • Yanıtları bellek içi akışlar olarak alma.
  • Çıkış örnek hızını ve bit hızını özelleştirme.
  • Konuşma Sentezi İşaretlemeyi Dili (SSML) kullanarak sentez istekleri gönderme.
  • Sinir seslerini kullanma.
  • Olaylara abone olma ve sonuçlar üzerinde işlem yapmak.

Sentez dilini ve sesini seçin

Konuşma tanıma hizmetindeki metin okuma özelliği 400'den fazla sesi ve 140'tan fazla dili ve çeşidi destekler. Ses Galerisi'nde desteklenen metin okuma yerellerinin tam listesine bakın veya bunları deneyin.

Giriş metninizle eşleşecek speechConfig sınıfının dilini veya sesini belirtin ve belirtilen sesi kullanın. Aşağıdaki kod parçacığı bu tekniğin nasıl çalıştığını gösterir:

void synthesizeSpeech()
{
    auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
    // Set either the `SpeechSynthesisVoiceName` or `SpeechSynthesisLanguage`.
    speechConfig->SetSpeechSynthesisLanguage("en-US"); 
    speechConfig->SetSpeechSynthesisVoiceName("en-US-AvaMultilingualNeural");
}

Tüm sinir sesleri çok dillidir ve kendi dillerinde ve İngilizcede akıcıdır. Örneğin, İngilizce giriş metni "Konuşmayı denemek için çok heyecanlıyım" ise ve öğesini seçerseniz es-ES-ElviraNeural, metin İspanyolca vurgulu İngilizce olarak konuşulur.

Ses, giriş metninin dilini konuşmazsa Konuşma hizmeti sentezlenmiş ses oluşturmaz. Desteklenen sinir seslerinin tam listesi için bkz . Konuşma hizmeti için dil ve ses desteği.

Not

Varsayılan ses, Ses Listesi API'sinden yerel ayar başına döndürülen ilk sestir.

Konuşan ses, öncelik sırasına göre aşağıdaki gibi belirlenir:

  • veya SpeechSynthesisLanguageseçeneğini ayarlamazsanızSpeechSynthesisVoiceName, için en-US varsayılan ses konuşarak ifade eder.
  • Yalnızca ayarını yaparsanız SpeechSynthesisLanguage, belirtilen yerel ayar için varsayılan ses konuşu.
  • Hem hem de SpeechSynthesisVoiceNameSpeechSynthesisLanguage ayarlandıysa, SpeechSynthesisLanguage ayar yoksayılır. Konuşmaları kullanarak SpeechSynthesisVoiceName belirttiğiniz ses.
  • Ses öğesi Konuşma Sentezi Biçimlendirme Dili (SSML) kullanılarak ayarlanırsa ve SpeechSynthesisVoiceNameSpeechSynthesisLanguage ayarları yoksayılır.

Konuşmayı dosyaya sentezle

SpeechSynthesizer nesnesi oluşturun. Aşağıdaki kod parçacıklarında gösterilen bu nesne, metinden konuşma dönüştürmelerine ve çıkışları konuşmacılara, dosyalara veya diğer çıkış akışlarına çalıştırır. SpeechSynthesizer parametre olarak kabul eder:

  1. AudioConfig işlevini kullanarak FromWavFileOutput() çıktıyı otomatik olarak bir .wav dosyasına yazmak için bir örnek oluşturun:

    void synthesizeSpeech()
    {
        auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
        auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
    }
    
  2. Örnek oluşturma SpeechSynthesizer . Nesnenizi speechConfig ve audioConfig nesnesini parametre olarak geçirin. Konuşmayı sentezlemek ve dosyaya yazmak için bir metin dizesiyle komutunu çalıştırın SpeakTextAsync() .

    void synthesizeSpeech()
    {
        auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
        auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
        auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig, audioConfig);
        auto result = speechSynthesizer->SpeakTextAsync("A simple test to write to a file.").get();
    }
    

Programı çalıştırdığınızda, belirttiğiniz konuma yazılan sentezlenmiş bir .wav dosyası oluşturur. Bu sonuç, en temel kullanımın iyi bir örneğidir. Ardından, özel senaryolarla çalışmak için çıkışı özelleştirebilir ve çıkış yanıtını bellek içi akış olarak işleyebilirsiniz.

Hoparlör çıkışına sentezle

Sentezlenmiş konuşmanın çıkışını konuşmacı gibi geçerli etkin çıkış cihazına göndermek için örneği oluştururken parametresini atın AudioConfigSpeechSynthesizer . Bir örnek aşağıda verilmiştir:

void synthesizeSpeech()
{
    auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
    auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig);
    auto result = speechSynthesizer->SpeakTextAsync("I'm excited to try text to speech").get();
}

Bellek içi akış olarak sonuç alma

Sonuçta elde edilen ses verilerini bir dosyaya doğrudan yazmak yerine bellek içi akış olarak kullanabilirsiniz. Bellek içi akışla özel davranışlar oluşturabilirsiniz:

  • Elde edilen bayt dizisini özel aşağı akış hizmetleri için aranabilir bir akış olarak soyutlar.
  • Sonucu diğer API'lerle veya hizmetlerle tümleştirin.
  • Ses verilerini değiştirin, özel .wav üst bilgileri yazın ve ilgili görevleri gerçekleştirin.

Bu değişikliği önceki örnekte yapabilirsiniz. İlk olarak, artan denetim için çıkış davranışını bu noktadan itibaren el ile yönettiğiniz için bloğu kaldırın AudioConfig . Oluşturucuda SpeechSynthesizer değerini AudioConfig geçirinNULL.

Not

önceki konuşmacı çıkış örneğinde olduğu gibi yerine için AudioConfiggeçirildiğindeNULL, geçerli etkin çıkış cihazında ses varsayılan olarak yürütülmüyor.

Sonucu bir SpeechSynthesisResult değişkenine kaydedin. Alıcı, GetAudioData çıkış verileri için bir byte [] örnek döndürür. Bu byte [] örnekle el ile çalışabilir veya bellek içi akışı yönetmek için AudioDataStream sınıfını kullanabilirsiniz.

Bu örnekte, sonuçtan AudioDataStream.FromResult() bir akış almak için statik işlevini kullanın:

void synthesizeSpeech()
{
    auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
    auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig);

    auto result = speechSynthesizer->SpeakTextAsync("Getting the response as an in-memory stream.").get();
    auto stream = AudioDataStream::FromResult(result);
}

Bu noktada, sonuçta elde stream edilen nesneyi kullanarak herhangi bir özel davranışı uygulayabilirsiniz.

Ses biçimini özelleştirme

Aşağıdakiler dahil olmak üzere ses çıkış özniteliklerini özelleştirebilirsiniz:

  • Ses dosyası türü
  • Örnekleme hızı
  • Bit derinliği

Ses biçimini değiştirmek için nesnedeki SetSpeechSynthesisOutputFormat()SpeechConfig işlevini kullanın. Bu işlev SpeechSynthesisOutputFormat türünde bir enum örnek bekler. Çıkış biçimini seçmek için öğesini enum kullanın. Kullanılabilir biçimler için ses biçimleri listesine bakın.

Gereksinimlerinize bağlı olarak farklı dosya türleri için çeşitli seçenekler vardır. Tanımı gereği, gibi Raw24Khz16BitMonoPcm ham biçimler ses üst bilgileri içermez. Ham biçimleri yalnızca şu durumlardan birinde kullanın:

  • Aşağı akış uygulamanızın ham bir bit akışının kodunu çözebileceğini biliyorsunuz.
  • Bit derinliği, örnek hızı ve kanal sayısı gibi faktörlere göre el ile üst bilgiler oluşturmayı planlıyorsunuz.

Bu örnek, nesne üzerinde ayar SpeechSynthesisOutputFormatSpeechConfig yaparak yüksek aslına uygun RIFF biçimini Riff24Khz16BitMonoPcm belirtir. Önceki bölümdeki örneğe benzer şekilde, sonucun bellek içi akışını almak ve bunu bir dosyaya yazmak için kullanırsınız AudioDataStream .

void synthesizeSpeech()
{
    auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
    speechConfig->SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat::Riff24Khz16BitMonoPcm);

    auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig);
    auto result = speechSynthesizer->SpeakTextAsync("A simple test to write to a file.").get();

    auto stream = AudioDataStream::FromResult(result);
    stream->SaveToWavFileAsync("path/to/write/file.wav").get();
}

Programı çalıştırdığınızda, belirtilen yola bir .wav dosyası yazar.

Konuşma özelliklerini özelleştirmek için SSML kullanma

XML şemasından isteklerinizi göndererek metindeki ses perdesi, söyleniş, konuşma hızı, ses düzeyi ve diğer yönlerde ince ayar yapmak için SSML kullanabilirsiniz. Bu bölümde sesi değiştirme örneği gösterilmektedir. Daha fazla bilgi için bkz . Konuşma Sentezi biçimlendirme diline genel bakış.

Özelleştirme için SSML kullanmaya başlamak için sesi değiştiren küçük bir değişiklik yapın.

  1. Kök proje dizininizde SSML yapılandırması için yeni bir XML dosyası oluşturun.

    <speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
      <voice name="en-US-AvaMultilingualNeural">
        When you're on the freeway, it's a good idea to use a GPS.
      </voice>
    </speak>
    

    Bu örnekte dosya ssml.xml. Kök öğe her zaman <speak>şeklindedir. Bir <voice> öğedeki metni kaydırmak, parametresini kullanarak sesi değiştirmenize name olanak tanır. Desteklenen sinir seslerinin tam listesi için bkz . Desteklenen diller.

  2. XML dosyanıza başvurmak için konuşma sentezi isteğini değiştirin. İstek çoğunlukla aynıdır. işlevini kullanmak SpeakTextAsync() yerine kullanırsınız SpeakSsmlAsync(). Bu işlev bir XML dizesi bekler. İlk olarak, SSML yapılandırmanızı dize olarak yükleyin. Bu noktadan itibaren sonuç nesnesi önceki örneklerle tamamen aynıdır.

    void synthesizeSpeech()
    {
        auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
        auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig);
    
        std::ifstream file("./ssml.xml");
        std::string ssml, line;
        while (std::getline(file, line))
        {
            ssml += line;
            ssml.push_back('\n');
        }
        auto result = speechSynthesizer->SpeakSsmlAsync(ssml).get();
    
        auto stream = AudioDataStream::FromResult(result);
        stream->SaveToWavFileAsync("path/to/write/file.wav").get();
    }
    

Not

SSML kullanmadan sesi değiştirmek için özelliğini kullanarak SpeechConfig.SetSpeechSynthesisVoiceName("en-US-AndrewMultilingualNeural")üzerinde SpeechConfig ayarlayabilirsiniz.

Sentezleyici olaylarına abone olma

Metinden konuşmaya işleme ve sonuçlar hakkında daha fazla içgörü elde etmek isteyebilirsiniz. Örneğin, sentezleyicinin ne zaman başlayıp durduğu hakkında bilgi edinmek veya sentez sırasında karşılaşılan diğer olaylar hakkında bilgi edinmek isteyebilirsiniz.

Metin okuma için SpeechSynthesizer'ı kullanırken bu tablodaki olaylara abone olabilirsiniz:

Olay Açıklama Kullanım örneği
BookmarkReached Yer işaretine ulaşıldığını gösterir. Bir yer işaretine ulaşılan olayı tetikleyebilmek için SSML'de bir bookmark öğe gerekir. Bu olay, sentezin başlangıcı ile öğesi arasındaki çıkış sesinin bookmark geçen süresini raporlar. Olayın Text özelliği, yer işaretinin mark özniteliğinde ayarladığınız dize değeridir. Öğeler bookmark konuşulmuyor. Ses akışındaki her işaretçinin bookmark uzaklığını almak için SSML'ye özel işaretçiler eklemek için öğesini kullanabilirsiniz. bookmark öğesi, metin veya etiket dizisindeki belirli bir konuma başvurmak için kullanılabilir.
SynthesisCanceled Konuşma sentezinin iptal edildiğine dair sinyaller. Sentezin ne zaman iptal edildiğini doğrulayabilirsiniz.
SynthesisCompleted Konuşma sentezi tamamlandı sinyalleri. Sentezin ne zaman tamamladığını doğrulayabilirsiniz.
SynthesisStarted Konuşma sentezi başladığının sinyalleri. Sentezin ne zaman başladığını doğrulayabilirsiniz.
Synthesizing Konuşma sentezin devam ettiğinin sinyalleri. Bu olay, SDK Konuşma hizmetinden her ses öbek aldığında tetikler. Sentez devam ederken onaylayabilirsiniz.
VisemeReceived Bir viseme olayının alındığını gösterir. Visemeler genellikle gözlemlenen konuşmadaki önemli pozları temsil etmek için kullanılır. Önemli pozlar dudaklar, çene ve dilin belirli bir foneme üretmedeki konumunu içerir. Konuşma sesi yürütülürken bir karakterin yüzüne animasyon eklemek için visemes kullanabilirsiniz.
WordBoundary Bir sözcük sınırının alındığını gösterir. Bu olay her yeni konuşulan sözcüğün, noktalama işaretinin ve tümcenin başında oluşturulur. Olay, çıkış sesinin başından itibaren geçerli sözcüğün saat uzaklığını onay işaretleriyle bildirir. Bu olay ayrıca, konuşulmak üzere olan sözcüğün hemen öncesinde giriş metnindeki veya SSML'deki karakter konumunu bildirir. Bu olay genellikle metnin ve ilgili sesin göreli konumlarını almak için kullanılır. Yeni bir sözcük hakkında bilgi edinmek ve ardından zamanlamaya göre işlem yapmak isteyebilirsiniz. Örneğin, konuşulan sözcükleri ne zaman ve ne kadar süreyle vurgulayabileceğinize karar vermenize yardımcı olabilecek bilgiler alabilirsiniz.

Not

Çıkış ses verileri kullanılabilir hale geldikçe olaylar tetiklenir ve bu da çıkış cihazına kayıttan yürütmeden daha hızlıdır. Çağıranın akışı ve gerçek zamanlı olarak uygun şekilde eşitlemesi gerekir.

Konuşma sentezi için olaylara nasıl abone olunduğunu gösteren bir örnek aşağıda verilmiştır. Hızlı başlangıçtaki yönergeleri izleyebilirsiniz, ancak bu main.cpp dosyasının içeriğini aşağıdaki kodla değiştirebilirsiniz:

#include <iostream> 
#include <stdlib.h>
#include <speechapi_cxx.h>

using namespace Microsoft::CognitiveServices::Speech;
using namespace Microsoft::CognitiveServices::Speech::Audio;

std::string getEnvironmentVariable(const char* name);

int main()
{
    // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
    auto speechKey = getEnvironmentVariable("SPEECH_KEY");
    auto speechRegion = getEnvironmentVariable("SPEECH_REGION");

    if ((size(speechKey) == 0) || (size(speechRegion) == 0)) {
        std::cout << "Please set both SPEECH_KEY and SPEECH_REGION environment variables." << std::endl;
        return -1;
    }

    auto speechConfig = SpeechConfig::FromSubscription(speechKey, speechRegion);

    // Required for WordBoundary event sentences.
    speechConfig->SetProperty(PropertyId::SpeechServiceResponse_RequestSentenceBoundary, "true");

    const auto ssml = R"(<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'>
        <voice name = 'en-US-AvaMultilingualNeural'>
            <mstts:viseme type = 'redlips_front' />
            The rainbow has seven colors : <bookmark mark = 'colors_list_begin' />Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark = 'colors_list_end' />.
        </voice>
        </speak>)";

    auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig);

    // Subscribe to events

    speechSynthesizer->BookmarkReached += [](const SpeechSynthesisBookmarkEventArgs& e)
    {
        std::cout << "Bookmark reached. "
            << "\r\n\tAudioOffset: " << round(e.AudioOffset / 10000) << "ms"
            << "\r\n\tText: " << e.Text << std::endl;
    };

    speechSynthesizer->SynthesisCanceled += [](const SpeechSynthesisEventArgs& e)
    {
        std::cout << "SynthesisCanceled event" << std::endl;
    };

    speechSynthesizer->SynthesisCompleted += [](const SpeechSynthesisEventArgs& e)
    {
        auto audioDuration = std::chrono::duration_cast<std::chrono::milliseconds>(e.Result->AudioDuration).count();

        std::cout << "SynthesisCompleted event:"
            << "\r\n\tAudioData: " << e.Result->GetAudioData()->size() << "bytes"
            << "\r\n\tAudioDuration: " << audioDuration << std::endl;
    };

    speechSynthesizer->SynthesisStarted += [](const SpeechSynthesisEventArgs& e)
    {
        std::cout << "SynthesisStarted event" << std::endl;
    };

    speechSynthesizer->Synthesizing += [](const SpeechSynthesisEventArgs& e)
    {
        std::cout << "Synthesizing event:"
            << "\r\n\tAudioData: " << e.Result->GetAudioData()->size() << "bytes" << std::endl;
    };

    speechSynthesizer->VisemeReceived += [](const SpeechSynthesisVisemeEventArgs& e)
    {
        std::cout << "VisemeReceived event:"
            << "\r\n\tAudioOffset: " << round(e.AudioOffset / 10000) << "ms"
            << "\r\n\tVisemeId: " << e.VisemeId << std::endl;
    };

    speechSynthesizer->WordBoundary += [](const SpeechSynthesisWordBoundaryEventArgs& e)
    {
        auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(e.Duration).count();
        
        auto boundaryType = "";
        switch (e.BoundaryType) {
        case SpeechSynthesisBoundaryType::Punctuation:
            boundaryType = "Punctuation";
            break;
        case SpeechSynthesisBoundaryType::Sentence:
            boundaryType = "Sentence";
            break;
        case SpeechSynthesisBoundaryType::Word:
            boundaryType = "Word";
            break;
        }

        std::cout << "WordBoundary event:"
            // Word, Punctuation, or Sentence
            << "\r\n\tBoundaryType: " << boundaryType
            << "\r\n\tAudioOffset: " << round(e.AudioOffset / 10000) << "ms"
            << "\r\n\tDuration: " << duration
            << "\r\n\tText: \"" << e.Text << "\""
            << "\r\n\tTextOffset: " << e.TextOffset
            << "\r\n\tWordLength: " << e.WordLength << std::endl;
    };

    auto result = speechSynthesizer->SpeakSsmlAsync(ssml).get();

    // Checks result.
    if (result->Reason == ResultReason::SynthesizingAudioCompleted)
    {
        std::cout << "SynthesizingAudioCompleted result" << std::endl;
    }
    else if (result->Reason == ResultReason::Canceled)
    {
        auto cancellation = SpeechSynthesisCancellationDetails::FromResult(result);
        std::cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;

        if (cancellation->Reason == CancellationReason::Error)
        {
            std::cout << "CANCELED: ErrorCode=" << (int)cancellation->ErrorCode << std::endl;
            std::cout << "CANCELED: ErrorDetails=[" << cancellation->ErrorDetails << "]" << std::endl;
            std::cout << "CANCELED: Did you set the speech resource key and region values?" << std::endl;
        }
    }

    std::cout << "Press enter to exit..." << std::endl;
    std::cin.get();
}

std::string getEnvironmentVariable(const char* name)
{
#if defined(_MSC_VER)
    size_t requiredSize = 0;
    (void)getenv_s(&requiredSize, nullptr, 0, name);
    if (requiredSize == 0)
    {
        return "";
    }
    auto buffer = std::make_unique<char[]>(requiredSize);
    (void)getenv_s(&requiredSize, buffer.get(), requiredSize, name);
    return buffer.get();
#else
    auto value = getenv(name);
    return value ? value : "";
#endif
}

GitHub'da daha fazla metin okuma örneği bulabilirsiniz.

Özel uç nokta kullanma

Özel uç nokta, metin okuma istekleri için kullanılan standart uç noktayla işlevsel olarak aynıdır.

Bir fark, Konuşma SDK'sı EndpointId aracılığıyla özel sesinizi kullanmak için belirtilmesi gerektiğidir. Metin okuma hızlı başlangıcıyla başlayıp kodu ve SpeechSynthesisVoiceNameile EndpointId güncelleştirebilirsiniz.

auto speechConfig = SpeechConfig::FromSubscription(speechKey, speechRegion);
speechConfig->SetSpeechSynthesisVoiceName("YourCustomVoiceName");
speechConfig->SetEndpointId("YourEndpointId");

Konuşma Sentezi biçimlendirme dili (SSML) aracılığıyla özel bir ses kullanmak için, ses adı olarak model adını belirtin. Bu örnekte ses kullanılır YourCustomVoiceName .

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="YourCustomVoiceName">
        This is the text that is spoken. 
    </voice>
</speak>

Kapsayıcı çalıştırma ve kullanma

Konuşma kapsayıcıları, Konuşma SDK'sı ve Konuşma CLI'sı aracılığıyla erişilen websocket tabanlı sorgu uç noktası API'leri sağlar. Varsayılan olarak, Konuşma SDK'sı ve Konuşma CLI'sı genel Konuşma hizmetini kullanır. Kapsayıcıyı kullanmak için başlatma yöntemini değiştirmeniz gerekir. Anahtar ve bölge yerine kapsayıcı ana bilgisayar URL'si kullanın.

Kapsayıcılar hakkında daha fazla bilgi için bkz . Docker ile Konuşma kapsayıcılarını yükleme ve çalıştırma.

GitHub'da Başvuru belgeleri | Paketi (Go) | Ek Örnekler

Bu nasıl yapılır kılavuzunda, metinden konuşmaya sentez yapmaya yönelik yaygın tasarım desenlerini öğreneceksiniz.

Aşağıdaki alanlar hakkında daha fazla bilgi için bkz. Metin okuma nedir?

  • Yanıtları bellek içi akışlar olarak alma.
  • Çıkış örnek hızını ve bit hızını özelleştirme.
  • Konuşma Sentezi İşaretlemeyi Dili (SSML) kullanarak sentez istekleri gönderme.
  • Sinir seslerini kullanma.
  • Olaylara abone olma ve sonuçlar üzerinde işlem yapmak.

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.
  • Azure portalında konuşma kaynağı oluşturun.
  • Konuşma kaynak anahtarınız ve bölgeniz. Konuşma kaynağınız dağıtıldıktan sonra anahtarları görüntülemek ve yönetmek için Kaynağa git'i seçin. Azure AI hizmetleri kaynakları hakkında daha fazla bilgi için bkz . Kaynağınızın anahtarlarını alma.

Konuşma SDK'sını yükleme

Herhangi bir işlem gerçekleştirmeden önce Go için Konuşma SDK'sını yüklemeniz gerekir.

Metinden konuşmaya ve konuşmacıya

Konuşma sentezini varsayılan ses çıkış cihazınızla çalıştırmak için aşağıdaki kod örneğini kullanın. ve değişkenlerini subscriptionregion konuşma anahtarınızla ve konumunuzla/bölgenizle değiştirin. Betiği çalıştırmak, giriş metninizi varsayılan konuşmacıya söyler.

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
    "time"

    "github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
    "github.com/Microsoft/cognitive-services-speech-sdk-go/common"
    "github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func synthesizeStartedHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("Synthesis started.")
}

func synthesizingHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Printf("Synthesizing, audio chunk size %d.\n", len(event.Result.AudioData))
}

func synthesizedHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Printf("Synthesized, audio length %d.\n", len(event.Result.AudioData))
}

func cancelledHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("Received a cancellation.")
}

func main() {
    subscription := "YourSpeechKey"
    region := "YourSpeechRegion"

    audioConfig, err := audio.NewAudioConfigFromDefaultSpeakerOutput()
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer audioConfig.Close()
    speechConfig, err := speech.NewSpeechConfigFromSubscription(subscription, region)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechConfig.Close()
    speechSynthesizer, err := speech.NewSpeechSynthesizerFromConfig(speechConfig, audioConfig)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechSynthesizer.Close()

    speechSynthesizer.SynthesisStarted(synthesizeStartedHandler)
    speechSynthesizer.Synthesizing(synthesizingHandler)
    speechSynthesizer.SynthesisCompleted(synthesizedHandler)
    speechSynthesizer.SynthesisCanceled(cancelledHandler)

    for {
        fmt.Printf("Enter some text that you want to speak, or enter empty text to exit.\n> ")
        text, _ := bufio.NewReader(os.Stdin).ReadString('\n')
        text = strings.TrimSuffix(text, "\n")
        if len(text) == 0 {
            break
        }

        task := speechSynthesizer.SpeakTextAsync(text)
        var outcome speech.SpeechSynthesisOutcome
        select {
        case outcome = <-task:
        case <-time.After(60 * time.Second):
            fmt.Println("Timed out")
            return
        }
        defer outcome.Close()
        if outcome.Error != nil {
            fmt.Println("Got an error: ", outcome.Error)
            return
        }

        if outcome.Result.Reason == common.SynthesizingAudioCompleted {
            fmt.Printf("Speech synthesized to speaker for text [%s].\n", text)
        } else {
            cancellation, _ := speech.NewCancellationDetailsFromSpeechSynthesisResult(outcome.Result)
            fmt.Printf("CANCELED: Reason=%d.\n", cancellation.Reason)

            if cancellation.Reason == common.Error {
                fmt.Printf("CANCELED: ErrorCode=%d\nCANCELED: ErrorDetails=[%s]\nCANCELED: Did you set the speech resource key and region values?\n",
                    cancellation.ErrorCode,
                    cancellation.ErrorDetails)
            }
        }
    }
}

GitHub'da barındırılan bileşenlere bağlanan bir go.mod dosyası oluşturmak için aşağıdaki komutları çalıştırın:

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

Şimdi kodu derleyin ve çalıştırın:

go build
go run quickstart

Sınıflar hakkında ayrıntılı bilgi için ve SpeechSynthesizer başvuru belgelerine SpeechConfig bakın.

Bellek içi akışa metin okuma

Sonuçta elde edilen ses verilerini bir dosyaya doğrudan yazmak yerine bellek içi akış olarak kullanabilirsiniz. Bellek içi akışla özel davranışlar oluşturabilirsiniz:

  • Elde edilen bayt dizisini özel aşağı akış hizmetleri için aranabilir bir akış olarak soyutlar.
  • Sonucu diğer API'lerle veya hizmetlerle tümleştirin.
  • Ses verilerini değiştirin, özel .wav üst bilgileri yazın ve ilgili görevleri gerçekleştirin.

Bu değişikliği önceki örnekte yapabilirsiniz. AudioConfig Artan denetim için çıkış davranışını bu noktadan itibaren el ile yönettiğinizden bloğu kaldırın. Ardından oluşturucuda için AudioConfig geçirin SpeechSynthesizernil.

Not

önceki konuşmacı çıktı örneğinde yaptığınız gibi yerine için geçirildiğinde nilAudioConfig, geçerli etkin çıkış cihazında ses varsayılan olarak yürütülmeyecektir.

Sonucu bir SpeechSynthesisResult değişkene kaydedin. özelliği, AudioData çıkış verileri için bir []byte örnek döndürür. Bu []byte örnekle el ile çalışabilir veya bellek içi akışı yönetmek için sınıfını kullanabilirsiniz AudioDataStream . Bu örnekte, sonuçtan NewAudioDataStreamFromSpeechSynthesisResult() bir akış almak için statik işlevini kullanırsınız.

ve değişkenlerini subscriptionregion konuşma anahtarınızla ve konumunuzla/bölgenizle değiştirin:

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
    "time"

    "github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func synthesizeStartedHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("Synthesis started.")
}

func synthesizingHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Printf("Synthesizing, audio chunk size %d.\n", len(event.Result.AudioData))
}

func synthesizedHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Printf("Synthesized, audio length %d.\n", len(event.Result.AudioData))
}

func cancelledHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("Received a cancellation.")
}

func main() {
    subscription := "YourSpeechKey"
    region := "YourSpeechRegion"

    speechConfig, err := speech.NewSpeechConfigFromSubscription(subscription, region)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechConfig.Close()
    speechSynthesizer, err := speech.NewSpeechSynthesizerFromConfig(speechConfig, nil)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechSynthesizer.Close()

    speechSynthesizer.SynthesisStarted(synthesizeStartedHandler)
    speechSynthesizer.Synthesizing(synthesizingHandler)
    speechSynthesizer.SynthesisCompleted(synthesizedHandler)
    speechSynthesizer.SynthesisCanceled(cancelledHandler)

    for {
        fmt.Printf("Enter some text that you want to speak, or enter empty text to exit.\n> ")
        text, _ := bufio.NewReader(os.Stdin).ReadString('\n')
        text = strings.TrimSuffix(text, "\n")
        if len(text) == 0 {
            break
        }

        // StartSpeakingTextAsync sends the result to channel when the synthesis starts.
        task := speechSynthesizer.StartSpeakingTextAsync(text)
        var outcome speech.SpeechSynthesisOutcome
        select {
        case outcome = <-task:
        case <-time.After(60 * time.Second):
            fmt.Println("Timed out")
            return
        }
        defer outcome.Close()
        if outcome.Error != nil {
            fmt.Println("Got an error: ", outcome.Error)
            return
        }

        // In most cases, we want to streaming receive the audio to lower the latency.
        // We can use AudioDataStream to do so.
        stream, err := speech.NewAudioDataStreamFromSpeechSynthesisResult(outcome.Result)
        defer stream.Close()
        if err != nil {
            fmt.Println("Got an error: ", err)
            return
        }

        var all_audio []byte
        audio_chunk := make([]byte, 2048)
        for {
            n, err := stream.Read(audio_chunk)

            if err == io.EOF {
                break
            }

            all_audio = append(all_audio, audio_chunk[:n]...)
        }

        fmt.Printf("Read [%d] bytes from audio data stream.\n", len(all_audio))
    }
}

GitHub'da barındırılan bileşenlere bağlanan bir go.mod dosyası oluşturmak için aşağıdaki komutları çalıştırın:

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

Şimdi kodu derleyin ve çalıştırın:

go build
go run quickstart

Sınıflar hakkında ayrıntılı bilgi için ve SpeechSynthesizer başvuru belgelerine SpeechConfig bakın.

Sentez dilini ve sesini seçin

Konuşma tanıma hizmetindeki metin okuma özelliği 400'den fazla sesi ve 140'tan fazla dili ve çeşidi destekler. Listenin tamamını alabilir veya Ses Galerisi'nde deneyebilirsiniz.

Giriş metninizle eşleşecek dili veya sesini SpeechConfig belirtin ve belirtilen sesi kullanın:

speechConfig, err := speech.NewSpeechConfigFromSubscription(key, region)
if err != nil {
    fmt.Println("Got an error: ", err)
    return
}
defer speechConfig.Close()

speechConfig.SetSpeechSynthesisLanguage("en-US")
speechConfig.SetSpeechSynthesisVoiceName("en-US-AvaMultilingualNeural")

Tüm sinir sesleri çok dillidir ve kendi dillerinde ve İngilizcede akıcıdır. Örneğin, İngilizce giriş metni "Konuşmayı denemek için çok heyecanlıyım" ise ve öğesini seçerseniz es-ES-ElviraNeural, metin İspanyolca vurgulu İngilizce olarak konuşulur.

Ses, giriş metninin dilini konuşmazsa Konuşma hizmeti sentezlenmiş ses oluşturmaz. Desteklenen sinir seslerinin tam listesi için bkz . Konuşma hizmeti için dil ve ses desteği.

Not

Varsayılan ses, Ses Listesi API'sinden yerel ayar başına döndürülen ilk sestir.

Konuşan ses, öncelik sırasına göre aşağıdaki gibi belirlenir:

  • veya SpeechSynthesisLanguageseçeneğini ayarlamazsanızSpeechSynthesisVoiceName, için en-US varsayılan ses konuşarak ifade eder.
  • Yalnızca ayarını yaparsanız SpeechSynthesisLanguage, belirtilen yerel ayar için varsayılan ses konuşu.
  • Hem hem de SpeechSynthesisVoiceNameSpeechSynthesisLanguage ayarlandıysa, SpeechSynthesisLanguage ayar yoksayılır. Konuşmaları kullanarak SpeechSynthesisVoiceName belirttiğiniz ses.
  • Ses öğesi Konuşma Sentezi Biçimlendirme Dili (SSML) kullanılarak ayarlanırsa ve SpeechSynthesisVoiceNameSpeechSynthesisLanguage ayarları yoksayılır.

Konuşma özelliklerini özelleştirmek için SSML kullanma

Xml şemasından isteklerinizi göndererek metin çıkışındaki konuşma, söyleniş, konuşma hızı, ses düzeyi ve daha fazlasını hassas bir şekilde ayarlamak için Konuşma Sentezi İşaretlemeyi Dili'ni (SSML) kullanabilirsiniz. Bu bölümde sesi değiştirme örneği gösterilmektedir. Daha fazla bilgi için bkz . Konuşma Sentezi biçimlendirme diline genel bakış.

Özelleştirme için SSML kullanmaya başlamak için sesi değiştiren küçük bir değişiklik yaparsınız.

İlk olarak, kök proje dizininizde SSML yapılandırması için yeni bir XML dosyası oluşturun. Bu örnekte, şeklindedir ssml.xml. Kök öğe her zaman <speak>şeklindedir. Bir <voice> öğedeki metni kaydırmak, parametresini kullanarak sesi değiştirmenize name olanak tanır. Desteklenen sinir seslerinin tam listesi için bkz . Desteklenen diller.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-US-AvaMultilingualNeural">
    When you're on the freeway, it's a good idea to use a GPS.
  </voice>
</speak>

Ardından, XML dosyanıza başvurmak için konuşma sentezi isteğini değiştirmeniz gerekir. İstek çoğunlukla aynıdır, ancak işlevini kullanmak SpeakTextAsync() yerine kullanırsınız SpeakSsmlAsync(). Bu işlev bir XML dizesi beklediği için önce SSML yapılandırmanızı dize olarak yüklersiniz. Bu noktadan itibaren sonuç nesnesi önceki örneklerle tamamen aynıdır.

Not

Sesi SSML kullanmadan ayarlamak için özelliğini kullanarak speechConfig.SetSpeechSynthesisVoiceName("en-US-AvaMultilingualNeural")ayarlayabilirsinizSpeechConfig.

Sentezleyici olaylarına abone olma

Metinden konuşmaya işleme ve sonuçlar hakkında daha fazla içgörü elde etmek isteyebilirsiniz. Örneğin, sentezleyicinin ne zaman başlayıp durduğu hakkında bilgi edinmek veya sentez sırasında karşılaşılan diğer olaylar hakkında bilgi edinmek isteyebilirsiniz.

Metin okuma için SpeechSynthesizer'ı kullanırken bu tablodaki olaylara abone olabilirsiniz:

Olay Açıklama Kullanım örneği
BookmarkReached Yer işaretine ulaşıldığını gösterir. Bir yer işaretine ulaşılan olayı tetikleyebilmek için SSML'de bir bookmark öğe gerekir. Bu olay, sentezin başlangıcı ile öğesi arasındaki çıkış sesinin bookmark geçen süresini raporlar. Olayın Text özelliği, yer işaretinin mark özniteliğinde ayarladığınız dize değeridir. Öğeler bookmark konuşulmuyor. Ses akışındaki her işaretçinin bookmark uzaklığını almak için SSML'ye özel işaretçiler eklemek için öğesini kullanabilirsiniz. bookmark öğesi, metin veya etiket dizisindeki belirli bir konuma başvurmak için kullanılabilir.
SynthesisCanceled Konuşma sentezinin iptal edildiğine dair sinyaller. Sentezin ne zaman iptal edildiğini doğrulayabilirsiniz.
SynthesisCompleted Konuşma sentezi tamamlandı sinyalleri. Sentezin ne zaman tamamladığını doğrulayabilirsiniz.
SynthesisStarted Konuşma sentezi başladığının sinyalleri. Sentezin ne zaman başladığını doğrulayabilirsiniz.
Synthesizing Konuşma sentezin devam ettiğinin sinyalleri. Bu olay, SDK Konuşma hizmetinden her ses öbek aldığında tetikler. Sentez devam ederken onaylayabilirsiniz.
VisemeReceived Bir viseme olayının alındığını gösterir. Visemeler genellikle gözlemlenen konuşmadaki önemli pozları temsil etmek için kullanılır. Önemli pozlar dudaklar, çene ve dilin belirli bir foneme üretmedeki konumunu içerir. Konuşma sesi yürütülürken bir karakterin yüzüne animasyon eklemek için visemes kullanabilirsiniz.
WordBoundary Bir sözcük sınırının alındığını gösterir. Bu olay her yeni konuşulan sözcüğün, noktalama işaretinin ve tümcenin başında oluşturulur. Olay, çıkış sesinin başından itibaren geçerli sözcüğün saat uzaklığını onay işaretleriyle bildirir. Bu olay ayrıca, konuşulmak üzere olan sözcüğün hemen öncesinde giriş metnindeki veya SSML'deki karakter konumunu bildirir. Bu olay genellikle metnin ve ilgili sesin göreli konumlarını almak için kullanılır. Yeni bir sözcük hakkında bilgi edinmek ve ardından zamanlamaya göre işlem yapmak isteyebilirsiniz. Örneğin, konuşulan sözcükleri ne zaman ve ne kadar süreyle vurgulayabileceğinize karar vermenize yardımcı olabilecek bilgiler alabilirsiniz.

Not

Çıkış ses verileri kullanılabilir hale geldikçe olaylar tetiklenir ve bu da çıkış cihazına kayıttan yürütmeden daha hızlıdır. Çağıranın akışı ve gerçek zamanlı olarak uygun şekilde eşitlemesi gerekir.

Konuşma sentezi için olaylara nasıl abone olunduğunu gösteren bir örnek aşağıda verilmiştır. Hızlı başlangıçtaki yönergeleri izleyebilirsiniz, ancak bu speech-synthesis.go dosyanın içeriğini aşağıdaki Go koduyla değiştirebilirsiniz:

package main

import (
    "fmt"
    "os"
    "time"

    "github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
    "github.com/Microsoft/cognitive-services-speech-sdk-go/common"
    "github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func bookmarkReachedHandler(event speech.SpeechSynthesisBookmarkEventArgs) {
    defer event.Close()
    fmt.Println("BookmarkReached event")
}

func synthesisCanceledHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("SynthesisCanceled event")
}

func synthesisCompletedHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("SynthesisCompleted event")
    fmt.Printf("\tAudioData: %d bytes\n", len(event.Result.AudioData))
    fmt.Printf("\tAudioDuration: %d\n", event.Result.AudioDuration)
}

func synthesisStartedHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("SynthesisStarted event")
}

func synthesizingHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("Synthesizing event")
    fmt.Printf("\tAudioData %d bytes\n", len(event.Result.AudioData))
}

func visemeReceivedHandler(event speech.SpeechSynthesisVisemeEventArgs) {
    defer event.Close()
    fmt.Println("VisemeReceived event")
    fmt.Printf("\tAudioOffset: %dms\n", (event.AudioOffset+5000)/10000)
    fmt.Printf("\tVisemeID %d\n", event.VisemeID)
}

func wordBoundaryHandler(event speech.SpeechSynthesisWordBoundaryEventArgs) {
    defer event.Close()
    boundaryType := ""
    switch event.BoundaryType {
    case 0:
        boundaryType = "Word"
    case 1:
        boundaryType = "Punctuation"
    case 2:
        boundaryType = "Sentence"
    }
    fmt.Println("WordBoundary event")
    fmt.Printf("\tBoundaryType %v\n", boundaryType)
    fmt.Printf("\tAudioOffset: %dms\n", (event.AudioOffset+5000)/10000)
    fmt.Printf("\tDuration %d\n", event.Duration)
    fmt.Printf("\tText %s\n", event.Text)
    fmt.Printf("\tTextOffset %d\n", event.TextOffset)
    fmt.Printf("\tWordLength %d\n", event.WordLength)
}

func main() {
    // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
    speechKey := os.Getenv("SPEECH_KEY")
    speechRegion := os.Getenv("SPEECH_REGION")

    audioConfig, err := audio.NewAudioConfigFromDefaultSpeakerOutput()
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer audioConfig.Close()
    speechConfig, err := speech.NewSpeechConfigFromSubscription(speechKey, speechRegion)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechConfig.Close()

    // Required for WordBoundary event sentences.
    speechConfig.SetProperty(common.SpeechServiceResponseRequestSentenceBoundary, "true")

    speechSynthesizer, err := speech.NewSpeechSynthesizerFromConfig(speechConfig, audioConfig)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechSynthesizer.Close()

    speechSynthesizer.BookmarkReached(bookmarkReachedHandler)
    speechSynthesizer.SynthesisCanceled(synthesisCanceledHandler)
    speechSynthesizer.SynthesisCompleted(synthesisCompletedHandler)
    speechSynthesizer.SynthesisStarted(synthesisStartedHandler)
    speechSynthesizer.Synthesizing(synthesizingHandler)
    speechSynthesizer.VisemeReceived(visemeReceivedHandler)
    speechSynthesizer.WordBoundary(wordBoundaryHandler)

    speechSynthesisVoiceName := "en-US-AvaMultilingualNeural"

    ssml := fmt.Sprintf(`<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'>
            <voice name='%s'>
                <mstts:viseme type='redlips_front'/>
                The rainbow has seven colors: <bookmark mark='colors_list_begin'/>Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark='colors_list_end'/>.
            </voice>
        </speak>`, speechSynthesisVoiceName)

    // Synthesize the SSML
    fmt.Printf("SSML to synthesize: \n\t%s\n", ssml)
    task := speechSynthesizer.SpeakSsmlAsync(ssml)

    var outcome speech.SpeechSynthesisOutcome
    select {
    case outcome = <-task:
    case <-time.After(60 * time.Second):
        fmt.Println("Timed out")
        return
    }
    defer outcome.Close()
    if outcome.Error != nil {
        fmt.Println("Got an error: ", outcome.Error)
        return
    }

    if outcome.Result.Reason == common.SynthesizingAudioCompleted {
        fmt.Println("SynthesizingAudioCompleted result")
    } else {
        cancellation, _ := speech.NewCancellationDetailsFromSpeechSynthesisResult(outcome.Result)
        fmt.Printf("CANCELED: Reason=%d.\n", cancellation.Reason)

        if cancellation.Reason == common.Error {
            fmt.Printf("CANCELED: ErrorCode=%d\nCANCELED: ErrorDetails=[%s]\nCANCELED: Did you set the speech resource key and region values?\n",
                cancellation.ErrorCode,
                cancellation.ErrorDetails)
        }
    }
}

GitHub'da daha fazla metin okuma örneği bulabilirsiniz.

Kapsayıcı çalıştırma ve kullanma

Konuşma kapsayıcıları, Konuşma SDK'sı ve Konuşma CLI'sı aracılığıyla erişilen websocket tabanlı sorgu uç noktası API'leri sağlar. Varsayılan olarak, Konuşma SDK'sı ve Konuşma CLI'sı genel Konuşma hizmetini kullanır. Kapsayıcıyı kullanmak için başlatma yöntemini değiştirmeniz gerekir. Anahtar ve bölge yerine kapsayıcı ana bilgisayar URL'si kullanın.

Kapsayıcılar hakkında daha fazla bilgi için bkz . Docker ile Konuşma kapsayıcılarını yükleme ve çalıştırma.

Başvuru belgeleri | GitHub'da Ek Örnekler

Bu nasıl yapılır kılavuzunda, metinden konuşmaya sentez yapmaya yönelik yaygın tasarım desenlerini öğreneceksiniz.

Aşağıdaki alanlar hakkında daha fazla bilgi için bkz. Metin okuma nedir?

  • Yanıtları bellek içi akışlar olarak alma.
  • Çıkış örnek hızını ve bit hızını özelleştirme.
  • Konuşma Sentezi İşaretlemeyi Dili (SSML) kullanarak sentez istekleri gönderme.
  • Sinir seslerini kullanma.
  • Olaylara abone olma ve sonuçlar üzerinde işlem yapmak.

Sentez dilini ve sesini seçin

Konuşma tanıma hizmetindeki metin okuma özelliği 400'den fazla sesi ve 140'tan fazla dili ve çeşidi destekler. Listenin tamamını alabilir veya Ses Galerisi'nde deneyebilirsiniz.

Giriş metninizle eşleşecek SpeechConfig dilini veya sesini belirtin ve belirtilen sesi kullanın. Aşağıdaki kod parçacığı bu tekniğin nasıl çalıştığını gösterir:

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
    // Set either the `SpeechSynthesisVoiceName` or `SpeechSynthesisLanguage`.
    speechConfig.setSpeechSynthesisLanguage("en-US"); 
    speechConfig.setSpeechSynthesisVoiceName("en-US-AvaMultilingualNeural");
}

Tüm sinir sesleri çok dillidir ve kendi dillerinde ve İngilizcede akıcıdır. Örneğin, İngilizce giriş metni "Konuşmayı denemek için çok heyecanlıyım" ise ve öğesini seçerseniz es-ES-ElviraNeural, metin İspanyolca vurgulu İngilizce olarak konuşulur.

Ses, giriş metninin dilini konuşmazsa Konuşma hizmeti sentezlenmiş ses oluşturmaz. Desteklenen sinir seslerinin tam listesi için bkz . Konuşma hizmeti için dil ve ses desteği.

Not

Varsayılan ses, Ses Listesi API'sinden yerel ayar başına döndürülen ilk sestir.

Konuşan ses, öncelik sırasına göre aşağıdaki gibi belirlenir:

  • veya SpeechSynthesisLanguageseçeneğini ayarlamazsanızSpeechSynthesisVoiceName, için en-US varsayılan ses konuşarak ifade eder.
  • Yalnızca ayarını yaparsanız SpeechSynthesisLanguage, belirtilen yerel ayar için varsayılan ses konuşu.
  • Hem hem de SpeechSynthesisVoiceNameSpeechSynthesisLanguage ayarlandıysa, SpeechSynthesisLanguage ayar yoksayılır. Kullanarak SpeechSynthesisVoiceName belirttiğiniz ses, konuşmaları ifade eder.
  • Ses öğesi Konuşma Sentezi Biçimlendirme Dili (SSML) kullanılarak ayarlanırsa ve SpeechSynthesisVoiceNameSpeechSynthesisLanguage ayarları yoksayılır.

Konuşmayı dosyaya sentezle

Bir SpeechSynthesizer nesne oluşturun. Bu nesne metinleri konuşma dönüştürmelerine ve çıkışları hoparlörlere, dosyalara veya diğer çıkış akışlarına çalıştırır. SpeechSynthesizer parametre olarak kabul eder:

  • Önceki SpeechConfig adımda oluşturduğunuz nesne.
  • AudioConfig Çıkış sonuçlarının nasıl işleneceğini belirten bir nesne.
  1. AudioConfig Statik işlevi kullanarak fromWavFileOutput() çıkışı otomatik olarak bir .wav dosyasına yazmak için bir örnek oluşturun:

    public static void main(String[] args) {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
        AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");
    }
    
  2. Örnek oluşturma SpeechSynthesizer . Nesnenizi speechConfig ve audioConfig nesnesini parametre olarak geçirin. Konuşmayı sentezlemek ve dosyaya yazmak için bir metin dizesiyle komutunu çalıştırın SpeakText() .

    public static void main(String[] args) {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
        AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");
    
        SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
        speechSynthesizer.SpeakText("I'm excited to try text to speech");
    }
    

Programı çalıştırdığınızda, belirttiğiniz konuma yazılan sentezlenmiş bir .wav dosyası oluşturur. Bu sonuç, en temel kullanımın iyi bir örneğidir. Ardından, özel senaryolarla çalışmak için çıkışı özelleştirebilir ve çıkış yanıtını bellek içi akış olarak işleyebilirsiniz.

Hoparlör çıkışına sentezle

Metinden konuşmaya işleme ve sonuçlar hakkında daha fazla içgörü elde etmek isteyebilirsiniz. Örneğin, sentezleyicinin ne zaman başlayıp durduğu hakkında bilgi edinmek veya sentez sırasında karşılaşılan diğer olaylar hakkında bilgi edinmek isteyebilirsiniz.

Bir konuşmacı gibi geçerli etkin çıkış cihazına sentezlenmiş konuşma çıkışı yapmak için statik işlevi kullanarak fromDefaultSpeakerOutput() örneği AudioConfig açın. Bir örnek aşağıda verilmiştir:

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
    AudioConfig audioConfig = AudioConfig.fromDefaultSpeakerOutput();

    SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    speechSynthesizer.SpeakText("I'm excited to try text to speech");
}

Bellek içi akış olarak sonuç alma

Sonuçta elde edilen ses verilerini bir dosyaya doğrudan yazmak yerine bellek içi akış olarak kullanabilirsiniz. Bellek içi akışla özel davranışlar oluşturabilirsiniz:

  • Elde edilen bayt dizisini özel aşağı akış hizmetleri için aranabilir bir akış olarak soyutlar.
  • Sonucu diğer API'lerle veya hizmetlerle tümleştirin.
  • Ses verilerini değiştirin, özel .wav üst bilgileri yazın ve ilgili görevleri gerçekleştirin.

Bu değişikliği önceki örnekte yapabilirsiniz. İlk olarak, artan denetim için çıkış davranışını bu noktadan itibaren el ile yönettiğiniz için bloğu kaldırın AudioConfig . Ardından oluşturucuda için AudioConfig geçirin SpeechSynthesizernull.

Not

null önceki konuşmacı çıktı örneğinde yaptığınız gibi yerine için AudioConfiggeçiş, geçerli etkin çıkış cihazında sesi varsayılan olarak çalmaz.

Sonucu bir SpeechSynthesisResult değişkene kaydedin. İşlev, SpeechSynthesisResult.getAudioData() çıkış verilerinin bir byte [] örneğini döndürür. Bu byte [] örnekle el ile çalışabilir veya bellek içi akışı yönetmek için sınıfını kullanabilirsiniz AudioDataStream .

Bu örnekte, sonuçtan AudioDataStream.fromResult() bir akış almak için statik işlevini kullanın:

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
    SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, null);

    SpeechSynthesisResult result = speechSynthesizer.SpeakText("I'm excited to try text to speech");
    AudioDataStream stream = AudioDataStream.fromResult(result);
    System.out.print(stream.getStatus());
}

Bu noktada, sonuçta elde stream edilen nesneyi kullanarak herhangi bir özel davranışı uygulayabilirsiniz.

Ses biçimini özelleştirme

Aşağıdakiler dahil olmak üzere ses çıkış özniteliklerini özelleştirebilirsiniz:

  • Ses dosyası türü
  • Örnekleme hızı
  • Bit derinliği

Ses biçimini değiştirmek için nesnedeki setSpeechSynthesisOutputFormat()SpeechConfig işlevini kullanırsınız. Bu işlev SpeechSynthesisOutputFormat türünde bir enum örnek bekler. Çıkış biçimini seçmek için öğesini enum kullanın. Kullanılabilir biçimler için ses biçimleri listesine bakın.

Gereksinimlerinize bağlı olarak farklı dosya türleri için çeşitli seçenekler vardır. Tanımı gereği, gibi Raw24Khz16BitMonoPcm ham biçimler ses üst bilgileri içermez. Ham biçimleri yalnızca şu durumlardan birinde kullanın:

  • Aşağı akış uygulamanızın ham bir bit akışının kodunu çözebileceğini biliyorsunuz.
  • Bit derinliği, örnek hızı ve kanal sayısı gibi faktörlere göre el ile üst bilgiler oluşturmayı planlıyorsunuz.

Bu örnek, nesne üzerinde ayar SpeechSynthesisOutputFormatSpeechConfig yaparak yüksek aslına uygun RIFF biçimini Riff24Khz16BitMonoPcm belirtir. Önceki bölümdeki örneğe benzer şekilde, sonucun bellek içi akışını almak ve bunu bir dosyaya yazmak için kullanırsınız AudioDataStream .

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");

    // set the output format
    speechConfig.setSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm);

    SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, null);
    SpeechSynthesisResult result = speechSynthesizer.SpeakText("I'm excited to try text to speech");
    AudioDataStream stream = AudioDataStream.fromResult(result);
    stream.saveToWavFile("path/to/write/file.wav");
}

Programı çalıştırdığınızda, belirtilen yola bir .wav dosyası yazar.

Konuşma özelliklerini özelleştirmek için SSML kullanma

XML şemasından isteklerinizi göndererek metindeki ses perdesi, söyleniş, konuşma hızı, ses düzeyi ve diğer yönlerde ince ayar yapmak için SSML kullanabilirsiniz. Bu bölümde sesi değiştirme örneği gösterilmektedir. Daha fazla bilgi için SSML nasıl yapılır makalesine bakın.

Özelleştirme için SSML kullanmaya başlamak için sesi değiştiren küçük bir değişiklik yaparsınız.

  1. Kök proje dizininizde SSML yapılandırması için yeni bir XML dosyası oluşturun.

    <speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
      <voice name="en-US-AvaMultilingualNeural">
        When you're on the freeway, it's a good idea to use a GPS.
      </voice>
    </speak>
    

    Bu örnekte dosya ssml.xml. Kök öğe her zaman <speak>şeklindedir. Bir <voice> öğedeki metni kaydırmak, parametresini kullanarak sesi değiştirmenize name olanak tanır. Desteklenen sinir seslerinin tam listesi için bkz . Desteklenen diller.

  2. XML dosyanıza başvurmak için konuşma sentezi isteğini değiştirin. İstek çoğunlukla aynıdır. işlevini kullanmak SpeakText() yerine kullanırsınız SpeakSsml(). Bu işlev bir XML dizesi bekler, bu nedenle önce bir XML dosyasını yükleyip dize olarak döndürmek için bir işlev oluşturun:

    private static String xmlToString(String filePath) {
        File file = new File(filePath);
        StringBuilder fileContents = new StringBuilder((int)file.length());
    
        try (Scanner scanner = new Scanner(file)) {
            while(scanner.hasNextLine()) {
                fileContents.append(scanner.nextLine() + System.lineSeparator());
            }
            return fileContents.toString().trim();
        } catch (FileNotFoundException ex) {
            return "File not found.";
        }
    }
    

    Bu noktada, sonuç nesnesi önceki örneklerle tamamen aynıdır:

    public static void main(String[] args) {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
        SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, null);
    
        String ssml = xmlToString("ssml.xml");
        SpeechSynthesisResult result = speechSynthesizer.SpeakSsml(ssml);
        AudioDataStream stream = AudioDataStream.fromResult(result);
        stream.saveToWavFile("path/to/write/file.wav");
    }
    

Not

SSML kullanmadan sesi değiştirmek için özelliğini kullanarak SpeechConfig.setSpeechSynthesisVoiceName("en-US-AvaMultilingualNeural");açık SpeechConfig olarak ayarlayın.

Sentezleyici olaylarına abone olma

Metinden konuşmaya işleme ve sonuçlar hakkında daha fazla içgörü elde etmek isteyebilirsiniz. Örneğin, sentezleyicinin ne zaman başlayıp durduğu hakkında bilgi edinmek veya sentez sırasında karşılaşılan diğer olaylar hakkında bilgi edinmek isteyebilirsiniz.

Metin okuma için SpeechSynthesizer'ı kullanırken bu tablodaki olaylara abone olabilirsiniz:

Olay Açıklama Kullanım örneği
BookmarkReached Yer işaretine ulaşıldığını gösterir. Bir yer işaretine ulaşılan olayı tetikleyebilmek için SSML'de bir bookmark öğe gerekir. Bu olay, sentezin başlangıcı ile öğesi arasındaki çıkış sesinin bookmark geçen süresini raporlar. Olayın Text özelliği, yer işaretinin mark özniteliğinde ayarladığınız dize değeridir. Öğeler bookmark konuşulmuyor. Ses akışındaki her işaretçinin bookmark uzaklığını almak için SSML'ye özel işaretçiler eklemek için öğesini kullanabilirsiniz. bookmark öğesi, metin veya etiket dizisindeki belirli bir konuma başvurmak için kullanılabilir.
SynthesisCanceled Konuşma sentezinin iptal edildiğine dair sinyaller. Sentezin ne zaman iptal edildiğini doğrulayabilirsiniz.
SynthesisCompleted Konuşma sentezi tamamlandı sinyalleri. Sentezin ne zaman tamamladığını doğrulayabilirsiniz.
SynthesisStarted Konuşma sentezi başladığının sinyalleri. Sentezin ne zaman başladığını doğrulayabilirsiniz.
Synthesizing Konuşma sentezin devam ettiğinin sinyalleri. Bu olay, SDK Konuşma hizmetinden her ses öbek aldığında tetikler. Sentez devam ederken onaylayabilirsiniz.
VisemeReceived Bir viseme olayının alındığını gösterir. Visemeler genellikle gözlemlenen konuşmadaki önemli pozları temsil etmek için kullanılır. Önemli pozlar dudaklar, çene ve dilin belirli bir foneme üretmedeki konumunu içerir. Konuşma sesi yürütülürken bir karakterin yüzüne animasyon eklemek için visemes kullanabilirsiniz.
WordBoundary Bir sözcük sınırının alındığını gösterir. Bu olay her yeni konuşulan sözcüğün, noktalama işaretinin ve tümcenin başında oluşturulur. Olay, çıkış sesinin başından itibaren geçerli sözcüğün saat uzaklığını onay işaretleriyle bildirir. Bu olay ayrıca, konuşulmak üzere olan sözcüğün hemen öncesinde giriş metnindeki veya SSML'deki karakter konumunu bildirir. Bu olay genellikle metnin ve ilgili sesin göreli konumlarını almak için kullanılır. Yeni bir sözcük hakkında bilgi edinmek ve ardından zamanlamaya göre işlem yapmak isteyebilirsiniz. Örneğin, konuşulan sözcükleri ne zaman ve ne kadar süreyle vurgulayabileceğinize karar vermenize yardımcı olabilecek bilgiler alabilirsiniz.

Not

Çıkış ses verileri kullanılabilir hale geldikçe olaylar tetiklenir ve bu da çıkış cihazına kayıttan yürütmeden daha hızlıdır. Çağıranın akışı ve gerçek zamanlı olarak uygun şekilde eşitlemesi gerekir.

Konuşma sentezi için olaylara nasıl abone olunduğunu gösteren bir örnek aşağıda verilmiştır. Hızlı başlangıçtaki yönergeleri izleyebilirsiniz, ancak bu SpeechSynthesis.java dosyasının içeriğini aşağıdaki Java koduyla değiştirebilirsiniz:

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.*;

import java.util.Scanner;
import java.util.concurrent.ExecutionException;

public class SpeechSynthesis {
    // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
    private static String speechKey = System.getenv("SPEECH_KEY");
    private static String speechRegion = System.getenv("SPEECH_REGION");

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        SpeechConfig speechConfig = SpeechConfig.fromSubscription(speechKey, speechRegion);
        
        // Required for WordBoundary event sentences.
        speechConfig.setProperty(PropertyId.SpeechServiceResponse_RequestSentenceBoundary, "true");

        String speechSynthesisVoiceName = "en-US-AvaMultilingualNeural"; 
        
        String ssml = String.format("<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'>"
            .concat(String.format("<voice name='%s'>", speechSynthesisVoiceName))
            .concat("<mstts:viseme type='redlips_front'/>")
            .concat("The rainbow has seven colors: <bookmark mark='colors_list_begin'/>Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark='colors_list_end'/>.")
            .concat("</voice>")
            .concat("</speak>"));

        SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig);
        {
            // Subscribe to events

            speechSynthesizer.BookmarkReached.addEventListener((o, e) -> {
                System.out.println("BookmarkReached event:");
                System.out.println("\tAudioOffset: " + ((e.getAudioOffset() + 5000) / 10000) + "ms");
                System.out.println("\tText: " + e.getText());
            });

            speechSynthesizer.SynthesisCanceled.addEventListener((o, e) -> {
                System.out.println("SynthesisCanceled event");
            });

            speechSynthesizer.SynthesisCompleted.addEventListener((o, e) -> {
                SpeechSynthesisResult result = e.getResult();                
                byte[] audioData = result.getAudioData();
                System.out.println("SynthesisCompleted event:");
                System.out.println("\tAudioData: " + audioData.length + " bytes");
                System.out.println("\tAudioDuration: " + result.getAudioDuration());
                result.close();
            });
            
            speechSynthesizer.SynthesisStarted.addEventListener((o, e) -> {
                System.out.println("SynthesisStarted event");
            });

            speechSynthesizer.Synthesizing.addEventListener((o, e) -> {
                SpeechSynthesisResult result = e.getResult();
                byte[] audioData = result.getAudioData();
                System.out.println("Synthesizing event:");
                System.out.println("\tAudioData: " + audioData.length + " bytes");
                result.close();
            });

            speechSynthesizer.VisemeReceived.addEventListener((o, e) -> {
                System.out.println("VisemeReceived event:");
                System.out.println("\tAudioOffset: " + ((e.getAudioOffset() + 5000) / 10000) + "ms");
                System.out.println("\tVisemeId: " + e.getVisemeId());
            });

            speechSynthesizer.WordBoundary.addEventListener((o, e) -> {
                System.out.println("WordBoundary event:");
                System.out.println("\tBoundaryType: " + e.getBoundaryType());
                System.out.println("\tAudioOffset: " + ((e.getAudioOffset() + 5000) / 10000) + "ms");
                System.out.println("\tDuration: " + e.getDuration());
                System.out.println("\tText: " + e.getText());
                System.out.println("\tTextOffset: " + e.getTextOffset());
                System.out.println("\tWordLength: " + e.getWordLength());
            });

            // Synthesize the SSML
            System.out.println("SSML to synthesize:");
            System.out.println(ssml);
            SpeechSynthesisResult speechSynthesisResult = speechSynthesizer.SpeakSsmlAsync(ssml).get();

            if (speechSynthesisResult.getReason() == ResultReason.SynthesizingAudioCompleted) {
                System.out.println("SynthesizingAudioCompleted result");
            }
            else if (speechSynthesisResult.getReason() == ResultReason.Canceled) {
                SpeechSynthesisCancellationDetails cancellation = SpeechSynthesisCancellationDetails.fromResult(speechSynthesisResult);
                System.out.println("CANCELED: Reason=" + cancellation.getReason());

                if (cancellation.getReason() == CancellationReason.Error) {
                    System.out.println("CANCELED: ErrorCode=" + cancellation.getErrorCode());
                    System.out.println("CANCELED: ErrorDetails=" + cancellation.getErrorDetails());
                    System.out.println("CANCELED: Did you set the speech resource key and region values?");
                }
            }
        }
        speechSynthesizer.close();

        System.exit(0);
    }
}

GitHub'da daha fazla metin okuma örneği bulabilirsiniz.

Özel uç nokta kullanma

Özel uç nokta, metin okuma istekleri için kullanılan standart uç noktayla işlevsel olarak aynıdır.

Bir fark, Konuşma SDK'sı EndpointId aracılığıyla özel sesinizi kullanmak için belirtilmesi gerektiğidir. Metin okuma hızlı başlangıcıyla başlayıp kodu ve SpeechSynthesisVoiceNameile EndpointId güncelleştirebilirsiniz.

SpeechConfig speechConfig = SpeechConfig.fromSubscription(speechKey, speechRegion);
speechConfig.setSpeechSynthesisVoiceName("YourCustomVoiceName");
speechConfig.setEndpointId("YourEndpointId");

Konuşma Sentezi biçimlendirme dili (SSML) aracılığıyla özel bir ses kullanmak için, ses adı olarak model adını belirtin. Bu örnekte ses kullanılır YourCustomVoiceName .

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="YourCustomVoiceName">
        This is the text that is spoken. 
    </voice>
</speak>

Kapsayıcı çalıştırma ve kullanma

Konuşma kapsayıcıları, Konuşma SDK'sı ve Konuşma CLI'sı aracılığıyla erişilen websocket tabanlı sorgu uç noktası API'leri sağlar. Varsayılan olarak, Konuşma SDK'sı ve Konuşma CLI'sı genel Konuşma hizmetini kullanır. Kapsayıcıyı kullanmak için başlatma yöntemini değiştirmeniz gerekir. Anahtar ve bölge yerine kapsayıcı ana bilgisayar URL'si kullanın.

Kapsayıcılar hakkında daha fazla bilgi için bkz . Docker ile Konuşma kapsayıcılarını yükleme ve çalıştırma.

Başvuru belgeleri | Paketi (npm) | GitHub | Kitaplığı kaynak kodunda ek örnekler

Bu nasıl yapılır kılavuzunda, metinden konuşmaya sentez yapmaya yönelik yaygın tasarım desenlerini öğreneceksiniz.

Aşağıdaki alanlar hakkında daha fazla bilgi için bkz. Metin okuma nedir?

  • Yanıtları bellek içi akışlar olarak alma.
  • Çıkış örnek hızını ve bit hızını özelleştirme.
  • Konuşma Sentezi İşaretlemeyi Dili (SSML) kullanarak sentez istekleri gönderme.
  • Sinir seslerini kullanma.
  • Olaylara abone olma ve sonuçlar üzerinde işlem yapmak.

Sentez dilini ve sesini seçin

Konuşma tanıma hizmetindeki metin okuma özelliği 400'den fazla sesi ve 140'tan fazla dili ve çeşidi destekler. Listenin tamamını alabilir veya Ses Galerisi'nde deneyebilirsiniz.

Giriş metninizle eşleşecek dili veya sesini SpeechConfig belirtin ve belirtilen sesi kullanın:

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
    // Set either the `SpeechSynthesisVoiceName` or `SpeechSynthesisLanguage`.
    speechConfig.speechSynthesisLanguage = "en-US"; 
    speechConfig.speechSynthesisVoiceName = "en-US-AvaMultilingualNeural";
}

synthesizeSpeech();

Tüm sinir sesleri çok dillidir ve kendi dillerinde ve İngilizcede akıcıdır. Örneğin, İngilizce giriş metni "Konuşmayı denemek için çok heyecanlıyım" ise ve öğesini seçerseniz es-ES-ElviraNeural, metin İspanyolca vurgulu İngilizce olarak konuşulur.

Ses, giriş metninin dilini konuşmazsa Konuşma hizmeti sentezlenmiş ses oluşturmaz. Desteklenen sinir seslerinin tam listesi için bkz . Konuşma hizmeti için dil ve ses desteği.

Not

Varsayılan ses, Ses Listesi API'sinden yerel ayar başına döndürülen ilk sestir.

Konuşan ses, öncelik sırasına göre aşağıdaki gibi belirlenir:

  • veya SpeechSynthesisLanguageseçeneğini ayarlamazsanızSpeechSynthesisVoiceName, için en-US varsayılan ses konuşarak ifade eder.
  • Yalnızca ayarını yaparsanız SpeechSynthesisLanguage, belirtilen yerel ayar için varsayılan ses konuşu.
  • Hem hem de SpeechSynthesisVoiceNameSpeechSynthesisLanguage ayarlandıysa, SpeechSynthesisLanguage ayar yoksayılır. Konuşmaları kullanarak SpeechSynthesisVoiceName belirttiğiniz ses.
  • Ses öğesi Konuşma Sentezi Biçimlendirme Dili (SSML) kullanılarak ayarlanırsa ve SpeechSynthesisVoiceNameSpeechSynthesisLanguage ayarları yoksayılır.

Metni konuşmaya sentezle

Bir konuşmacı gibi geçerli etkin çıkış cihazına sentezlenmiş konuşma çıkışı yapmak için statik işlevi kullanarak fromDefaultSpeakerOutput() örneği AudioConfig açın. Bir örnek aşağıda verilmiştir:

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
    const audioConfig = sdk.AudioConfig.fromDefaultSpeakerOutput();

    const speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    speechSynthesizer.speakTextAsync(
        "I'm excited to try text to speech",
        result => {
            if (result) {
                speechSynthesizer.close();
                return result.audioData;
            }
        },
        error => {
            console.log(error);
            speechSynthesizer.close();
        });
}

Programı çalıştırdığınızda, sentezlenmiş ses hoparlörden çalınabilir. Bu sonuç, en temel kullanımın iyi bir örneğidir. Ardından, çıkışı özelleştirebilir ve çıkış yanıtını özel senaryolarla çalışmak için bellek içi akış olarak işleyebilirsiniz.

Bellek içi akış olarak sonuç alma

Sonuçta elde edilen ses verilerini bir dosyaya doğrudan yazmak yerine bellek içi akış olarak kullanabilirsiniz. Bellek içi akışla özel davranışlar oluşturabilirsiniz:

  • Elde edilen bayt dizisini özel aşağı akış hizmetleri için aranabilir bir akış olarak soyutlar.
  • Sonucu diğer API'lerle veya hizmetlerle tümleştirin.
  • Ses verilerini değiştirin, özel .wav üst bilgiler yazın ve ilgili görevleri gerçekleştirin.

Bu değişikliği önceki örnekte yapabilirsiniz. AudioConfig Artan denetim için çıkış davranışını bu noktadan itibaren el ile yönettiğinizden bloğu kaldırın. Ardından oluşturucuda için AudioConfig geçirin SpeechSynthesizernull.

Not

null önceki konuşmacı çıktı örneğinde yaptığınız gibi yerine için AudioConfiggeçiş, geçerli etkin çıkış cihazında sesi varsayılan olarak çalmaz.

Sonucu bir SpeechSynthesisResult değişkenine kaydedin. SpeechSynthesisResult.audioData özelliği, varsayılan tarayıcı akış türü olan çıktı verilerinin değerini ArrayBuffer döndürür. Sunucu tarafı kodu için arabellek akışına dönüştürün ArrayBuffer .

aşağıdaki kod istemci tarafında çalışır:

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
    const speechSynthesizer = new sdk.SpeechSynthesizer(speechConfig);

    speechSynthesizer.speakTextAsync(
        "I'm excited to try text to speech",
        result => {
            speechSynthesizer.close();
            return result.audioData;
        },
        error => {
            console.log(error);
            speechSynthesizer.close();
        });
}

Sonuçta elde ArrayBuffer edilen nesneyi kullanarak herhangi bir özel davranışı uygulayabilirsiniz. ArrayBuffer bir tarayıcıda almak ve bu biçimde oynamak için yaygın bir türdür.

Sunucu tabanlı herhangi bir kod için verilerle akış olarak çalışmanız gerekiyorsa, nesneyi bir akışa ArrayBuffer dönüştürmeniz gerekir:

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
    const speechSynthesizer = new sdk.SpeechSynthesizer(speechConfig);

    speechSynthesizer.speakTextAsync(
        "I'm excited to try text to speech",
        result => {
            const { audioData } = result;

            speechSynthesizer.close();

            // convert arrayBuffer to stream
            // return stream
            const bufferStream = new PassThrough();
            bufferStream.end(Buffer.from(audioData));
            return bufferStream;
        },
        error => {
            console.log(error);
            speechSynthesizer.close();
        });
}

Ses biçimini özelleştirme

Aşağıdakiler dahil olmak üzere ses çıkış özniteliklerini özelleştirebilirsiniz:

  • Ses dosyası türü
  • Örnekleme hızı
  • Bit derinliği

Ses biçimini değiştirmek için nesnedeki speechSynthesisOutputFormatSpeechConfig özelliğini kullanın. Bu özellik SpeechSynthesisOutputFormat türünde bir enum örnek bekler. Çıkış biçimini seçmek için öğesini enum kullanın. Kullanılabilir biçimler için ses biçimleri listesine bakın.

Gereksinimlerinize bağlı olarak farklı dosya türleri için çeşitli seçenekler vardır. Tanımı gereği, gibi Raw24Khz16BitMonoPcm ham biçimler ses üst bilgileri içermez. Ham biçimleri yalnızca şu durumlardan birinde kullanın:

  • Aşağı akış uygulamanızın ham bir bit akışının kodunu çözebileceğini biliyorsunuz.
  • Bit derinliği, örnek hızı ve kanal sayısı gibi faktörlere göre el ile üst bilgiler oluşturmayı planlıyorsunuz.

Bu örnek, nesne üzerinde ayar speechSynthesisOutputFormatSpeechConfig yaparak yüksek aslına uygun RIFF biçimini Riff24Khz16BitMonoPcm belirtir. Önceki bölümdeki örneğe benzer şekilde, ses ArrayBuffer verilerini alın ve bu verilerle etkileşim kurun.

function synthesizeSpeech() {
    const speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");

    // Set the output format
    speechConfig.speechSynthesisOutputFormat = sdk.SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm;

    const speechSynthesizer = new sdk.SpeechSynthesizer(speechConfig, null);
    speechSynthesizer.speakTextAsync(
        "I'm excited to try text to speech",
        result => {
            // Interact with the audio ArrayBuffer data
            const audioData = result.audioData;
            console.log(`Audio data byte size: ${audioData.byteLength}.`)

            speechSynthesizer.close();
        },
        error => {
            console.log(error);
            speechSynthesizer.close();
        });
}

Konuşma özelliklerini özelleştirmek için SSML kullanma

XML şemasından isteklerinizi göndererek metindeki ses perdesi, söyleniş, konuşma hızı, ses düzeyi ve diğer yönlerde ince ayar yapmak için SSML kullanabilirsiniz. Bu bölümde sesi değiştirme örneği gösterilmektedir. Daha fazla bilgi için bkz . Konuşma Sentezi biçimlendirme diline genel bakış.

Özelleştirme için SSML kullanmaya başlamak için sesi değiştiren küçük bir değişiklik yaparsınız.

  1. Kök proje dizininizde SSML yapılandırması için yeni bir XML dosyası oluşturun.

    <speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
      <voice name="en-US-AvaMultilingualNeural">
        When you're on the freeway, it's a good idea to use a GPS.
      </voice>
    </speak>
    

    Bu örnekte ssml.xml. Kök öğe her zaman <speak>şeklindedir. Bir <voice> öğedeki metni kaydırmak, parametresini kullanarak sesi değiştirmenize name olanak tanır. Desteklenen sinir seslerinin tam listesi için bkz . Desteklenen diller.

  2. XML dosyanıza başvurmak için konuşma sentezi isteğini değiştirin. İstek çoğunlukla aynıdır, ancak işlevini kullanmak speakTextAsync() yerine kullanırsınız speakSsmlAsync(). Bu işlev bir XML dizesi bekler. XML dosyasını yüklemek ve dize olarak döndürmek için bir işlev oluşturun:

    function xmlToString(filePath) {
        const xml = readFileSync(filePath, "utf8");
        return xml;
    }
    

    hakkında readFileSyncdaha fazla bilgi için bkz . Node.js dosya sistemi.

    Sonuç nesnesi, önceki örneklerle tamamen aynıdır:

    function synthesizeSpeech() {
        const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
        const speechSynthesizer = new sdk.SpeechSynthesizer(speechConfig, null);
    
        const ssml = xmlToString("ssml.xml");
        speechSynthesizer.speakSsmlAsync(
            ssml,
            result => {
                if (result.errorDetails) {
                    console.error(result.errorDetails);
                } else {
                    console.log(JSON.stringify(result));
                }
    
                speechSynthesizer.close();
            },
            error => {
                console.log(error);
                speechSynthesizer.close();
            });
    }
    

Not

SSML kullanmadan sesi değiştirmek için özelliğini kullanarak SpeechConfig.speechSynthesisVoiceName = "en-US-AvaMultilingualNeural";üzerinde SpeechConfig ayarlayabilirsiniz.

Sentezleyici olaylarına abone olma

Metinden konuşmaya işleme ve sonuçlar hakkında daha fazla içgörü elde etmek isteyebilirsiniz. Örneğin, sentezleyicinin ne zaman başlayıp durduğu hakkında bilgi edinmek veya sentez sırasında karşılaşılan diğer olaylar hakkında bilgi edinmek isteyebilirsiniz.

Metin okuma için SpeechSynthesizer'ı kullanırken bu tablodaki olaylara abone olabilirsiniz:

Olay Açıklama Kullanım örneği
BookmarkReached Yer işaretine ulaşıldığını gösterir. Bir yer işaretine ulaşılan olayı tetikleyebilmek için SSML'de bir bookmark öğe gerekir. Bu olay, sentezin başlangıcı ile öğesi arasındaki çıkış sesinin bookmark geçen süresini raporlar. Olayın Text özelliği, yer işaretinin mark özniteliğinde ayarladığınız dize değeridir. Öğeler bookmark konuşulmuyor. Ses akışındaki her işaretçinin bookmark uzaklığını almak için SSML'ye özel işaretçiler eklemek için öğesini kullanabilirsiniz. bookmark öğesi, metin veya etiket dizisindeki belirli bir konuma başvurmak için kullanılabilir.
SynthesisCanceled Konuşma sentezinin iptal edildiğine dair sinyaller. Sentezin ne zaman iptal edildiğini doğrulayabilirsiniz.
SynthesisCompleted Konuşma sentezi tamamlandı sinyalleri. Sentezin ne zaman tamamladığını doğrulayabilirsiniz.
SynthesisStarted Konuşma sentezi başladığının sinyalleri. Sentezin ne zaman başladığını doğrulayabilirsiniz.
Synthesizing Konuşma sentezin devam ettiğinin sinyalleri. Bu olay, SDK Konuşma hizmetinden her ses öbek aldığında tetikler. Sentez devam ederken onaylayabilirsiniz.
VisemeReceived Bir viseme olayının alındığını gösterir. Visemeler genellikle gözlemlenen konuşmadaki önemli pozları temsil etmek için kullanılır. Önemli pozlar dudaklar, çene ve dilin belirli bir foneme üretmedeki konumunu içerir. Konuşma sesi yürütülürken bir karakterin yüzüne animasyon eklemek için visemes kullanabilirsiniz.
WordBoundary Bir sözcük sınırının alındığını gösterir. Bu olay her yeni konuşulan sözcüğün, noktalama işaretinin ve tümcenin başında oluşturulur. Olay, çıkış sesinin başından itibaren geçerli sözcüğün saat uzaklığını onay işaretleriyle bildirir. Bu olay ayrıca, konuşulmak üzere olan sözcüğün hemen öncesinde giriş metnindeki veya SSML'deki karakter konumunu bildirir. Bu olay genellikle metnin ve ilgili sesin göreli konumlarını almak için kullanılır. Yeni bir sözcük hakkında bilgi edinmek ve ardından zamanlamaya göre işlem yapmak isteyebilirsiniz. Örneğin, konuşulan sözcükleri ne zaman ve ne kadar süreyle vurgulayabileceğinize karar vermenize yardımcı olabilecek bilgiler alabilirsiniz.

Not

Çıkış ses verileri kullanılabilir hale geldikçe olaylar tetiklenir ve bu da çıkış cihazına kayıttan yürütmeden daha hızlıdır. Çağıranın akışı ve gerçek zamanlı olarak uygun şekilde eşitlemesi gerekir.

Konuşma sentezi için olaylara nasıl abone olunduğunu gösteren bir örnek aşağıda verilmiştır. Hızlı başlangıçtaki yönergeleri izleyebilirsiniz, ancak bu SpeechSynthesis.js dosyasının içeriğini aşağıdaki JavaScript koduyla değiştirebilirsiniz.

(function() {

    "use strict";

    var sdk = require("microsoft-cognitiveservices-speech-sdk");

    var audioFile = "YourAudioFile.wav";
    // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
    const speechConfig = sdk.SpeechConfig.fromSubscription(process.env.SPEECH_KEY, process.env.SPEECH_REGION);
    const audioConfig = sdk.AudioConfig.fromAudioFileOutput(audioFile);

    var speechSynthesisVoiceName  = "en-US-AvaMultilingualNeural";  
    var ssml = `<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'> \r\n \
        <voice name='${speechSynthesisVoiceName}'> \r\n \
            <mstts:viseme type='redlips_front'/> \r\n \
            The rainbow has seven colors: <bookmark mark='colors_list_begin'/>Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark='colors_list_end'/>. \r\n \
        </voice> \r\n \
    </speak>`;
    
    // Required for WordBoundary event sentences.
    speechConfig.setProperty(sdk.PropertyId.SpeechServiceResponse_RequestSentenceBoundary, "true");

    // Create the speech speechSynthesizer.
    var speechSynthesizer = new sdk.SpeechSynthesizer(speechConfig, audioConfig);

    speechSynthesizer.bookmarkReached = function (s, e) {
        var str = `BookmarkReached event: \
            \r\n\tAudioOffset: ${(e.audioOffset + 5000) / 10000}ms \
            \r\n\tText: \"${e.text}\".`;
        console.log(str);
    };

    speechSynthesizer.synthesisCanceled = function (s, e) {
        console.log("SynthesisCanceled event");
    };
    
    speechSynthesizer.synthesisCompleted = function (s, e) {
        var str = `SynthesisCompleted event: \
                    \r\n\tAudioData: ${e.result.audioData.byteLength} bytes \
                    \r\n\tAudioDuration: ${e.result.audioDuration}`;
        console.log(str);
    };

    speechSynthesizer.synthesisStarted = function (s, e) {
        console.log("SynthesisStarted event");
    };

    speechSynthesizer.synthesizing = function (s, e) {
        var str = `Synthesizing event: \
            \r\n\tAudioData: ${e.result.audioData.byteLength} bytes`;
        console.log(str);
    };
    
    speechSynthesizer.visemeReceived = function(s, e) {
        var str = `VisemeReceived event: \
            \r\n\tAudioOffset: ${(e.audioOffset + 5000) / 10000}ms \
            \r\n\tVisemeId: ${e.visemeId}`;
        console.log(str);
    };

    speechSynthesizer.wordBoundary = function (s, e) {
        // Word, Punctuation, or Sentence
        var str = `WordBoundary event: \
            \r\n\tBoundaryType: ${e.boundaryType} \
            \r\n\tAudioOffset: ${(e.audioOffset + 5000) / 10000}ms \
            \r\n\tDuration: ${e.duration} \
            \r\n\tText: \"${e.text}\" \
            \r\n\tTextOffset: ${e.textOffset} \
            \r\n\tWordLength: ${e.wordLength}`;
        console.log(str);
    };

    // Synthesize the SSML
    console.log(`SSML to synthesize: \r\n ${ssml}`)
    console.log(`Synthesize to: ${audioFile}`);
    speechSynthesizer.speakSsmlAsync(ssml,
        function (result) {
      if (result.reason === sdk.ResultReason.SynthesizingAudioCompleted) {
        console.log("SynthesizingAudioCompleted result");
      } else {
        console.error("Speech synthesis canceled, " + result.errorDetails +
            "\nDid you set the speech resource key and region values?");
      }
      speechSynthesizer.close();
      speechSynthesizer = null;
    },
        function (err) {
      console.trace("err - " + err);
      speechSynthesizer.close();
      speechSynthesizer = null;
    });
}());

GitHub'da daha fazla metin okuma örneği bulabilirsiniz.

Kapsayıcı çalıştırma ve kullanma

Konuşma kapsayıcıları, Konuşma SDK'sı ve Konuşma CLI'sı aracılığıyla erişilen websocket tabanlı sorgu uç noktası API'leri sağlar. Varsayılan olarak, Konuşma SDK'sı ve Konuşma CLI'sı genel Konuşma hizmetini kullanır. Kapsayıcıyı kullanmak için başlatma yöntemini değiştirmeniz gerekir. Anahtar ve bölge yerine kapsayıcı ana bilgisayar URL'si kullanın.

Kapsayıcılar hakkında daha fazla bilgi için bkz . Docker ile Konuşma kapsayıcılarını yükleme ve çalıştırma.

Başvuru belgeleri | Paketi (İndir) | GitHub'da Ek Örnekler

Bu nasıl yapılır kılavuzunda, metinden konuşmaya sentez yapmaya yönelik yaygın tasarım desenlerini öğreneceksiniz.

Aşağıdaki alanlar hakkında daha fazla bilgi için bkz. Metin okuma nedir?

  • Yanıtları bellek içi akışlar olarak alma.
  • Çıkış örnek hızını ve bit hızını özelleştirme.
  • Konuşma Sentezi İşaretlemeyi Dili (SSML) kullanarak sentez istekleri gönderme.
  • Sinir seslerini kullanma.
  • Olaylara abone olma ve sonuçlar üzerinde işlem yapmak.

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.
  • Azure portalında konuşma kaynağı oluşturun.
  • Konuşma kaynak anahtarınız ve bölgeniz. Konuşma kaynağınız dağıtıldıktan sonra anahtarları görüntülemek ve yönetmek için Kaynağa git'i seçin. Azure AI hizmetleri kaynakları hakkında daha fazla bilgi için bkz . Kaynağınızın anahtarlarını alma.

Konuşma SDK'sını ve örneklerini yükleme

Azure-Samples/cognitive-services-speech-sdk deposu, iOS ve Mac için Objective-C dilinde yazılmış örnekler içerir. Her örneğe ilişkin yükleme yönergelerini görmek için bir bağlantı seçin:

Özel uç nokta kullanma

Özel uç nokta, metin okuma istekleri için kullanılan standart uç noktayla işlevsel olarak aynıdır.

Bir fark, Konuşma SDK'sı EndpointId aracılığıyla özel sesinizi kullanmak için belirtilmesi gerektiğidir. Metin okuma hızlı başlangıcıyla başlayıp kodu ve SpeechSynthesisVoiceNameile EndpointId güncelleştirebilirsiniz.

SPXSpeechConfiguration *speechConfig = [[SPXSpeechConfiguration alloc] initWithSubscription:speechKey region:speechRegion];
speechConfig.speechSynthesisVoiceName = @"YourCustomVoiceName";
speechConfig.EndpointId = @"YourEndpointId";

Konuşma Sentezi biçimlendirme dili (SSML) aracılığıyla özel bir ses kullanmak için, ses adı olarak model adını belirtin. Bu örnekte ses kullanılır YourCustomVoiceName .

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="YourCustomVoiceName">
        This is the text that is spoken. 
    </voice>
</speak>

Kapsayıcı çalıştırma ve kullanma

Konuşma kapsayıcıları, Konuşma SDK'sı ve Konuşma CLI'sı aracılığıyla erişilen websocket tabanlı sorgu uç noktası API'leri sağlar. Varsayılan olarak, Konuşma SDK'sı ve Konuşma CLI'sı genel Konuşma hizmetini kullanır. Kapsayıcıyı kullanmak için başlatma yöntemini değiştirmeniz gerekir. Anahtar ve bölge yerine kapsayıcı ana bilgisayar URL'si kullanın.

Kapsayıcılar hakkında daha fazla bilgi için bkz . Docker ile Konuşma kapsayıcılarını yükleme ve çalıştırma.

Başvuru belgeleri | Paketi (İndir) | GitHub'da Ek Örnekler

Bu nasıl yapılır kılavuzunda, metinden konuşmaya sentez yapmaya yönelik yaygın tasarım desenlerini öğreneceksiniz.

Aşağıdaki alanlar hakkında daha fazla bilgi için bkz. Metin okuma nedir?

  • Yanıtları bellek içi akışlar olarak alma.
  • Çıkış örnek hızını ve bit hızını özelleştirme.
  • Konuşma Sentezi İşaretlemeyi Dili (SSML) kullanarak sentez istekleri gönderme.
  • Sinir seslerini kullanma.
  • Olaylara abone olma ve sonuçlar üzerinde işlem yapmak.

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.
  • Azure portalında konuşma kaynağı oluşturun.
  • Konuşma kaynak anahtarınız ve bölgeniz. Konuşma kaynağınız dağıtıldıktan sonra anahtarları görüntülemek ve yönetmek için Kaynağa git'i seçin. Azure AI hizmetleri kaynakları hakkında daha fazla bilgi için bkz . Kaynağınızın anahtarlarını alma.

Konuşma SDK'sını ve örneklerini yükleme

Azure-Samples/cognitive-services-speech-sdk deposu, iOS ve Mac için Swift dilinde yazılmış örnekler içerir. Her örneğe ilişkin yükleme yönergelerini görmek için bir bağlantı seçin:

Kapsayıcı çalıştırma ve kullanma

Konuşma kapsayıcıları, Konuşma SDK'sı ve Konuşma CLI'sı aracılığıyla erişilen websocket tabanlı sorgu uç noktası API'leri sağlar. Varsayılan olarak, Konuşma SDK'sı ve Konuşma CLI'sı genel Konuşma hizmetini kullanır. Kapsayıcıyı kullanmak için başlatma yöntemini değiştirmeniz gerekir. Anahtar ve bölge yerine kapsayıcı ana bilgisayar URL'si kullanın.

Kapsayıcılar hakkında daha fazla bilgi için bkz . Docker ile Konuşma kapsayıcılarını yükleme ve çalıştırma.

GitHub'da Başvuru belgeleri | Paketi (PyPi) | Ek Örnekler

Bu nasıl yapılır kılavuzunda, metinden konuşmaya sentez yapmaya yönelik yaygın tasarım desenlerini öğreneceksiniz.

Aşağıdaki alanlar hakkında daha fazla bilgi için bkz. Metin okuma nedir?

  • Yanıtları bellek içi akışlar olarak alma.
  • Çıkış örnek hızını ve bit hızını özelleştirme.
  • Konuşma Sentezi İşaretlemeyi Dili (SSML) kullanarak sentez istekleri gönderme.
  • Sinir seslerini kullanma.
  • Olaylara abone olma ve sonuçlar üzerinde işlem yapmak.

Sentez dilini ve sesini seçin

Konuşma tanıma hizmetindeki metin okuma özelliği 400'den fazla sesi ve 140'tan fazla dili ve çeşidi destekler. Listenin tamamını alabilir veya Ses Galerisi'nde deneyebilirsiniz.

Giriş metninizle eşleşecek dili veya sesini SpeechConfig belirtin ve belirtilen sesi kullanın:

# Set either the `SpeechSynthesisVoiceName` or `SpeechSynthesisLanguage`.
speech_config.speech_synthesis_language = "en-US" 
speech_config.speech_synthesis_voice_name ="en-US-AvaMultilingualNeural"

Tüm sinir sesleri çok dillidir ve kendi dillerinde ve İngilizcede akıcıdır. Örneğin, İngilizce giriş metni "Konuşmayı denemek için çok heyecanlıyım" ise ve öğesini seçerseniz es-ES-ElviraNeural, metin İspanyolca vurgulu İngilizce olarak konuşulur.

Ses, giriş metninin dilini konuşmazsa Konuşma hizmeti sentezlenmiş ses oluşturmaz. Desteklenen sinir seslerinin tam listesi için bkz . Konuşma hizmeti için dil ve ses desteği.

Not

Varsayılan ses, Ses Listesi API'sinden yerel ayar başına döndürülen ilk sestir.

Konuşan ses, öncelik sırasına göre aşağıdaki gibi belirlenir:

  • veya SpeechSynthesisLanguageseçeneğini ayarlamazsanızSpeechSynthesisVoiceName, için en-US varsayılan ses konuşarak ifade eder.
  • Yalnızca ayarını yaparsanız SpeechSynthesisLanguage, belirtilen yerel ayar için varsayılan ses konuşu.
  • Hem hem de SpeechSynthesisVoiceNameSpeechSynthesisLanguage ayarlandıysa, SpeechSynthesisLanguage ayar yoksayılır. Konuşmaları kullanarak SpeechSynthesisVoiceName belirttiğiniz ses.
  • Ses öğesi Konuşma Sentezi Biçimlendirme Dili (SSML) kullanılarak ayarlanırsa ve SpeechSynthesisVoiceNameSpeechSynthesisLanguage ayarları yoksayılır.

Konuşmayı dosyaya sentezle

SpeechSynthesizer nesnesi oluşturun. Bu nesne metinleri konuşma dönüştürmelerine ve çıkışları hoparlörlere, dosyalara veya diğer çıkış akışlarına çalıştırır. SpeechSynthesizer parametre olarak kabul eder:

  1. AudioOutputConfig Oluşturucu parametresini kullanarak filename çıktıyı otomatik olarak bir .wav dosyasına yazmak için bir örnek oluşturun:

    audio_config = speechsdk.audio.AudioOutputConfig(filename="path/to/write/file.wav")
    
  2. SpeechSynthesizer Nesnenizi speech_config ve audio_config nesnesini parametre olarak geçirerek örneğinizi belirleyin. Konuşmayı sentezlemek ve dosyaya yazmak için bir metin dizesiyle komutunu çalıştırın speak_text_async() .

    speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
    speech_synthesizer.speak_text_async("I'm excited to try text to speech")
    

Programı çalıştırdığınızda, belirttiğiniz konuma yazılan sentezlenmiş bir .wav dosyası oluşturur. Bu sonuç, en temel kullanımın iyi bir örneğidir. Ardından, özel senaryolarla çalışmak için çıkışı özelleştirebilir ve çıkış yanıtını bellek içi akış olarak işleyebilirsiniz.

Hoparlör çıkışına sentezle

Sentezlenmiş konuşmanın çıkışını konuşmacı gibi geçerli etkin çıkış cihazına göndermek için örneği oluştururken parametresini AudioOutputConfig ayarlayınuse_default_speaker. Bir örnek aşağıda verilmiştir:

audio_config = speechsdk.audio.AudioOutputConfig(use_default_speaker=True)

Bellek içi akış olarak sonuç alma

Sonuçta elde edilen ses verilerini bir dosyaya doğrudan yazmak yerine bellek içi akış olarak kullanabilirsiniz. Bellek içi akışla özel davranışlar oluşturabilirsiniz:

  • Elde edilen bayt dizisini özel aşağı akış hizmetleri için aranabilir bir akış olarak soyutlar.
  • Sonucu diğer API'lerle veya hizmetlerle tümleştirin.
  • Ses verilerini değiştirin, özel .wav üst bilgileri yazın ve ilgili görevleri gerçekleştirin.

Bu değişikliği önceki örnekte yapabilirsiniz. İlk olarak, daha fazla denetim için çıkış davranışını bu noktadan itibaren el ile yönettiğinizden öğesini kaldırın AudioConfig. Oluşturucuda SpeechSynthesizer değerini AudioConfig geçirinNone.

Not

None önceki konuşmacı çıktı örneğinde yaptığınız gibi yerine için AudioConfiggeçiş, geçerli etkin çıkış cihazında sesi varsayılan olarak çalmaz.

Sonucu bir SpeechSynthesisResult değişkene kaydedin. özelliği, audio_data çıkış verilerinin bir bytes nesnesini içerir. Bu nesneyle el ile çalışabilir veya bellek içi akışı yönetmek için sınıfını kullanabilirsiniz AudioDataStream .

Bu örnekte, sonuçtan AudioDataStream bir akış almak için oluşturucuyu kullanın:

speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=None)
result = speech_synthesizer.speak_text_async("I'm excited to try text to speech").get()
stream = AudioDataStream(result)

Bu noktada, sonuçta elde stream edilen nesneyi kullanarak herhangi bir özel davranışı uygulayabilirsiniz.

Ses biçimini özelleştirme

Aşağıdakiler dahil olmak üzere ses çıkış özniteliklerini özelleştirebilirsiniz:

  • Ses dosyası türü
  • Örnekleme hızı
  • Bit derinliği

Ses biçimini değiştirmek için nesnedeki set_speech_synthesis_output_format()SpeechConfig işlevini kullanın. Bu işlev SpeechSynthesisOutputFormat türünde bir enum örnek bekler. Çıkış biçimini seçmek için öğesini enum kullanın. Kullanılabilir biçimler için ses biçimleri listesine bakın.

Gereksinimlerinize bağlı olarak farklı dosya türleri için çeşitli seçenekler vardır. Tanımı gereği, gibi Raw24Khz16BitMonoPcm ham biçimler ses üst bilgileri içermez. Ham biçimleri yalnızca şu durumlardan birinde kullanın:

  • Aşağı akış uygulamanızın ham bir bit akışının kodunu çözebileceğini biliyorsunuz.
  • Bit derinliği, örnek hızı ve kanal sayısı gibi faktörlere göre el ile üst bilgiler oluşturmayı planlıyorsunuz.

Bu örnek, nesne üzerinde ayar SpeechSynthesisOutputFormatSpeechConfig yaparak yüksek aslına uygun RIFF biçimini Riff24Khz16BitMonoPcm belirtir. Önceki bölümdeki örneğe benzer şekilde, sonucun bellek içi akışını almak ve bunu bir dosyaya yazmak için kullanırsınız AudioDataStream .

speech_config.set_speech_synthesis_output_format(speechsdk.SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm)
speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=None)

result = speech_synthesizer.speak_text_async("I'm excited to try text to speech").get()
stream = speechsdk.AudioDataStream(result)
stream.save_to_wav_file("path/to/write/file.wav")

Programı çalıştırdığınızda, belirtilen yola bir .wav dosyası yazar.

Konuşma özelliklerini özelleştirmek için SSML kullanma

XML şemasından isteklerinizi göndererek metindeki ses perdesi, söyleniş, konuşma hızı, ses düzeyi ve diğer yönlerde ince ayar yapmak için SSML kullanabilirsiniz. Bu bölümde sesi değiştirme örneği gösterilmektedir. Daha fazla bilgi için bkz . Konuşma Sentezi biçimlendirme diline genel bakış.

Özelleştirme için SSML kullanmaya başlamak için sesi değiştiren küçük bir değişiklik yapın.

  1. Kök proje dizininizde SSML yapılandırması için yeni bir XML dosyası oluşturun.

    <speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
      <voice name="en-US-AvaMultilingualNeural">
        When you're on the freeway, it's a good idea to use a GPS.
      </voice>
    </speak>
    

    Bu örnekte dosya ssml.xml. Kök öğe her zaman <speak>şeklindedir. Bir <voice> öğedeki metni kaydırmak, parametresini kullanarak sesi değiştirmenize name olanak tanır. Desteklenen sinir seslerinin tam listesi için bkz . Desteklenen diller.

  2. XML dosyanıza başvurmak için konuşma sentezi isteğini değiştirin. İstek çoğunlukla aynıdır. işlevini kullanmak speak_text_async() yerine kullanın speak_ssml_async(). Bu işlev bir XML dizesi bekler. İlk olarak SSML yapılandırmanızı dize olarak okuyun. Bu noktadan itibaren sonuç nesnesi önceki örneklerle tamamen aynıdır.

    Not

    ssml_string Dizenin başında öğesini içeriyorsa, ürün reçetesi biçimini çıkarmanız gerekir, aksi takdirde hizmet bir hata döndürür. Parametresini encoding aşağıdaki gibi ayarlayarak bunu yaparsınız: open("ssml.xml", "r", encoding="utf-8-sig").

    speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=None)
    
    ssml_string = open("ssml.xml", "r").read()
    result = speech_synthesizer.speak_ssml_async(ssml_string).get()
    
    stream = speechsdk.AudioDataStream(result)
    stream.save_to_wav_file("path/to/write/file.wav")
    

Not

SSML kullanmadan sesi değiştirmek için özelliğini kullanarak speech_config.speech_synthesis_voice_name = "en-US-AvaMultilingualNeural"üzerinde SpeechConfig ayarlayabilirsiniz.

Sentezleyici olaylarına abone olma

Metinden konuşmaya işleme ve sonuçlar hakkında daha fazla içgörü elde etmek isteyebilirsiniz. Örneğin, sentezleyicinin ne zaman başlayıp durduğu hakkında bilgi edinmek veya sentez sırasında karşılaşılan diğer olaylar hakkında bilgi edinmek isteyebilirsiniz.

Metin okuma için SpeechSynthesizer'ı kullanırken bu tablodaki olaylara abone olabilirsiniz:

Olay Açıklama Kullanım örneği
BookmarkReached Yer işaretine ulaşıldığını gösterir. Bir yer işaretine ulaşılan olayı tetikleyebilmek için SSML'de bir bookmark öğe gerekir. Bu olay, sentezin başlangıcı ile öğesi arasındaki çıkış sesinin bookmark geçen süresini raporlar. Olayın Text özelliği, yer işaretinin mark özniteliğinde ayarladığınız dize değeridir. Öğeler bookmark konuşulmuyor. Ses akışındaki her işaretçinin bookmark uzaklığını almak için SSML'ye özel işaretçiler eklemek için öğesini kullanabilirsiniz. bookmark öğesi, metin veya etiket dizisindeki belirli bir konuma başvurmak için kullanılabilir.
SynthesisCanceled Konuşma sentezinin iptal edildiğine dair sinyaller. Sentezin ne zaman iptal edildiğini doğrulayabilirsiniz.
SynthesisCompleted Konuşma sentezi tamamlandı sinyalleri. Sentezin ne zaman tamamladığını doğrulayabilirsiniz.
SynthesisStarted Konuşma sentezi başladığının sinyalleri. Sentezin ne zaman başladığını doğrulayabilirsiniz.
Synthesizing Konuşma sentezin devam ettiğinin sinyalleri. Bu olay, SDK Konuşma hizmetinden her ses öbek aldığında tetikler. Sentez devam ederken onaylayabilirsiniz.
VisemeReceived Bir viseme olayının alındığını gösterir. Visemeler genellikle gözlemlenen konuşmadaki önemli pozları temsil etmek için kullanılır. Önemli pozlar dudaklar, çene ve dilin belirli bir foneme üretmedeki konumunu içerir. Konuşma sesi yürütülürken bir karakterin yüzüne animasyon eklemek için visemes kullanabilirsiniz.
WordBoundary Bir sözcük sınırının alındığını gösterir. Bu olay her yeni konuşulan sözcüğün, noktalama işaretinin ve tümcenin başında oluşturulur. Olay, çıkış sesinin başından itibaren geçerli sözcüğün saat uzaklığını onay işaretleriyle bildirir. Bu olay ayrıca, konuşulmak üzere olan sözcüğün hemen öncesinde giriş metnindeki veya SSML'deki karakter konumunu bildirir. Bu olay genellikle metnin ve ilgili sesin göreli konumlarını almak için kullanılır. Yeni bir sözcük hakkında bilgi edinmek ve ardından zamanlamaya göre işlem yapmak isteyebilirsiniz. Örneğin, konuşulan sözcükleri ne zaman ve ne kadar süreyle vurgulayabileceğinize karar vermenize yardımcı olabilecek bilgiler alabilirsiniz.

Not

Çıkış ses verileri kullanılabilir hale geldikçe olaylar tetiklenir ve bu da çıkış cihazına kayıttan yürütmeden daha hızlıdır. Çağıranın akışı ve gerçek zamanlı olarak uygun şekilde eşitlemesi gerekir.

Konuşma sentezi için olaylara nasıl abone olunduğunu gösteren bir örnek aşağıda verilmiştır. Hızlı başlangıçtaki yönergeleri izleyebilirsiniz, ancak bu speech-synthesis.py dosyasının içeriğini aşağıdaki Python koduyla değiştirebilirsiniz:

import os
import azure.cognitiveservices.speech as speechsdk

def speech_synthesizer_bookmark_reached_cb(evt: speechsdk.SessionEventArgs):
    print('BookmarkReached event:')
    print('\tAudioOffset: {}ms'.format((evt.audio_offset + 5000) / 10000))
    print('\tText: {}'.format(evt.text))

def speech_synthesizer_synthesis_canceled_cb(evt: speechsdk.SessionEventArgs):
    print('SynthesisCanceled event')

def speech_synthesizer_synthesis_completed_cb(evt: speechsdk.SessionEventArgs):
    print('SynthesisCompleted event:')
    print('\tAudioData: {} bytes'.format(len(evt.result.audio_data)))
    print('\tAudioDuration: {}'.format(evt.result.audio_duration))

def speech_synthesizer_synthesis_started_cb(evt: speechsdk.SessionEventArgs):
    print('SynthesisStarted event')

def speech_synthesizer_synthesizing_cb(evt: speechsdk.SessionEventArgs):
    print('Synthesizing event:')
    print('\tAudioData: {} bytes'.format(len(evt.result.audio_data)))

def speech_synthesizer_viseme_received_cb(evt: speechsdk.SessionEventArgs):
    print('VisemeReceived event:')
    print('\tAudioOffset: {}ms'.format((evt.audio_offset + 5000) / 10000))
    print('\tVisemeId: {}'.format(evt.viseme_id))

def speech_synthesizer_word_boundary_cb(evt: speechsdk.SessionEventArgs):
    print('WordBoundary event:')
    print('\tBoundaryType: {}'.format(evt.boundary_type))
    print('\tAudioOffset: {}ms'.format((evt.audio_offset + 5000) / 10000))
    print('\tDuration: {}'.format(evt.duration))
    print('\tText: {}'.format(evt.text))
    print('\tTextOffset: {}'.format(evt.text_offset))
    print('\tWordLength: {}'.format(evt.word_length))

# This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
speech_config = speechsdk.SpeechConfig(subscription=os.environ.get('SPEECH_KEY'), region=os.environ.get('SPEECH_REGION'))

# Required for WordBoundary event sentences.
speech_config.set_property(property_id=speechsdk.PropertyId.SpeechServiceResponse_RequestSentenceBoundary, value='true')

audio_config = speechsdk.audio.AudioOutputConfig(use_default_speaker=True)
speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)

# Subscribe to events
speech_synthesizer.bookmark_reached.connect(speech_synthesizer_bookmark_reached_cb)
speech_synthesizer.synthesis_canceled.connect(speech_synthesizer_synthesis_canceled_cb)
speech_synthesizer.synthesis_completed.connect(speech_synthesizer_synthesis_completed_cb)
speech_synthesizer.synthesis_started.connect(speech_synthesizer_synthesis_started_cb)
speech_synthesizer.synthesizing.connect(speech_synthesizer_synthesizing_cb)
speech_synthesizer.viseme_received.connect(speech_synthesizer_viseme_received_cb)
speech_synthesizer.synthesis_word_boundary.connect(speech_synthesizer_word_boundary_cb)

# The language of the voice that speaks.
speech_synthesis_voice_name='en-US-AvaMultilingualNeural'

ssml = """<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'>
    <voice name='{}'>
        <mstts:viseme type='redlips_front'/>
        The rainbow has seven colors: <bookmark mark='colors_list_begin'/>Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark='colors_list_end'/>.
    </voice>
</speak>""".format(speech_synthesis_voice_name)

# Synthesize the SSML
print("SSML to synthesize: \r\n{}".format(ssml))
speech_synthesis_result = speech_synthesizer.speak_ssml_async(ssml).get()

if speech_synthesis_result.reason == speechsdk.ResultReason.SynthesizingAudioCompleted:
    print("SynthesizingAudioCompleted result")
elif speech_synthesis_result.reason == speechsdk.ResultReason.Canceled:
    cancellation_details = speech_synthesis_result.cancellation_details
    print("Speech synthesis canceled: {}".format(cancellation_details.reason))
    if cancellation_details.reason == speechsdk.CancellationReason.Error:
        if cancellation_details.error_details:
            print("Error details: {}".format(cancellation_details.error_details))
            print("Did you set the speech resource key and region values?")

GitHub'da daha fazla metin okuma örneği bulabilirsiniz.

Özel uç nokta kullanma

Özel uç nokta, metin okuma istekleri için kullanılan standart uç noktayla işlevsel olarak aynıdır.

Bir fark, Konuşma SDK'sı endpoint_id aracılığıyla özel sesinizi kullanmak için belirtilmesi gerektiğidir. Metin okuma hızlı başlangıcıyla başlayıp kodu ve speech_synthesis_voice_nameile endpoint_id güncelleştirebilirsiniz.

speech_config = speechsdk.SpeechConfig(subscription=os.environ.get('SPEECH_KEY'), region=os.environ.get('SPEECH_REGION'))
speech_config.endpoint_id = "YourEndpointId"
speech_config.speech_synthesis_voice_name = "YourCustomVoiceName"

Konuşma Sentezi biçimlendirme dili (SSML) aracılığıyla özel bir ses kullanmak için, ses adı olarak model adını belirtin. Bu örnekte ses kullanılır YourCustomVoiceName .

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="YourCustomVoiceName">
        This is the text that is spoken. 
    </voice>
</speak>

Kapsayıcı çalıştırma ve kullanma

Konuşma kapsayıcıları, Konuşma SDK'sı ve Konuşma CLI'sı aracılığıyla erişilen websocket tabanlı sorgu uç noktası API'leri sağlar. Varsayılan olarak, Konuşma SDK'sı ve Konuşma CLI'sı genel Konuşma hizmetini kullanır. Kapsayıcıyı kullanmak için başlatma yöntemini değiştirmeniz gerekir. Anahtar ve bölge yerine kapsayıcı ana bilgisayar URL'si kullanın.

Kapsayıcılar hakkında daha fazla bilgi için bkz . Docker ile Konuşma kapsayıcılarını yükleme ve çalıştırma.

Konuşmayı metne dönüştürme REST API başvurusu | Kısa ses başvurusu için metin REST API'sine konuşma | GitHub'da Ek Örnekler

Bu nasıl yapılır kılavuzunda, metinden konuşmaya sentez yapmaya yönelik yaygın tasarım desenlerini öğreneceksiniz.

Aşağıdaki alanlar hakkında daha fazla bilgi için bkz. Metin okuma nedir?

  • Yanıtları bellek içi akışlar olarak alma.
  • Çıkış örnek hızını ve bit hızını özelleştirme.
  • Konuşma Sentezi İşaretlemeyi Dili (SSML) kullanarak sentez istekleri gönderme.
  • Sinir seslerini kullanma.
  • Olaylara abone olma ve sonuçlar üzerinde işlem yapmak.

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.
  • Azure portalında konuşma kaynağı oluşturun.
  • Konuşma kaynak anahtarınız ve bölgeniz. Konuşma kaynağınız dağıtıldıktan sonra anahtarları görüntülemek ve yönetmek için Kaynağa git'i seçin. Azure AI hizmetleri kaynakları hakkında daha fazla bilgi için bkz . Kaynağınızın anahtarlarını alma.

Metni konuşmaya dönüştürme

Komut isteminde aşağıdaki komutu çalıştırın. Şu değerleri komutuna ekleyin:

  • Konuşma kaynak anahtarınız
  • Konuşma kaynağı bölgeniz

Aşağıdaki değerleri de değiştirmek isteyebilirsiniz:

  • Ses X-Microsoft-OutputFormat çıkış biçimini denetleyen üst bilgi değeri. Metin okuma REST API başvurusunda desteklenen ses çıkış biçimlerinin listesini bulabilirsiniz.
  • Çıkış sesi. Konuşma hizmeti uç noktanızda kullanılabilen seslerin listesini almak için ses listesi API'sine bakın.
  • Çıkış dosyası. Bu örnekte, sunucudan gelen yanıtı adlı output.mp3bir dosyaya yönlendireceğiz.
curl --location --request POST 'https://YOUR_RESOURCE_REGION.tts.speech.microsoft.com/cognitiveservices/v1' \
--header 'Ocp-Apim-Subscription-Key: YOUR_RESOURCE_KEY' \
--header 'Content-Type: application/ssml+xml' \
--header 'X-Microsoft-OutputFormat: audio-16khz-128kbitrate-mono-mp3' \
--header 'User-Agent: curl' \
--data-raw '<speak version='\''1.0'\'' xml:lang='\''en-US'\''>
    <voice name='\''en-US-AvaMultilingualNeural'\''>
        I am excited to try text to speech
    </voice>
</speak>' > output.mp3

Bu nasıl yapılır kılavuzunda, metinden konuşmaya sentez yapmaya yönelik yaygın tasarım desenlerini öğreneceksiniz.

Aşağıdaki alanlar hakkında daha fazla bilgi için bkz. Metin okuma nedir?

  • Yanıtları bellek içi akışlar olarak alma.
  • Çıkış örnek hızını ve bit hızını özelleştirme.
  • Konuşma Sentezi İşaretlemeyi Dili (SSML) kullanarak sentez istekleri gönderme.
  • Sinir seslerini kullanma.
  • Olaylara abone olma ve sonuçlar üzerinde işlem yapmak.

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.
  • Azure portalında konuşma kaynağı oluşturun.
  • Konuşma kaynak anahtarınız ve bölgeniz. Konuşma kaynağınız dağıtıldıktan sonra anahtarları görüntülemek ve yönetmek için Kaynağa git'i seçin. Azure AI hizmetleri kaynakları hakkında daha fazla bilgi için bkz . Kaynağınızın anahtarlarını alma.

İndirme ve kurma

Bu adımları izleyin ve platformunuzun diğer gereksinimleri için Konuşma CLI'sı hızlı başlangıcına bakın.

  1. Konuşma CLI'sını yüklemek için aşağıdaki .NET CLI komutunu çalıştırın:

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    
  2. Konuşma kaynak anahtarınızı ve bölgenizi yapılandırmak için aşağıdaki komutları çalıştırın. değerini SUBSCRIPTION-KEY Konuşma kaynak anahtarınızla, değerini de Konuşma kaynağı bölgenizle değiştirin REGION .

    spx config @key --set SUBSCRIPTION-KEY
    spx config @region --set REGION
    

Konuşmayı hoparlöre sentezleme

Artık konuşmayı metinden sentezlemek için Konuşma CLI'sini çalıştırmaya hazırsınız.

  • Konsol penceresinde Konuşma CLI ikili dosyasını içeren dizine geçin. Sonra şu komutu çalıştırın:

    spx synthesize --text "I'm excited to try text to speech"
    

Konuşma CLI'si, bilgisayar hoparlörü aracılığıyla İngilizce doğal dil üretir.

Konuşmayı dosyaya sentezle

  • Hoparlörünüzün çıkışını bir .wav dosyasıyla değiştirmek için aşağıdaki komutu çalıştırın:

    spx synthesize --text "I'm excited to try text to speech" --audio output greetings.wav
    

Konuşma CLI'sı, greetings.wav ses dosyasına İngilizce doğal dil üretir.

Kapsayıcı çalıştırma ve kullanma

Konuşma kapsayıcıları, Konuşma SDK'sı ve Konuşma CLI'sı aracılığıyla erişilen websocket tabanlı sorgu uç noktası API'leri sağlar. Varsayılan olarak, Konuşma SDK'sı ve Konuşma CLI'sı genel Konuşma hizmetini kullanır. Kapsayıcıyı kullanmak için başlatma yöntemini değiştirmeniz gerekir. Anahtar ve bölge yerine kapsayıcı ana bilgisayar URL'si kullanın.

Kapsayıcılar hakkında daha fazla bilgi için bkz . Docker ile Konuşma kapsayıcılarını yükleme ve çalıştırma.

Sonraki adımlar