Metin okumayı kullanmaya başlama

Bu hızlı başlangıçta, Konuşma SDK'sı kullanarak metin-konuşma sentezi yapmak için yaygın tasarım desenlerini öğrenirsiniz. Temel yapılandırma ve sentezle başlayacak ve özel uygulama geliştirme için aşağıdakiler dahil olmak üzere daha gelişmiş örneklere geçebilirsiniz:

  • Yanıtları bellek içinde akışlar olarak alma
  • Çıkış örnek oranını ve bit oranını özelleştirme
  • SSML kullanarak sentez istekleri gönderme (konuşma sentezi işaretleme dili)
  • Sinir seslerini kullanma

GitHub'da örneklere atla

Doğrudan örnek koda atlamak için aşağıdaki C# hızlı başlangıç örneklerine GitHub.

Önkoşullar

Bu makalede, bir Azure hesabınız ve Konuşma hizmeti aboneliğiniz olduğu varsaylanmıştır. Hesabınız ve aboneliğiniz yoksa Konuşma hizmetini ücretsiz olarak deneyin.

Konuşma SDK'sı yükleme

Herhangi bir şey yapamadan önce Konuşma SDK'sı yüklemeniz gerekir. Platforma bağlı olarak aşağıdaki yönergeleri kullanın:

Bağımlılıkları içeri aktarma

Bu makaledeki örnekleri çalıştırmak için using betiğinizin en üstüne aşağıdaki deyimleri dahil etmek gerekir.

using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

Konuşma yapılandırması oluşturma

Konuşma SDK'sını kullanarak Konuşma hizmetine çağrı yapmak için bir oluşturmanız SpeechConfig gerekir. Bu sınıf, konuşma anahtarınız ve ilişkili konum/bölge, uç nokta, konak veya yetkilendirme belirteci gibi aboneliğiniz hakkında bilgiler içerir.

Not

Konuşma tanıma, konuşma sentezi, çeviri veya amaç tanıma gerçekleştirip gerçekleştirmeden bağımsız olarak her zaman bir yapılandırma oluşturmanız gerekir.

Bir başlatabilirsiniz birkaç yolu SpeechConfig vardır:

  • Abonelik ile: bir anahtar ve ilişkili konumu/bölgeyi geçin.
  • Uç nokta ile: Konuşma hizmeti uç noktasını iletir. Anahtar veya yetkilendirme belirteci isteğe bağlıdır.
  • Bir konak ile: bir konak adresi girin. Anahtar veya yetkilendirme belirteci isteğe bağlıdır.
  • Yetkilendirme belirteci ile: Yetkilendirme belirteci ve ilişkili konumu/bölgeyi iletir.

Bu örnekte, konuşma anahtarı ve SpeechConfig konum/bölge kullanarak bir oluşturabilirsiniz. Konuşma tanıma hizmetini ücretsiz deneyin adımlarını takip edin. Ayrıca, bu makalenin geri kalanında farklı özelleştirmeler için değiştirerek kullanmak üzere bazı temel ortak kodlar da oluşturabilirsiniz.

public class Program
{
    static async Task Main()
    {
        await SynthesizeAudioAsync();
    }

    static async Task SynthesizeAudioAsync()
    {
        var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    }
}

Sentez dilini ve sesi seçme

Azure Metin Okuma hizmeti 250'den fazla sesi ve 70'den fazla dili ve varyantı destekler. Listesinin tamamını veya konuşmayımetne indiren metinlerde ekleyebilirsiniz. Giriş metninize uygun dili SpeechConfig veya sesi belirtin ve istediğiniz sesi kullanın.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    // Note: if only language is set, the default voice of that language is chosen.
    config.SpeechSynthesisLanguage = "<your-synthesis-language>"; // e.g. "de-DE"
    // The voice setting will overwrite language setting.
    // The voice setting will not overwrite the voice element in input SSML.
    config.SpeechSynthesisVoiceName = "<your-wanted-voice>";
}

Konuşmayı dosyaya sentezleme

Ardından, konuşmayı metne dönüştürmeleri ve çıkışları konuşmacılara, dosyalara veya diğer çıkış akışlarına SpeechSynthesizer yürüten bir nesnesi oluşturun. , önceki adımda oluşturulan nesnesini ve çıkış sonuçlarının nasıl iş gerektiğini belirten bir nesneyi parametre SpeechSynthesizer SpeechConfig olarak kabul AudioConfig eder.

Başlamak için, işlevini kullanarak çıkışı bir dosyaya otomatik olarak yazmak için bir oluşturun ve AudioConfig .wav FromWavFileOutput() deyimiyle örneği using oluşturun. Bu using bağlamdaki bir deyim, otomatik olarak unmanaged resources atılır ve nesne atılmasından sonra kapsam dışında neden olur.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
}

Ardından, başka bir deyimiyle SpeechSynthesizer bir using örneği. Nesnenizi config ve nesnesini parametre olarak audioConfig iletir. Ardından konuşma sentezini yürütmek ve bir dosyaya yazmak, bir metin SpeakTextAsync() dizesiyle çalışma kadar kolaydır.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
    using var synthesizer = new SpeechSynthesizer(config, audioConfig);
    await synthesizer.SpeakTextAsync("A simple test to write to a file.");
}

Programı çalıştırın ve bir .wav sentezlenmiş dosya belirttiğiniz konuma yazılır. Bu, en temel kullanımın iyi bir örneğidir, ancak bir sonraki adım, çıkışı özelleştirmeye ve çıktı yanıtını özel senaryolarla çalışmak için bellek içinde bir akış olarak işlemeye göz atabilirsiniz.

Konuşmacı çıkışına sentezleme

Bazı durumlarda sentezlenmiş konuşmayı doğrudan bir konuşmacıya doğrudan çıkış olarak almak istemeyebilirsiniz. Bunu yapmak için yukarıdaki örnekte AudioConfig oluşturulurken SpeechSynthesizer parametresini atlar. Bu, geçerli etkin çıkış cihazına sentezler.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    using var synthesizer = new SpeechSynthesizer(config);
    await synthesizer.SpeakTextAsync("Synthesizing directly to speaker output.");
}

Bellek içinde akış olarak sonuç al

Konuşma uygulaması geliştirmeyle ilgili birçok senaryo için, elde edilen ses verileri büyük olasılıkla doğrudan bir dosyaya yazmak yerine bellek içinde bir akış olarak gerekir. Bu, şunları içeren özel davranış oluşturmanızı sağlar:

  • Elde edilen byte dizisini, özel aşağı akış hizmetleri için bir arama akışı olarak soyutlar.
  • Sonucu diğer API'ler veya hizmetlerle tümleştirin.
  • Ses verilerini değiştirme, özel üst .wav bilgiler yazma vb.

Bu değişikliği önceki örnekten yapmak oldukça kolaydır. İlk olarak, AudioConfig artan denetim için bu noktadan itibaren çıkış davranışını el ile yönetecek şekilde bloğu kaldırın. Ardından null oluşturucuda AudioConfig için SpeechSynthesizer 'i geçiş.

Not

için geçiş, yukarıdaki konuşmacı çıkışı örneğinde olduğu gibi bu değerin dışında tutularak geçerli etkin çıkış cihazında varsayılan null AudioConfig olarak ses çalmaz.

Bu kez sonucu bir değişkene SpeechSynthesisResult kaydedin. özelliği, AudioData çıktı byte [] verilerden bir içerir. Bu ile el ile byte [] çalışabilirsiniz veya bellek içinde AudioDataStream akışı yönetmek için sınıfını kullanabilirsiniz. Bu örnekte, sonuçtan bir AudioDataStream.FromResult() akış almak için statik işlevini kullanırız.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    using var synthesizer = new SpeechSynthesizer(config, null);

    var result = await synthesizer.SpeakTextAsync("Getting the response as an in-memory stream.");
    using var stream = AudioDataStream.FromResult(result);
}

Buradan elde edilen nesnesini kullanarak herhangi bir özel davranışı stream gerçekleştirebilirsiniz.

Ses biçimini özelleştirme

Aşağıdaki bölümde, aşağıdakiler dahil olmak üzere ses çıkış özniteliklerini özelleştirme adımları ve adımları yer almaktadır:

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

Ses biçimini değiştirmek için nesnede SetSpeechSynthesisOutputFormat() işlevini SpeechConfig kullanırsanız. Bu işlev, çıkış enum biçimini SpeechSynthesisOutputFormat seçmek için kullanabileceğiniz türünde bir bekler. Kullanılabilir ses biçimlerinin listesi için başvuru belgelerine bakın.

Gereksinimlerinize bağlı olarak farklı dosya türleri için çeşitli seçenekler vardır. Tanım gereği gibi ham biçimlerin Raw24Khz16BitMonoPcm ses üst bilgisi içermey olduğunu unutmayın. Ham biçimleri yalnızca aşağı akış uygulamanıza ham bit akışı kodunu çöze biliyorsanız veya bit derinliğine, örnek hızına, kanal sayısına vb. göre el ile üst bilgi oluşturmayı planlıyorsanız kullanın.

Bu örnekte, nesnesinde ayarını kullanarak yüksek uygunlukta bir RIFF Riff24Khz16BitMonoPcm SpeechSynthesisOutputFormat biçimi SpeechConfig belirtirsiniz. Önceki bölümdeki örnekte olduğu gibi, sonucun bellek içinde akışını almak için kullanın ve AudioDataStream sonra bunu bir dosyaya yazın.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    config.SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm);

    using var synthesizer = new SpeechSynthesizer(config, null);
    var result = await synthesizer.SpeakTextAsync("Customizing audio output format.");

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

Programınızı yeniden çalıştırarak belirtilen .wav yola bir dosya yazar.

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

Konuşma Sentezi Biçimlendirme Dili (SSML), bir XML şemasından isteklerinizi göndererek konuşmada, söyleyişte, konuşma hızında, hacimde ve daha fazla metinden konuşma çıkışına ince ayar uygulamanıza olanak sağlar. Bu bölümde sesi değiştirme örneği açıklanmıştır, ancak daha ayrıntılı bir kılavuz için SSML nasıl 2. makalesine bakın.

Özelleştirme için SSML kullanmaya başlamak için sesi değiştirecek basit bir değişiklik yapacaktır. İlk olarak, bu örnekte kök proje dizininize SSML yapılandırması için yeni bir XML dosyası ssml.xml oluşturun. Kök öğe her zaman <speak> öğesidir ve metni bir öğeye <voice> sarmalamak, parametresini kullanarak sesi değiştirmenizi name sağlar. Desteklenen sinir seslerinin tam listesine bakın.

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

Ardından XML dosyanıza başvurarak konuşma sentezi isteğini değiştirebilirsiniz. İstek çoğunlukla aynıdır, ancak işlevini kullanmak yerine SpeakTextAsync() SpeakSsmlAsync() kullanırsanız. Bu işlev bir XML dizesi bekler, bu nedenle ilk olarak SSML yapılandırmanızı kullanarak bir dize olarak File.ReadAllText() yükleysiniz. Burada sonuç nesnesi, önceki örneklerle tamamen aynıdır.

Not

Visual Studio kullanıyorsanız, derleme yapılandırmanız varsayılan olarak XML dosyanızı bulamaz. Bunu düzeltmek için XML dosyasına sağ tıklayın ve Özellikler'i seçin. Derleme Eylemlerini İçerik olarak, Çıkış Dizinine Kopyala'ya ise Her zaman kopyala olarak değiştirebilirsiniz.

public static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    using var synthesizer = new SpeechSynthesizer(config, null);

    var ssml = File.ReadAllText("./ssml.xml");
    var result = await synthesizer.SpeakSsmlAsync(ssml);

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

Not

SSML'i kullanmadan sesi değiştirmek için özelliğini kullanarak SpeechConfig``SpeechConfig.SpeechSynthesisVoiceName = "en-US-ChristopherNeural";

Yüz pozu olaylarını al

Konuşma, yüz ifadelerinin animasyonunu oluşturmak için iyi bir yol olabilir. Genellikle visemes, gözlemlenen konuşmada önemli pozları temsil etmek için kullanılır; örneğin, belirli bir phoneme üreteçte yer alan dilimler, ses ve dolgunların konumu gibi. Konuşma SDK'sında viseme olayına abone olabilirsiniz. Ardından, konuşma sesi oynatilirken bir karakterin yüzüne animasyon uygulamak için viseme olayları uygulayabilirsiniz. Viseme olaylarını nasıl elde etmeyi öğrenin.

Bu hızlı başlangıçta, konuşma SDK 'sını kullanarak metinden konuşmaya senşlerini kullanmaya yönelik yaygın tasarım düzenlerini öğrenirsiniz. Temel yapılandırma ve birleştirme işlemleri gerçekleştirerek başlar ve aşağıdakiler de dahil olmak üzere özel uygulama geliştirme için daha gelişmiş örneklere geçin:

  • Bellek içi akışlar olarak yanıt alma
  • Çıkış örneği hızını ve bit hızını özelleştirme
  • SSML kullanarak senssıs istekleri gönderme (konuşma birleştirme biçimlendirme dili)
  • Sinir seslerini kullanma

GitHub örneklere atlayın

Örnek koda doğrudan atlamak istiyorsanız, GitHub C++ hızlı başlangıç örneklerine bakın.

Önkoşullar

Bu makalede bir Azure hesabınız ve konuşma hizmeti aboneliğiniz olduğunu varsaymaktadır. Hesabınız ve aboneliğiniz yoksa konuşma hizmetini ücretsiz deneyin.

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

Herhangi bir şey yapabilmeniz için önce konuşma SDK 'sını yüklemeniz gerekir. Platformunuza bağlı olarak, aşağıdaki yönergeleri kullanın:

Bağımlılıkları içeri aktar

Bu makaledeki örnekleri çalıştırmak için, using betiğinizin en üstüne aşağıdaki Import ve deyimlerini ekleyin.

#include <iostream>
#include <fstream>
#include <string>
#include <speechapi_cxx.h>

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

Konuşma yapılandırması oluşturma

Konuşma SDK 'sını kullanarak konuşma hizmetini çağırmak için bir oluşturmanız gerekir SpeechConfig . Bu sınıf, konuşma anahtarınız ve ilişkili konum/bölge, uç nokta, ana bilgisayar veya yetkilendirme belirteci gibi aboneliğiniz hakkındaki bilgileri içerir.

Not

Konuşma tanıma, konuşma birleştirme, çeviri veya amaç tanıma işlemlerini gerçekleştirmekten bağımsız olarak her zaman bir yapılandırma oluşturacaksınız.

Şunları başlatabilmeniz için birkaç yol vardır SpeechConfig :

  • Abonelik ile: bir anahtar ve ilişkili konum/bölge geçirin.
  • Uç nokta ile: bir konuşma hizmeti uç noktasında geçirin. Anahtar veya yetkilendirme belirteci isteğe bağlıdır.
  • Bir ana bilgisayar ile: bir konak adresini geçirin. Anahtar veya yetkilendirme belirteci isteğe bağlıdır.
  • Yetkilendirme belirteci ile: bir yetkilendirme belirteci ve ilişkili konum/bölge geçirin.

Bu örnekte, bir SpeechConfig abonelik anahtarı ve bölgesi kullanarak bir oluşturun. Konuşma hizmetini ücretsiz deneyinbölümündeki adımları izleyerek bu kimlik bilgilerini alın. Ayrıca, bu makalenin geri kalanı için kullanabileceğiniz, farklı özelleştirmeler için değiştirdiğiniz bazı temel ortak kod oluşturabilirsiniz.

int wmain()
{
    try
    {
        synthesizeSpeech();
    }
    catch (exception e)
    {
        cout << e.what();
    }
    return 0;
}

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
}

Sensıs dili ve ses seçin

Azure Metin Okuma hizmeti 250 'den fazla sesi ve 70 ' den fazla dili ve varyantları destekler. Tam listeyialabilir veya metin olarak konuşma tanıtımınadeneyebilirsiniz. SpeechConfigGiriş metninizle eşleşecek dili veya sesi belirtin ve istenen sesi kullanın.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    // Note: if only language is set, the default voice of that language is chosen.
    config->SetSpeechSynthesisLanguage("<your-synthesis-language>"); // e.g. "de-DE"
    // The voice setting will overwrite language setting.
    // The voice setting will not overwrite the voice element in input SSML.
    config->SetSpeechSynthesisVoiceName("<your-wanted-voice>");
}

Konuşmayı bir dosyaya sentezleştirme

Sonra, SpeechSynthesizer metin okuma dönüştürmeleri yürüten ve hoparlörlerde, dosyalarda veya diğer çıkış akışlarına giden çıktıları yürüten bir nesne oluşturun. , SpeechSynthesizer SpeechConfig Önceki adımda oluşturulan nesneyi params olarak kabul eder ve AudioConfig Çıkış sonuçlarının nasıl işleneceğini belirten bir nesnedir.

Başlamak için, AudioConfig işlevini kullanarak çıktıyı otomatik olarak bir dosyaya yazmak üzere bir oluşturun .wav FromWavFileOutput() .

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
}

Sonra, bir örneği oluşturun SpeechSynthesizer , config nesne ve audioConfig nesneyi params olarak geçirerek. Daha sonra, konuşma birleştirmenin yürütülmesi ve bir dosyaya yazılması, SpeakTextAsync() bir metin dizesiyle çalışırken basittir.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, audioConfig);
    auto result = synthesizer->SpeakTextAsync("A simple test to write to a file.").get();
}

Programı çalıştırın ve belirttiğiniz konuma bir sentezlenmiş .wav dosya yazılır. Bu, en temel kullanımın iyi bir örneğidir, ancak sonraki bir deyişle, özel senaryolarla çalışmaya yönelik bellek içi akış olarak çıktıyı özelleştirmeye ve çıkış yanıtını işlemeye baktığınızın ardından.

Konuşmacı çıktısına sentezleştirme

Bazı durumlarda, doğrudan sentezlenmiş konuşmayı doğrudan bir konuşmacının çıktısını almak isteyebilirsiniz. Bunu yapmak için AudioConfig Yukarıdaki örnekte oluştururken parametresini atlayın SpeechSynthesizer . Bu, geçerli etkin çıkış cihazını birleştirdi.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    auto synthesizer = SpeechSynthesizer::FromConfig(config);
    auto result = synthesizer->SpeakTextAsync("Synthesizing directly to speaker output.").get();
}

Bellek içi akış olarak sonuç alın

Konuşma uygulaması geliştirmede birçok senaryo için, büyük olasılıkla bir dosyaya doğrudan yazmak yerine, sonuçta elde edilen ses verilerinin bellek içi akış olarak olması gerekir. Bu, aşağıdakiler dahil olmak üzere özel davranış oluşturmanıza izin verir:

  • Özel aşağı akış Hizmetleri için arama yapabilecek bir akış olarak ortaya çıkan bayt dizisinin soyut olması.
  • Sonucu diğer API 'leri veya hizmetleriyle tümleştirin.
  • Ses verilerini değiştirin, özel üstbilgiler yazın .wav vb.

Önceki örnekte bu değişikliği yapmak basittir. İlk AudioConfig olarak, daha fazla denetim için çıkış davranışını bu noktadan el ile yöneteceği için öğesini kaldırın. Sonra NULL AudioConfig Oluşturucu içinde öğesine geçirin SpeechSynthesizer .

Not

NULL AudioConfig Yukarıdaki konuşmacı çıktısı örneğinde olduğu gibi değil, için geçirme, geçerli etkin çıkış cihazında varsayılan olarak sesi oynamaz.

Bu kez, sonucu bir SpeechSynthesisResult değişkene kaydedersiniz. GetAudioDataAlıcı, byte [] Çıkış verilerinden bir döndürür. Bu ile el ile çalışabilirsiniz byte [] veya AudioDataStream bellek içi akışı yönetmek için sınıfını kullanabilirsiniz. Bu örnekte, AudioDataStream.FromResult() sonuçtan bir akış almak için static işlevini kullanırsınız.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);

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

Buradan, sonuçta elde edilen nesneyi kullanarak özel davranışları uygulayabilirsiniz stream .

Ses biçimini Özelleştir

Aşağıdaki bölümde aşağıdakiler dahil olmak üzere ses çıkış özniteliklerinin nasıl özelleştirileceği gösterilmektedir:

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

Ses biçimini değiştirmek için SetSpeechSynthesisOutputFormat() nesnesi üzerinde işlevini kullanın SpeechConfig . Bu işlev enum SpeechSynthesisOutputFormat , çıkış biçimini seçmek için kullandığınız türünde bir tür bekliyor. Kullanılabilir Ses biçimlerinin listesi için başvuru belgelerine bakın.

Gereksinimlerinize bağlı olarak farklı dosya türleri için çeşitli seçenekler vardır. Tanımına göre, gibi ham biçimlerin Raw24Khz16BitMonoPcm Ses üst bilgilerini içermediğini unutmayın. Ham biçimleri yalnızca aşağı akış uygulamanızın bir ham Bitstream kodunu çözemediğini veya bit derinliğine, örnek hızına, kanal sayısına ve vb. göre el ile üstbilgileri oluşturmayı planlıyorsanız kullanın.

Bu örnekte, Riff24Khz16BitMonoPcm nesnesi üzerinde ayarını yaparak Yüksek uygunluğa sahip bir biçim belirtirsiniz SpeechSynthesisOutputFormat SpeechConfig . Önceki bölümdeki örneğe benzer şekilde, AudioDataStream sonucun bellek içi akışını elde etmek ve ardından bir dosyaya yazmak için öğesini kullanırsınız.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    config->SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat::Riff24Khz16BitMonoPcm);

    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);
    auto result = synthesizer->SpeakTextAsync("A simple test to write to a file.").get();

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

Programınızı yeniden çalıştırmak, .wav belirtilen yola bir dosya yazacak.

SSML 'yi kullanarak konuşma özelliklerini özelleştirme

Konuşma sen, biçimlendirme dili (SSML), isteklerinizi bir XML şemasından göndererek, metin okuma çıktılarından oluşan sıklık, Söyleniş, konuşma oranı, hacim ve daha fazlasını ayarlamanıza olanak sağlar. Bu bölümde, sesi değiştirme örneği gösterilmektedir, ancak daha ayrıntılı bir kılavuz için bkz. SSML nasıl yapılır makalesi.

Özelleştirme için SSML 'yi kullanmaya başlamak için, sese geçiş yapan basit bir değişiklik yaparsınız. İlk olarak, bu örnekte, kök proje dizininizde SSML yapılandırması için yeni bir XML dosyası oluşturun ssml.xml . Kök öğesi her zaman <speak> ve metni bir öğe içinde sarmalama, <voice> param kullanarak sesi değiştirmenize olanak sağlar name . Desteklenen sinir sesin tam listesine bakın.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-US-ChristopherNeural">
    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 sensıs isteğini değiştirmeniz gerekir. İstek genellikle aynıdır, ancak işlevini kullanmak yerine SpeakTextAsync() kullanın SpeakSsmlAsync() . Bu işlev bir XML dizesi bekliyor, bu nedenle ilk olarak SSML yapılandırmasını bir dize olarak yüklersiniz. Buradan, sonuç nesnesi önceki örneklerle tamamen aynıdır.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);

    std::ifstream file("./ssml.xml");
    std::string ssml, line;
    while (std::getline(file, line))
    {
        ssml += line;
        ssml.push_back('\n');
    }
    auto result = synthesizer->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 SpeechConfig kullanarak SpeechConfig.SetSpeechSynthesisVoiceName("en-US-ChristopherNeural")

Yüz poz olaylarını al

Konuşma, yüz ifadelerinin animasyonunu sağlamak için iyi bir yol olabilir. Genellikle visemes , belirli bir phoneme oluşturma sırasında LIP 'ler, Jaw ve dil sistemi gibi gözlemlenen konuşmayla ilgili önemli pozları temsil etmek için kullanılır. Konuşma SDK 'sında viseme olayına abone olabilirsiniz. Daha sonra, konuşma sesi oynatılırken bir karakter yüzünüzü hareketlendirmek için viseme olaylarını uygulayabilirsiniz. Viseme olaylarını nasıl alabileceğiniziöğrenin.

Bu hızlı başlangıçta, Konuşma SDK'sı kullanarak metin-konuşma sentezi yapmak için yaygın tasarım desenlerini öğrenirsiniz.

GitHub'da örneklere atla

Doğrudan örnek koda atlamak için bkz. Go hızlı başlangıç örnekleri GitHub.

Önkoşullar

Bu makalede, bir Azure hesabınız ve Konuşma hizmeti aboneliğiniz olduğu varsaylanmıştır. Hesabınız ve aboneliğiniz yoksa Konuşma hizmetini ücretsiz olarak deneyin.

Konuşma SDK'sı yükleme

Herhangi bir şey yapamadan önce Go için Konuşma SDK'sı yüklemeniz gerekir.

Konuşmayı metne, konuşmacıya

Varsayılan ses çıkış cihazınıza konuşma sentezi çalıştırmak için aşağıdaki kod örneğini kullanın. ve değişkenlerini subscription konuşma region anahtarınız ve konumunuz/bölgeniz ile değiştirin. Betiği çalıştırmanız, giriş metninizi varsayılan konuşmacıya okur.

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 := "<paste-your-speech-key-here>"
    region := "<paste-your-speech-location/region-here>"

    audioConfig, err := audio.NewAudioConfigFromDefaultSpeakerOutput()
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer audioConfig.Close()
    config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer config.Close()
    speechSynthesizer, err := speech.NewSpeechSynthesizerFromConfig(config, 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 update the subscription info?\n",
                    cancellation.ErrorCode,
                    cancellation.ErrorDetails)
            }
        }
    }
}

Aşağıdaki komutları çalıştırarak dosya üzerinde go.mod barındırılan bileşenlere bağlantı GitHub.

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

Şimdi kodu derleme ve çalıştırma.

go build
go run quickstart

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

Bellek içinde akışa metin konuşma

Konuşma uygulaması geliştirmeyle ilgili birçok senaryo için, elde edilen ses verileri büyük olasılıkla doğrudan bir dosyaya yazmak yerine bellek içinde bir akış olarak gerekir. Bu, şunları içeren özel davranış oluşturmanızı sağlar:

  • Elde edilen byte dizisini, özel aşağı akış hizmetleri için bir arama akışı olarak soyutlar.
  • Sonucu diğer API'ler veya hizmetlerle tümleştirin.
  • Ses verilerini değiştirme, özel üst .wav bilgiler yazma vb.

Bu değişikliği önceki örnekten yapmak oldukça kolaydır. İlk olarak, artan denetim için bu noktadan itibaren çıkış AudioConfig davranışını el ile yönetecek şekilde , kaldırın. Ardından nil oluşturucuda AudioConfig için SpeechSynthesizer 'i geçiş.

Not

için geçiş, yukarıdaki konuşmacı çıkışı örneğinde olduğu gibi bu değerin dışında tutularak geçerli etkin çıkış cihazında varsayılan nil AudioConfig olarak ses çalmaz.

Bu kez sonucu bir değişkene SpeechSynthesisResult kaydedin. özelliği, AudioData çıktı []byte verisi döndürür. Bu ile el ile []byte çalışabilirsiniz veya bellek içinde AudioDataStream akışı yönetmek için sınıfını kullanabilirsiniz. Bu örnekte, sonuçtan bir NewAudioDataStreamFromSpeechSynthesisResult() akış almak için statik işlevini kullanırız.

ve değişkenlerini subscription konuşma region anahtarınız ve konumunuz/bölgeniz ile değiştirin.

package main

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

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

func main(subscription string, region string) {
    subscription := "<paste-your-speech-key-here>"
    region := "<paste-your-speech-location/region-here>"

    config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer config.Close()
    speechSynthesizer, err := speech.NewSpeechSynthesizerFromConfig(config, 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 case 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))
    }
}

Aşağıdaki komutları çalıştırarak dosya üzerinde go.mod barındırılan bileşenlere bağlantı GitHub.

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

Şimdi kodu derleme ve çalıştırma.

go build
go run quickstart

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

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

Konuşma Sentezi Biçimlendirme Dili (SSML), bir XML şemasından isteklerinizi göndererek konuşmada, söyleyişte, konuşma hızında, hacimde ve daha fazla metinden konuşma çıkışına ince ayar uygulamanıza olanak sağlar. Bu bölümde sesi değiştirme örneği açıklanmıştır, ancak daha ayrıntılı bir kılavuz için SSML nasıl 2. makalesine bakın.

Özelleştirme için SSML kullanmaya başlamak için sesi değiştirecek basit bir değişiklik yapacaktır. İlk olarak, bu örnekte kök proje dizininize SSML yapılandırması için yeni bir XML dosyası ssml.xml oluşturun. Kök öğe her zaman <speak> öğesidir ve metni bir öğeye <voice> sarmalamak, parametresini kullanarak sesi değiştirmenizi name sağlar. Desteklenen sinir seslerinin tam listesine bakın.

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

Ardından XML dosyanıza başvurarak konuşma sentezi isteğini değiştirebilirsiniz. İstek çoğunlukla aynıdır, ancak işlevini kullanmak yerine SpeakTextAsync() SpeakSsmlAsync() kullanırsanız. Bu işlev bir XML dizesi bekler, bu nedenle ilk olarak SSML yapılandırmanızı bir dize olarak yükleysiniz. Burada sonuç nesnesi, önceki örneklerle tamamen aynıdır.

Not

SSML'i kullanmadan sesi değiştirmek için özelliğini kullanarak SpeechConfig``speechConfig.SetSpeechSynthesisVoiceName("en-US-ChristopherNeural")

Yüz pozu olaylarını al

Konuşma, yüz ifadelerinin animasyonunu oluşturmak için iyi bir yol olabilir. Genellikle visemes, gözlemlenen konuşmada önemli pozları temsil etmek için kullanılır; örneğin, belirli bir phoneme üreteçte yer alan dilimler, ses ve dolgunların konumu gibi. Konuşma SDK'sında viseme olayına abone olabilirsiniz. Ardından, konuşma sesi oynatilirken bir karakterin yüzüne animasyon uygulamak için viseme olayları uygulayabilirsiniz. Viseme olaylarını nasıl elde etmeyi öğrenin.

Bu hızlı başlangıçta, Konuşma SDK'sı kullanarak metin-konuşma sentezi yapmak için yaygın tasarım desenlerini öğrenirsiniz. Temel yapılandırma ve sentezle başlar ve aşağıdakiler dahil olmak üzere özel uygulama geliştirme için daha gelişmiş örneklere geçebilirsiniz:

  • Yanıtları bellek içinde akışlar olarak alma
  • Çıkış örnek oranını ve bit oranını özelleştirme
  • SSML kullanarak sentez istekleri gönderme (konuşma sentezi işaretleme dili)
  • Sinir seslerini kullanma

GitHub'da örneklere atla

Doğrudan örnek koda atlamak için aşağıdaki Java hızlı başlangıç örneklerine GitHub.

Önkoşullar

Bu makalede, bir Azure hesabınız ve Konuşma hizmeti aboneliğiniz olduğu varsaylanmıştır. Hesabınız ve aboneliğiniz yoksa Konuşma hizmetini ücretsiz olarak deneyin.

Konuşma SDK'sı yükleme

Herhangi bir şey yapamadan önce Konuşma SDK'sı yüklemeniz gerekir. Platforma bağlı olarak aşağıdaki yönergeleri kullanın:

Bağımlılıkları içeri aktarma

Bu makaledeki örnekleri çalıştırmak için betiğinizin en üstüne aşağıdaki içeri aktarma deyimlerini dahil etmek.

import com.microsoft.cognitiveservices.speech.AudioDataStream;
import com.microsoft.cognitiveservices.speech.SpeechConfig;
import com.microsoft.cognitiveservices.speech.SpeechSynthesizer;
import com.microsoft.cognitiveservices.speech.SpeechSynthesisOutputFormat;
import com.microsoft.cognitiveservices.speech.SpeechSynthesisResult;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;

import java.io.*;
import java.util.Scanner;

Konuşma yapılandırması oluşturma

Konuşma SDK'sını kullanarak Konuşma hizmetine çağrı yapmak için bir oluşturmanız SpeechConfig gerekir. Bu sınıf, konuşma anahtarınız ve ilişkili konum/bölge, uç nokta, konak veya yetkilendirme belirteci gibi aboneliğiniz hakkında bilgiler içerir.

Not

Konuşma tanıma, konuşma sentezi, çeviri veya amaç tanıma gerçekleştirip gerçekleştirmeden bağımsız olarak her zaman bir yapılandırma oluşturmanız gerekir.

Başlatmanın birkaç yolu SpeechConfig vardır:

  • Abonelik ile: Konuşma anahtarını ve ilişkili konumu/bölgeyi geçin.
  • Uç nokta ile: Konuşma hizmeti uç noktasını iletir. Konuşma anahtarı veya yetkilendirme belirteci isteğe bağlıdır.
  • Bir konak ile: bir konak adresi girin. Konuşma anahtarı veya yetkilendirme belirteci isteğe bağlıdır.
  • Yetkilendirme belirteci ile: Yetkilendirme belirteci ve ilişkili konumu/bölgeyi iletir.

Bu örnekte, konuşma anahtarı ve SpeechConfig konum/bölge kullanarak bir oluşturabilirsiniz. Konuşma tanıma hizmetini ücretsiz deneyin adımlarını takip edin. Ayrıca, bu makalenin geri kalanında farklı özelleştirmeler için değiştirerek kullanmak üzere bazı temel ortak kodlar da oluşturabilirsiniz.

public class Program
{
    public static void main(String[] args) {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    }
}

Sentez dilini ve sesi seçme

Azure Metin Okuma hizmeti 250'den fazla sesi ve 70'den fazla dili ve varyantı destekler. Listesinin tamamını veya konuşmayımetne indiren metinde ekleyebilirsiniz. Giriş metninize uygun dili SpeechConfig veya sesi belirtin ve istediğiniz sesi kullanın.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    // Note: if only language is set, the default voice of that language is chosen.
    config.setSpeechSynthesisLanguage("<your-synthesis-language>"); // e.g. "de-DE"
    // The voice setting will overwrite language setting.
    // The voice setting will not overwrite the voice element in input SSML.
    config.setSpeechSynthesisVoiceName("<your-wanted-voice>");
}

Konuşmayı dosyaya sentezleme

Ardından, konuşmayı metne dönüştürmeleri ve çıkışları konuşmacılara, dosyalara veya diğer çıkış akışlarına SpeechSynthesizer yürüten bir nesnesi oluşturun. , önceki adımda oluşturulan nesnesini ve çıkış sonuçlarının nasıl iş gerektiğini belirten bir nesneyi parametresi SpeechSynthesizer SpeechConfig olarak kabul AudioConfig eder.

Başlamak için, statik AudioConfig işlevi kullanarak çıktıyı bir dosyaya otomatik .wav olarak yazmak için bir fromWavFileOutput() oluşturun.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");
}

Ardından, nesnenizi ve SpeechSynthesizer nesnesini parametre olarak geçirme örneği speechConfig audioConfig oluşturma. Ardından konuşma sentezini yürütmek ve bir dosyaya yazmak, bir metin SpeakText() dizesiyle çalışma kadar kolaydır.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");

    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    synthesizer.SpeakText("A simple test to write to a file.");
}

Programı çalıştırın; belirttiğiniz konuma .wav sentezlenmiş bir dosya yazılır. Bu, en temel kullanımın iyi bir örneğidir, ancak bir sonraki adım, çıkışı özelleştirmeye ve çıkış yanıtını özel senaryolarla çalışmak için bellek içinde bir akış olarak işlemeye göz atabilirsiniz.

Konuşmacı çıkışına sentezleme

Bazı durumlarda sentezlenmiş konuşmayı doğrudan bir konuşmacıya doğrudan çıkış olarak almak istemeyebilirsiniz. Bunu yapmak için statik işlevi AudioConfig kullanarak örneğini fromDefaultSpeakerOutput() örneği. Bu, geçerli etkin çıkış cihazına verir.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    AudioConfig audioConfig = AudioConfig.fromDefaultSpeakerOutput();

    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    synthesizer.SpeakText("Synthesizing directly to speaker output.");
}

Bellek içinde akış olarak sonuç al

Konuşma uygulaması geliştirmeyle ilgili birçok senaryo için, elde edilen ses verileri büyük olasılıkla doğrudan bir dosyaya yazmak yerine bellek içinde bir akış olarak gerekir. Bu, şunları içeren özel davranış oluşturmanızı sağlar:

  • Elde edilen byte dizisini, özel aşağı akış hizmetleri için bir arama akışı olarak soyutlar.
  • Sonucu diğer API'ler veya hizmetlerle tümleştirin.
  • Ses verilerini değiştirme, özel üst .wav bilgiler yazma vb.

Bu değişikliği önceki örnekten yapmak oldukça kolaydır. İlk olarak, AudioConfig artan denetim için bu noktadan itibaren çıkış davranışını el ile yönetecek şekilde bloğu kaldırın. Ardından null oluşturucusu içinde AudioConfig için SpeechSynthesizer geçiş.

Not

için geçirme, yukarıdaki konuşmacı çıkışı örneğinde olduğu gibi bunu yok etmek yerine geçerli etkin çıkış cihazında varsayılan null AudioConfig olarak sesi çalmaz.

Bu kez sonucu bir değişkene SpeechSynthesisResult kaydedin. İşlev, SpeechSynthesisResult.getAudioData() çıkış byte [] verisi döndürür. Bu ile el ile byte [] çalışabilirsiniz veya bellek içinde AudioDataStream akışı yönetmek için sınıfını kullanabilirsiniz. Bu örnekte, sonuçtan AudioDataStream.fromResult() akış almak için statik işlevini kullanırız.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);

    SpeechSynthesisResult result = synthesizer.SpeakText("Getting the response as an in-memory stream.");
    AudioDataStream stream = AudioDataStream.fromResult(result);
    System.out.print(stream.getStatus());
}

Buradan, sonuçta elde edilen nesneyi kullanarak herhangi bir özel davranış stream gerçekleştirebilirsiniz.

Ses biçimini özelleştirme

Aşağıdaki bölümde, aşağıdakiler dahil olmak üzere ses çıkış özniteliklerini özelleştirme adımları ve adımları yer almaktadır:

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

Ses biçimini değiştirmek için nesnede setSpeechSynthesisOutputFormat() işlevini SpeechConfig kullanırsanız. Bu işlev, çıkış enum biçimini SpeechSynthesisOutputFormat seçmek için kullanabileceğiniz türünde bir bekler. Kullanılabilir ses biçimlerinin listesi için başvuru belgelerine bakın.

Gereksinimlerinize bağlı olarak farklı dosya türleri için çeşitli seçenekler vardır. Tanım gereği gibi ham biçimlerin Raw24Khz16BitMonoPcm ses üst bilgisi içermey olduğunu unutmayın. Ham biçimleri yalnızca aşağı akış uygulamanıza ham bit akışı kodunu çöze biliyorsanız veya bit derinliğine, örnek hızına, kanal sayısına vb. göre el ile üst bilgi oluşturmayı planlıyorsanız kullanın.

Bu örnekte, nesnesinde ayarını kullanarak yüksek uygunlukta bir RIFF Riff24Khz16BitMonoPcm SpeechSynthesisOutputFormat biçimi SpeechConfig belirtirsiniz. Önceki bölümdeki örnekte olduğu gibi, sonucun bellek içinde akışını almak için kullanın ve AudioDataStream sonra bunu bir dosyaya yazın.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");

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

    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);
    SpeechSynthesisResult result = synthesizer.SpeakText("Customizing audio output format.");
    AudioDataStream stream = AudioDataStream.fromResult(result);
    stream.saveToWavFile("path/to/write/file.wav");
}

Programınızı yeniden çalıştırarak belirtilen .wav yola bir dosya yazar.

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

Konuşma Sentezi Biçimlendirme Dili (SSML), bir XML şemasından isteklerinizi göndererek konuşmada, söyleyişte, konuşma hızında, hacimde ve daha fazla metinden konuşma çıkışına ince ayar uygulamanıza olanak sağlar. Bu bölümde sesi değiştirme örneği açıklanmıştır, ancak daha ayrıntılı bir kılavuz için SSML nasıl 2. makalesine bakın.

Özelleştirme için SSML kullanmaya başlamak için sesi değiştirecek basit bir değişiklik yapacaktır. İlk olarak, bu örnekte kök proje dizininize SSML yapılandırması için yeni bir XML dosyası ssml.xml oluşturun. Kök öğe her zaman <speak> öğesidir ve metni bir öğeye <voice> sarmalamak, parametresini kullanarak sesi değiştirmenizi name sağlar. Desteklenen sinir seslerinin tam listesine bakın.

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

Ardından XML dosyanıza başvurarak konuşma sentezi isteğini değiştirebilirsiniz. İstek çoğunlukla aynıdır, ancak işlevini kullanmak yerine SpeakText() SpeakSsml() kullanırsanız. Bu işlev bir XML dizesi bekler, bu nedenle ilk olarak bir XML dosyasını yüklemek ve dize olarak iade etmek 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.";
    }
}

Burada sonuç nesnesi, önceki örneklerle tamamen aynıdır.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);

    String ssml = xmlToString("ssml.xml");
    SpeechSynthesisResult result = synthesizer.SpeakSsml(ssml);
    AudioDataStream stream = AudioDataStream.fromResult(result);
    stream.saveToWavFile("path/to/write/file.wav");
}

Not

SSML'i kullanmadan sesi değiştirmek için özelliğini kullanarak SpeechConfig``SpeechConfig.setSpeechSynthesisVoiceName("en-US-ChristopherNeural");

Yüz pozu olaylarını al

Konuşma, yüz ifadelerinin animasyonunu oluşturmak için iyi bir yol olabilir. Genellikle visemes, gözlemlenen konuşmada önemli pozları temsil etmek için kullanılır; örneğin, belirli bir phoneme üreteçler sırasında tırslar, tırtırtılar ve dolgunlar. Yüz animasyonu verilerini almak için Konuşma SDK'sında viseme olaylarını abone olabilir ve ardından verileri yüz animasyonu sırasında bir karaktere uygulayabilirsiniz. Viseme olaylarını nasıl elde etmeyi öğrenin.

Bu hızlı başlangıçta, konuşma SDK 'sını kullanarak metinden konuşmaya senşlerini kullanmaya yönelik yaygın tasarım düzenlerini öğrenirsiniz. Temel yapılandırma ve birleştirme işlemleri gerçekleştirerek başlar ve aşağıdakiler de dahil olmak üzere özel uygulama geliştirme için daha gelişmiş örneklere geçin:

  • Bellek içi akışlar olarak yanıt alma
  • Çıkış örneği hızını ve bit hızını özelleştirme
  • SSML kullanarak senssıs istekleri gönderme (konuşma birleştirme biçimlendirme dili)
  • Sinir seslerini kullanma

GitHub örneklere atlayın

Örnek koda doğrudan atlamak istiyorsanız GitHub JavaScript hızlı başlangıç örneklerine bakın.

Önkoşullar

Bu makalede bir Azure hesabınız ve konuşma hizmeti kaynağınız olduğunu varsaymaktadır. Hesabınız ve kaynağınız yoksa konuşma hizmetini ücretsiz deneyin.

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

Herhangi bir şey yapabilmeniz için önce JavaScript Için konuşma SDK 'sını yüklemeniz gerekir. Platformunuza bağlı olarak, aşağıdaki yönergeleri kullanın:

Ayrıca, hedef ortama bağlı olarak, aşağıdakilerden birini kullanın:

JavaScript microsoft.cognitiveservices.speech.sdk.bundle.js dosyası için konuşma SDK 'sını indirip ayıklayın ve HTML dosyanıza erişilebilen bir klasöre yerleştirin.

<script src="microsoft.cognitiveservices.speech.sdk.bundle.js"></script>;

İpucu

Bir Web tarayıcısını hedefliyorsanız ve etiketini kullanıyorsanız, <script> sdk ön ek gerekli değildir. sdkÖn ek, modülü adlandırmak için kullanılan bir diğer addır require .

Konuşma yapılandırması oluşturma

Konuşma SDK 'sını kullanarak konuşma hizmetini çağırmak için bir oluşturmanız gerekir SpeechConfig . Bu sınıf, konuşma anahtarınız ve ilişkili konum/bölge, uç nokta, ana bilgisayar veya yetkilendirme belirteci gibi kaynağınız hakkındaki bilgileri içerir.

Not

Konuşma tanıma, konuşma birleştirme, çeviri veya amaç tanıma işlemlerini gerçekleştirmekten bağımsız olarak her zaman bir yapılandırma oluşturacaksınız.

Şunları başlatabilmeniz için birkaç yol vardır SpeechConfig :

  • Kaynak ile: konuşma anahtarını ve ilişkili konumu/bölgeyi geçirin.
  • Uç nokta ile: bir konuşma hizmeti uç noktasında geçirin. Konuşma anahtarı veya yetkilendirme belirteci isteğe bağlıdır.
  • Bir ana bilgisayar ile: bir konak adresini geçirin. Konuşma anahtarı veya yetkilendirme belirteci isteğe bağlıdır.
  • Yetkilendirme belirteci ile: bir yetkilendirme belirteci ve ilişkili konum/bölge geçirin.

Bu örnekte, bir SpeechConfig konuşma anahtarı ve konum/bölge kullanarak oluşturabilirsiniz. Konuşma hizmetini ücretsiz deneyinbölümündeki adımları izleyerek bu kimlik bilgilerini alın. Ayrıca, bu makalenin geri kalanı için kullanabileceğiniz, farklı özelleştirmeler için değiştirdiğiniz bazı temel ortak kod oluşturabilirsiniz.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
}

synthesizeSpeech();

Sensıs dili ve ses seçin

Azure Metin Okuma hizmeti 250 'den fazla sesi ve 70 ' den fazla dili ve varyantları destekler. Tam listeyialabilir veya metin olarak konuşma tanıtımınadeneyebilirsiniz. SpeechConfigGiriş metninizle eşleşecek dili veya sesi belirtin ve istenen sesi kullanın.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    // Note: if only language is set, the default voice of that language is chosen.
    speechConfig.speechSynthesisLanguage = "<your-synthesis-language>"; // e.g. "de-DE"
    // The voice setting will overwrite language setting.
    // The voice setting will not overwrite the voice element in input SSML.
    speechConfig.speechSynthesisVoiceName = "<your-wanted-voice>";
}

synthesizeSpeech();

Konuşmayı bir dosyaya sentezleştirme

Sonra, SpeechSynthesizer metin okuma dönüştürmeleri yürüten ve hoparlörlerde, dosyalarda veya diğer çıkış akışlarına giden çıktıları yürüten bir nesne oluşturun. , SpeechSynthesizer SpeechConfig Önceki adımda oluşturulan nesneyi params olarak kabul eder ve AudioConfig Çıkış sonuçlarının nasıl işleneceğini belirten bir nesnedir.

Başlamak için, AudioConfig .wav statik işlevi kullanarak çıktıyı bir dosyaya otomatik olarak yazmak üzere bir oluşturun fromAudioFileOutput() .

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    const audioConfig = sdk.AudioConfig.fromAudioFileOutput("path/to/file.wav");
}

Ardından, SpeechSynthesizer speechConfig nesne ve nesneyi params olarak geçirerek bir örnek oluşturun audioConfig . Daha sonra, konuşma birleştirmenin yürütülmesi ve bir dosyaya yazılması, speakTextAsync() bir metin dizesiyle çalışırken basittir. Sonucun doğru bir şekilde çalışması için sonuç geri çağırması, aslında çağırmak için gereken harika bir yerdir synthesizer.close() .

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    const audioConfig = sdk.AudioConfig.fromAudioFileOutput("path-to-file.wav");

    const synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    synthesizer.speakTextAsync(
        "A simple test to write to a file.",
        result => {
            synthesizer.close();
            if (result) {
                // return result as stream
                return fs.createReadStream("path-to-file.wav");
            }
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

Programı çalıştırın ve belirttiğiniz konuma bir sentezlenmiş .wav dosya yazılır. Bu, en temel kullanımın iyi bir örneğidir, ancak sonraki bir deyişle, özel senaryolarla çalışmaya yönelik bellek içi akış olarak çıktıyı özelleştirmeye ve çıkış yanıtını işlemeye baktığınızın ardından.

Konuşmacı çıktısına sentezleştirme (yalnızca tarayıcı)

Bazı durumlarda, doğrudan sentezlenmiş konuşmayı doğrudan bir konuşmacının çıktısını almak isteyebilirsiniz. Bunu yapmak için AudioConfig static işlevini kullanarak örneğini oluşturun fromDefaultSpeakerOutput() . Bu, geçerli etkin çıkış cihazına çıkış verir.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    const audioConfig = sdk.AudioConfig.fromDefaultSpeakerOutput();

    const synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    synthesizer.speakTextAsync(
        "Synthesizing directly to speaker output.",
        result => {
            if (result) {
                synthesizer.close();
                return result.audioData;
            }
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

Bellek içi akış olarak sonuç alın

Konuşma uygulaması geliştirmede birçok senaryo için, büyük olasılıkla bir dosyaya doğrudan yazmak yerine, sonuçta elde edilen ses verilerinin bellek içi akış olarak olması gerekir. Bu, aşağıdakiler dahil olmak üzere özel davranış oluşturmanıza izin verir:

  • Özel aşağı akış Hizmetleri için arama yapabilecek bir akış olarak ortaya çıkan bayt dizisinin soyut olması.
  • Sonucu diğer API 'leri veya hizmetleriyle tümleştirin.
  • Ses verilerini değiştirin, özel üstbilgiler yazın .wav vb.

Önceki örnekte bu değişikliği yapmak basittir. İlk AudioConfig olarak, daha fazla denetim için çıkış davranışını bu noktadan el ile yöneteceği için bloğu kaldırın. Sonra undefined AudioConfig Oluşturucu içinde öğesine geçirin SpeechSynthesizer .

Not

undefined AudioConfig Yukarıdaki konuşmacı çıktısı örneğinde olduğu gibi değil, için geçirme, geçerli etkin çıkış cihazında varsayılan olarak sesi oynamaz.

Bu kez, sonucu bir SpeechSynthesisResult değişkene kaydedersiniz. SpeechSynthesisResult.audioDataÖzelliği ArrayBuffer , varsayılan tarayıcı akış türü olan çıkış verilerini döndürür. Sunucu kodu için arrayBuffer 'ı bir arabellek akışına dönüştürün.

Aşağıdaki kod, istemci tarafı kodu için geçerlidir.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    const synthesizer = new sdk.SpeechSynthesizer(speechConfig);

    synthesizer.speakTextAsync(
        "Getting the response as an in-memory stream.",
        result => {
            synthesizer.close();
            return result.audioData;
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

Buradan, sonuçta elde edilen nesneyi kullanarak özel davranışları uygulayabilirsiniz ArrayBuffer . ArrayBuffer, bir tarayıcıda alacak ve bu biçimden oynatacak ortak bir türdür.

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

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    const synthesizer = new sdk.SpeechSynthesizer(speechConfig);

    synthesizer.speakTextAsync(
        "Getting the response as an in-memory stream.",
        result => {
            const { audioData } = result;

            synthesizer.close();

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

Ses biçimini Özelleştir

Aşağıdaki bölümde aşağıdakiler dahil olmak üzere ses çıkış özniteliklerinin nasıl özelleştirileceği gösterilmektedir:

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

Ses biçimini değiştirmek için speechSynthesisOutputFormat nesnesi üzerinde özelliğini kullanın SpeechConfig . Bu özellik enum SpeechSynthesisOutputFormat , çıkış biçimini seçmek için kullandığınız türünde bir tür bekliyor. Kullanılabilir Ses biçimlerinin listesi için başvuru belgelerine bakın.

Gereksinimlerinize bağlı olarak farklı dosya türleri için çeşitli seçenekler vardır. Tanımına göre, gibi ham biçimlerin Raw24Khz16BitMonoPcm Ses üst bilgilerini içermediğini unutmayın. Ham biçimleri yalnızca aşağı akış uygulamanızın bir ham Bitstream kodunu çözemediğini veya bit derinliğine, örnek hızına, kanal sayısına ve vb. göre el ile üstbilgileri oluşturmayı planlıyorsanız kullanın.

Bu örnekte, Riff24Khz16BitMonoPcm nesnesi üzerinde ayarını yaparak Yüksek uygunluğa sahip bir biçim belirtirsiniz speechSynthesisOutputFormat SpeechConfig . Önceki bölümdeki örneğe benzer şekilde, ses ArrayBuffer verilerini alın ve onunla etkileşime geçin.

function synthesizeSpeech() {
    const speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");

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

    const synthesizer = new sdk.SpeechSynthesizer(speechConfig, undefined);
    synthesizer.speakTextAsync(
        "Customizing audio output format.",
        result => {
            // Interact with the audio ArrayBuffer data
            const audioData = result.audioData;
            console.log(`Audio data byte size: ${audioData.byteLength}.`)

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

Programınızı yeniden çalıştırmak, .wav belirtilen yola bir dosya yazacak.

SSML 'yi kullanarak konuşma özelliklerini özelleştirme

Konuşma sen, biçimlendirme dili (SSML), isteklerinizi bir XML şemasından göndererek, metin okuma çıktılarından oluşan sıklık, Söyleniş, konuşma oranı, hacim ve daha fazlasını ayarlamanıza olanak sağlar. Bu bölümde, sesi değiştirme örneği gösterilmektedir, ancak daha ayrıntılı bir kılavuz için bkz. SSML nasıl yapılır makalesi.

Özelleştirme için SSML 'yi kullanmaya başlamak için, sese geçiş yapan basit bir değişiklik yaparsınız. İlk olarak, bu örnekte, kök proje dizininizde SSML yapılandırması için yeni bir XML dosyası oluşturun ssml.xml . Kök öğesi her zaman <speak> ve metni bir öğe içinde sarmalama, <voice> param kullanarak sesi değiştirmenize olanak sağlar name . Desteklenen sinir sesin tam listesine bakın.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-US-ChristopherNeural">
    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 sensıs isteğini değiştirmeniz gerekir. İstek genellikle aynıdır, ancak işlevini kullanmak yerine speakTextAsync() kullanın speakSsmlAsync() . Bu işlev bir XML dizesi bekliyor, bu nedenle ilk olarak bir XML dosyası yüklemek için bir işlev oluşturun ve bunu bir dize olarak döndürün.

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

Hakkında daha fazla bilgi için readFileSync bkz. Node.js dosya sistemi. Buradan, sonuç nesnesi önceki örneklerle tamamen aynıdır.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    const synthesizer = new sdk.SpeechSynthesizer(speechConfig, undefined);

    const ssml = xmlToString("ssml.xml");
    synthesizer.speakSsmlAsync(
        ssml,
        result => {
            if (result.errorDetails) {
                console.error(result.errorDetails);
            } else {
                console.log(JSON.stringify(result));
            }

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

Not

SSML kullanmadan sesi değiştirmek için, özelliğini SpeechConfig kullanarak SpeechConfig.speechSynthesisVoiceName = "en-US-ChristopherNeural";

Yüz poz olaylarını al

Konuşma, yüz ifadelerinin animasyonunu sağlamak için iyi bir yol olabilir. Genellikle visemes , belirli bir phoneme oluşturma sırasında LIP 'ler, Jaw ve dil sistemi gibi gözlemlenen konuşmayla ilgili önemli pozları temsil etmek için kullanılır. Konuşma SDK 'sında viseme olayına abone olabilirsiniz. Daha sonra, konuşma sesi oynatılırken bir karakter yüzünüzü hareketlendirmek için viseme olaylarını uygulayabilirsiniz. Viseme olaylarını nasıl alabileceğiniziöğrenin.

Swift ve Objective-C için Konuşma SDK'sını kullanarak metinden konuşma sentezlersiniz.

Önkoşullar

Aşağıdaki örneklerde, bir Azure hesabınız ve Konuşma hizmeti aboneliğiniz olduğu varsay hesabı ve konuşma hizmeti aboneliğiniz vardır. Hesabınız ve aboneliğiniz yoksa Konuşma hizmetini ücretsiz olarak deneyin.

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

Bilişsel Hizmetler Konuşma SDK'sı, iOS ve Mac için Swift ve Objective-C'de yazılmış örnekler içerir. Her örnek için yükleme yönergelerini görmek için bir bağlantıya tıklayın:

Ayrıca Objective-C Başvurusu için çevrimiçi bir Konuşma SDK'sı da sağlaruz.

Bu hızlı başlangıçta, Konuşma SDK'sı kullanarak metin-konuşma sentezi yapmak için yaygın tasarım desenlerini öğrenirsiniz. Temel yapılandırma ve sentezle başlar ve aşağıdakiler dahil olmak üzere özel uygulama geliştirme için daha gelişmiş örneklere geçebilirsiniz:

  • Yanıtları bellek içinde akışlar olarak alma
  • Çıkış örnek oranını ve bit oranını özelleştirme
  • SSML kullanarak sentez istekleri gönderme (konuşma sentezi işaretleme dili)
  • Sinir seslerini kullanma

GitHub'da örneklere atla

Doğrudan örnek koda atlamak için aşağıdaki Python hızlı başlangıç örneklerine GitHub.

Önkoşullar

Bu makalede, bir Azure hesabınız ve Konuşma hizmeti aboneliğiniz olduğu varsaylanmıştır. Hesabınız ve aboneliğiniz yoksa Konuşma hizmetini ücretsiz olarak deneyin.

Konuşma SDK'sı yükleme

Herhangi bir şey yapamadan önce Konuşma SDK'sı yüklemeniz gerekir.

pip install azure-cognitiveservices-speech

macOS'taysanız ve yükleme sorunlarıyla ilgili sorunlarınız varsa önce bu komutu çalıştırmanız gerekir.

python3 -m pip install --upgrade pip

Konuşma SDK'sı yüklendikten sonra, betiğinizin en üstüne aşağıdaki içeri aktarma deyimlerini dahil edin.

from azure.cognitiveservices.speech import AudioDataStream, SpeechConfig, SpeechSynthesizer, SpeechSynthesisOutputFormat
from azure.cognitiveservices.speech.audio import AudioOutputConfig

Konuşma yapılandırması oluşturma

Konuşma SDK'sını kullanarak Konuşma hizmetine çağrı yapmak için bir oluşturmanız SpeechConfig gerekir. Bu sınıf, konuşma anahtarınız ve ilişkili konum/bölge, uç nokta, konak veya yetkilendirme belirteci gibi aboneliğiniz hakkında bilgiler içerir.

Not

Konuşma tanıma, konuşma sentezi, çeviri veya amaç tanıma gerçekleştirip gerçekleştirmeden bağımsız olarak her zaman bir yapılandırma oluşturmanız gerekir.

Bir başlatabilirsiniz birkaç yolu SpeechConfig vardır:

  • Abonelik ile: Konuşma anahtarını ve ilişkili konumu/bölgeyi geçin.
  • Uç nokta ile: Konuşma hizmeti uç noktasını iletir. Konuşma anahtarı veya yetkilendirme belirteci isteğe bağlıdır.
  • Bir konak ile: bir konak adresi girin. Konuşma anahtarı veya yetkilendirme belirteci isteğe bağlıdır.
  • Yetkilendirme belirteci ile: Yetkilendirme belirteci ve ilişkili konumu/bölgeyi iletir.

Bu örnekte, konuşma anahtarı ve SpeechConfig konum/bölge kullanarak bir oluşturabilirsiniz. Konuşma tanıma hizmetini ücretsiz deneyin adımlarını takip edin.

speech_config = SpeechConfig(subscription="<paste-your-speech-key-here>", region="<paste-your-speech-location/region-here>")

Sentez dilini ve sesi seçme

Azure Metin Okuma hizmeti 250'den fazla sesi ve 70'den fazla dili ve varyantı destekler. Listesinin tamamını veya konuşmayımetne indiren metinlerde ekleyebilirsiniz. Giriş metninize uygun dili SpeechConfig veya sesi belirtin ve istediğiniz sesi kullanın.

# Note: if only language is set, the default voice of that language is chosen.
speech_config.speech_synthesis_language = "<your-synthesis-language>" # e.g. "de-DE"
# The voice setting will overwrite language setting.
# The voice setting will not overwrite the voice element in input SSML.
speech_config.speech_synthesis_voice_name ="<your-wanted-voice>"

Konuşmayı dosyaya sentezleme

Ardından, konuşmayı metne dönüştürmeleri ve çıkışları konuşmacılara, dosyalara veya diğer çıkış akışlarına SpeechSynthesizer yürüten bir nesnesi oluşturun. , önceki adımda oluşturulan nesnesini ve çıkış sonuçlarının nasıl iş gerektiğini belirten bir nesneyi parametre SpeechSynthesizer SpeechConfig olarak kabul AudioOutputConfig eder.

Başlamak için, oluşturucu AudioOutputConfig parametresini kullanarak çıktıyı otomatik olarak .wav bir dosyaya yazmak için bir filename oluşturun.

audio_config = AudioOutputConfig(filename="path/to/write/file.wav")

Ardından, nesnenizi ve SpeechSynthesizer nesnesini parametre speech_config olarak geçerek bir örneği audio_config oluşturma. Ardından konuşma sentezini yürütmek ve bir dosyaya yazmak, bir metin speak_text_async() dizesiyle çalışma kadar kolaydır.

synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
synthesizer.speak_text_async("A simple test to write to a file.")

Programı çalıştırın; belirttiğiniz konuma .wav sentezlenmiş bir dosya yazılır. Bu, en temel kullanımın iyi bir örneğidir, ancak bir sonraki adım, çıkışı özelleştirmeye ve çıkış yanıtını özel senaryolarla çalışmak için bellek içinde bir akış olarak işlemeye göz atabilirsiniz.

Konuşmacı çıkışına sentezleme

Bazı durumlarda sentezlenmiş konuşmayı doğrudan bir konuşmacıya doğrudan çıkış olarak almak istemeyebilirsiniz. Bunu yapmak için önceki bölümdeki örneği kullanın, ancak parametresini kaldırarak parametresini AudioOutputConfig filename değiştirerek ve olarak use_default_speaker=True ayarlayın. Bu, geçerli etkin çıkış cihazına verir.

audio_config = AudioOutputConfig(use_default_speaker=True)

Bellek içinde akış olarak sonuç al

Konuşma uygulaması geliştirmeyle ilgili birçok senaryo için, elde edilen ses verileri büyük olasılıkla doğrudan bir dosyaya yazmak yerine bellek içinde bir akış olarak gerekir. Bu, şunları içeren özel davranış oluşturmanızı sağlar:

  • Elde edilen byte dizisini, özel aşağı akış hizmetleri için bir arama akışı olarak soyutlar.
  • Sonucu diğer API'ler veya hizmetlerle tümleştirin.
  • Ses verilerini değiştirme, özel üst .wav bilgiler yazma vb.

Bu değişikliği önceki örnekten yapmak oldukça kolaydır. İlk olarak, artan denetim için bu noktadan itibaren çıkış AudioConfig davranışını el ile yönetecek şekilde , kaldırın. Ardından None oluşturucuda AudioConfig için SpeechSynthesizer 'i geçiş.

Not

için geçiş, yukarıdaki konuşmacı çıkışı örneğinde olduğu gibi bu değerin dışında tutularak geçerli etkin çıkış cihazında varsayılan None AudioConfig olarak ses çalmaz.

Bu kez sonucu bir değişkene SpeechSynthesisResult kaydedin. özelliği, audio_data çıkış bytes verisi nesnesini içerir. Bu nesneyle el ile çalışabilirsiniz veya bellek içinde akışı AudioDataStream yönetmek için sınıfını kullanabilirsiniz. Bu örnekte, sonuçtan AudioDataStream bir akış almak için oluşturucusu kullanırız.

synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=None)
result = synthesizer.speak_text_async("Getting the response as an in-memory stream.").get()
stream = AudioDataStream(result)

Buradan, sonuçta elde edilen nesneyi kullanarak herhangi bir özel davranış stream gerçekleştirebilirsiniz.

Ses biçimini özelleştirme

Aşağıdaki bölümde, aşağıdakiler dahil olmak üzere ses çıkış özniteliklerini özelleştirme adımları ve adımları yer almaktadır:

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

Ses biçimini değiştirmek için nesnede set_speech_synthesis_output_format() işlevini SpeechConfig kullanırsanız. Bu işlev, çıkış enum biçimini SpeechSynthesisOutputFormat seçmek için kullanabileceğiniz türünde bir bekler. Kullanılabilir ses biçimlerinin listesi için başvuru belgelerine bakın.

Gereksinimlerinize bağlı olarak farklı dosya türleri için çeşitli seçenekler vardır. Tanım gereği gibi ham biçimlerin Raw24Khz16BitMonoPcm ses üst bilgisi içermey olduğunu unutmayın. Ham biçimleri yalnızca aşağı akış uygulamanıza ham bit akışı kodunu çöze biliyorsanız veya bit derinliğine, örnek hızına, kanal sayısına vb. göre el ile üst bilgi oluşturmayı planlıyorsanız kullanın.

Bu örnekte, nesnesinde ayarını kullanarak yüksek uygunlukta bir RIFF Riff24Khz16BitMonoPcm SpeechSynthesisOutputFormat biçimi SpeechConfig belirtirsiniz. Önceki bölümdeki örnekte olduğu gibi, sonucun bellek içinde akışını almak için kullanın ve AudioDataStream sonra bunu bir dosyaya yazın.

speech_config.set_speech_synthesis_output_format(SpeechSynthesisOutputFormat["Riff24Khz16BitMonoPcm"])
synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=None)

result = synthesizer.speak_text_async("Customizing audio output format.").get()
stream = AudioDataStream(result)
stream.save_to_wav_file("path/to/write/file.wav")

Programınızı yeniden çalıştırmanız, belirtilen yola .wav özelleştirilmiş bir dosya yazar.

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

Konuşma Sentezi Biçimlendirme Dili (SSML), bir XML şemasından isteklerinizi göndererek konuşmada, söyleyişte, konuşma hızında, hacimde ve daha fazla metinden konuşma çıkışına ince ayar uygulamanıza olanak sağlar. Bu bölümde sesi değiştirme örneği açıklanmıştır, ancak daha ayrıntılı bir kılavuz için SSML nasıl 2. makalesine bakın.

Özelleştirme için SSML kullanmaya başlamak için sesi değiştirecek basit bir değişiklik yapacaktır. İlk olarak, bu örnekte kök proje dizininize SSML yapılandırması için yeni bir XML dosyası ssml.xml oluşturun. Kök öğe her zaman <speak> öğesidir ve metni bir öğeye <voice> sarmalamak, parametresini kullanarak sesi değiştirmenizi name sağlar. Desteklenen sinir seslerinin tam listesine bakın.

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

Ardından XML dosyanıza başvurarak konuşma sentezi isteğini değiştirebilirsiniz. İstek çoğunlukla aynıdır, ancak işlevini kullanmak yerine speak_text_async() speak_ssml_async() kullanırsanız. Bu işlev bir XML dizesi bekler, bu nedenle ilk olarak SSML yapılandırmanızı bir dize olarak okuruz. Burada sonuç nesnesi, önceki örneklerle tamamen aynıdır.

Not

dizenin ssml_string başında içeriyorsanız BOM biçiminden çıkarsanız, hizmet  bir hata döndürür. Bunu yapmak için parametresini encoding şu şekilde ayarlarsanız: open("ssml.xml", "r", encoding="utf-8-sig") .

synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=None)

ssml_string = open("ssml.xml", "r").read()
result = synthesizer.speak_ssml_async(ssml_string).get()

stream = AudioDataStream(result)
stream.save_to_wav_file("path/to/write/file.wav")

Not

SSML'i kullanmadan sesi değiştirmek için özelliğini kullanarak SpeechConfig``SpeechConfig.speech_synthesis_voice_name = "en-US-ChristopherNeural"

Yüz pozu olaylarını al

Konuşma, yüz ifadelerinin animasyonunu oluşturmak için iyi bir yol olabilir. Genellikle visemes, gözlemlenen konuşmada önemli pozları temsil etmek için kullanılır; örneğin, belirli bir phoneme üreteçler sırasında tırslar, tırtırtılar ve dolgunlar. Konuşma SDK'sında viseme olayına abone olabilirsiniz. Ardından, konuşma sesi oynatilirken bir karakterin yüzüne animasyon uygulamak için viseme olayları uygulayabilirsiniz. Viseme olaylarını nasıl elde etmeyi öğrenin.

Bu hızlı başlangıçta, konuşma hizmeti ve kıvrımlı kullanarak metin okumayı nasıl dönüştürebileceğinizi öğreneceksiniz.

Metin okuma kavramlarının üst düzey bir görünümü için bkz. genel bakış makalesi.

Önkoşullar

Bu makalede bir Azure hesabınız ve konuşma hizmeti aboneliğiniz olduğunu varsaymaktadır. Hesabınız ve aboneliğiniz yoksa konuşma hizmetini ücretsiz deneyin.

Metni konuşmaya Dönüştür

Komut isteminde aşağıdaki komutu çalıştırın. Komutuna aşağıdaki değerleri eklemeniz gerekir.

  • Konuşma hizmeti abonelik anahtarınız.
  • Konuşma hizmeti bölgeniz.

Ayrıca, aşağıdaki değerleri değiştirmek isteyebilirsiniz.

  • X-Microsoft-OutputFormatSes çıkış biçimini denetleyen üst bilgi değeri. Desteklenen ses çıkış biçimlerinin bir listesini, metinden konuşmaya REST API başvurusundabulabilirsiniz.
  • Çıktı sesi. Konuşma uç noktanız için kullanılabilen seslerin listesini almak için sonraki bölüme bakın.
  • Çıkış dosyası. Bu örnekte, sunucusundan gelen yanıtı adlı bir dosyaya yönlendirdik output.wav .
curl --location --request POST 'https://INSERT_REGION_HERE.tts.speech.microsoft.com/cognitiveservices/v1' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--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 xml:lang='\''en-US'\'' xml:gender='\''Female'\'' name='\''en-US-JennyNeural'\''>
        my voice is my passport verify me
    </voice>
</speak>' > output.mp3

Konuşma uç noktanız için kullanılabilir seslerinizi listeleyin

Konuşma uç noktanız için kullanılabilir seslerinizi listelemek için aşağıdaki komutu çalıştırın.

curl --location --request GET 'https://INSERT_ENDPOINT_HERE.tts.speech.microsoft.com/cognitiveservices/voices/list' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE'

Aşağıdakine benzer bir yanıt almanız gerekir.

[
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ar-EG, Hoda)",
        "DisplayName": "Hoda",
        "LocalName": "هدى",
        "ShortName": "ar-EG-Hoda",
        "Gender": "Female",
        "Locale": "ar-EG",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ar-SA, Naayf)",
        "DisplayName": "Naayf",
        "LocalName": "نايف",
        "ShortName": "ar-SA-Naayf",
        "Gender": "Male",
        "Locale": "ar-SA",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (bg-BG, Ivan)",
        "DisplayName": "Ivan",
        "LocalName": "Иван",
        "ShortName": "bg-BG-Ivan",
        "Gender": "Male",
        "Locale": "bg-BG",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        // This response is truncated. The response will include 
        // a complete list of supported languages and specific 
        // details like short name, gender, etc. 
    }
]

Bu hızlı başlangıçta, Konuşma SDK'sı kullanarak metin-konuşma sentezi yapmak için yaygın tasarım desenlerini öğrenirsiniz. Temel yapılandırma ve sentezle başlar ve aşağıdakiler dahil olmak üzere özel uygulama geliştirme için daha gelişmiş örneklere geçebilirsiniz:

  • Yanıtları bellek içinde akışlar olarak alma
  • Çıkış örnek oranını ve bit oranını özelleştirme
  • SSML kullanarak sentez istekleri gönderme (konuşma sentezi işaretleme dili)
  • Sinir seslerini kullanma

Önkoşullar

Bu makalede, bir Azure hesabınız ve Konuşma hizmeti aboneliğiniz olduğu varsaylanmıştır. Hesabınız ve aboneliğiniz yoksa Konuşma hizmetini ücretsiz olarak deneyin.

İndirme ve yükleme

Konuşma CLI'sini aşağıdaki adımlarla Windows:

  1. Bu Windows, platform Microsoft Visual C++ 2019 için Visual Studio Yeniden Dağıtılabilir'e ihtiyacınız vardır. Bunu ilk kez yüklemek için yeniden başlatmanız gerekir.

  2. .NET Core 3.1 SDK'sı yükleyin.

  3. Şu komutu girerek NuGet KONUŞMA CLI'sini yükleyin:

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    

Konuşma spx CLI'sı için yardım görmek için yazın.

Not

Bu dosyanın alternatif NuGet zip dosyası olarak Windows için Konuşma CLI'sini indirip ayıkabilirsiniz.

Yazı tipi sınırlamaları

Bu Windows Konuşma CLI'sı yalnızca yerel bilgisayarda komut isteminde kullanılabilen yazı tiplerini gösterebilir. Windows Terminal Konuşma CLI'sı tarafından etkileşimli olarak üretilen tüm yazı tiplerini destekler.

Bir dosyaya çıktı oluşturursanız, Not Defteri gibi bir metin düzenleyicisi veya Microsoft Edge gibi bir web tarayıcısı da tüm yazı tiplerini gösterebilir.

Konuşmayı hoparlöre sentezleme

Artık konuşmayı metinden sentezlemek için Konuşma CLI'sını çalıştırmaya hazır oluruz. Komut satırına, Konuşma CLI'sı ikili dosyasını içeren dizine yazın. Ardından aşağıdaki komutu çalıştırın.

spx synthesize --text "The speech synthesizer greets you!"

Konuşma CLI'sı, bilgisayar konuşmacısı aracılığıyla İngilizce doğal dil üretecek.

Konuşmayı dosyaya sentezleme

Konuşmacının çıktısını bir dosyaya değiştirmek için aşağıdaki komutu .wav çalıştırın.

spx synthesize --text "The speech synthesizer greets you!" --audio output greetings.wav

Konuşma CLI'sı, ses dosyasında İngilizce doğal dil greetings.wav üretecek. Bu Windows girerek ses dosyasını start greetings.wav oynatabilirsiniz.

Konum bilgilerini al

Projenizin belirli bir zamanlamayı temel alarak belirli bir eyleme geçerek bir sözcüğün metinden konuşmayla ne zaman konuşularak konuşularak tamamlana kadar devam etmek zorunda olduğunu bilmek zorunda olabilir. Örneğin, konuşulan sözcükleri vurgulamak için nelerin vurgulan, ne zaman vurgulanır ve ne kadar süreyle vurgulanır?

Bunu içinde kullanılabilir olayı WordBoundary kullanarak SpeechSynthesizer gerçekleştirin. Bu etkinlik her yeni konuşulan sözcüğün başında ortaya çıkar ve konuşulan akış içinde bir zaman farkı ve giriş isteminde bir metin uzaklığı sağlar.

  • AudioOffset , çıkış seslerinin sentezin başlangıcı ile bir sonraki sözcüğün başlangıcı arasındaki geçen zamanı raporlar. Bu, 1 milisaniyeye eşdeğer 10.000 HNS ile yüz nanosaniye (HNS) cinsinden ölçülür.
  • WordOffset , giriş dizesinde karakter konumunu (özgün metin veya SSML)konuşmanın hemen öncesinde raporlar.

Not

WordBoundary olaylar, çıkış ses verileri kullanılabilir hale geldi ve bu da bir çıkış cihazında kayıttan yürütmeden daha hızlı olacaktır. Akış zamanlamasını "gerçek zamanlı" olarak uygun şekilde eşitlemek, çağıranın tarafından gerçek zamanlı olarak gerçeklenmesi gerekir.

Örnek olarak, uygulamanın WordBoundary metinden konuşma örneklerine GitHub.

Sonraki adımlar