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.
Konuşan ses, öncelik sırasına göre aşağıdaki gibi belirlenir:
- veya
SpeechSynthesisLanguage
seçeneğini ayarlamazsanızSpeechSynthesisVoiceName
, içinen-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
SpeechSynthesisVoiceName
SpeechSynthesisLanguage
ayarlandıysa,SpeechSynthesisLanguage
ayar yoksayılır. Konuşmaları kullanarakSpeechSynthesisVoiceName
belirttiğiniz ses. - Ses öğesi Konuşma Sentezi Biçimlendirme Dili (SSML) kullanılarak ayarlanırsa ve
SpeechSynthesisVoiceName
SpeechSynthesisLanguage
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:
- Önceki adımda oluşturduğunuz SpeechConfig nesnesi.
- Çıkış sonuçlarının nasıl işleneceğini belirten bir AudioConfig nesnesi.
işlevini kullanarak
FromWavFileOutput()
çıktıyı otomatik olarak bir .wav dosyasına yazmak için birAudioConfig
örnek oluşturun. Birusing
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.Başka
using
bir deyimle örnekSpeechSynthesizer
örneği oluşturun. NesnenizispeechConfig
veaudioConfig
nesnesini parametre olarak geçirin. Konuşmayı sentezlemek ve dosyaya yazmak için bir metin dizesiyle komutunu çalıştırınSpeakTextAsync()
.
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 AudioConfig
SpeechSynthesizer
. 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 AudioConfig
geç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 SpeechSynthesisOutputFormat
SpeechConfig
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.
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ştirmenizename
olanak tanır. Desteklenen sinir seslerinin tam listesi için bkz . Desteklenen diller.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ızSpeakSsmlAsync()
. Bu işlev bir XML dizesi bekler. İlk olarak, kullanarakFile.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 SpeechSynthesisVoiceName
ile 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.
Konuşan ses, öncelik sırasına göre aşağıdaki gibi belirlenir:
- veya
SpeechSynthesisLanguage
seçeneğini ayarlamazsanızSpeechSynthesisVoiceName
, içinen-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
SpeechSynthesisVoiceName
SpeechSynthesisLanguage
ayarlandıysa,SpeechSynthesisLanguage
ayar yoksayılır. Konuşmaları kullanarakSpeechSynthesisVoiceName
belirttiğiniz ses. - Ses öğesi Konuşma Sentezi Biçimlendirme Dili (SSML) kullanılarak ayarlanırsa ve
SpeechSynthesisVoiceName
SpeechSynthesisLanguage
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:
- Önceki adımda oluşturduğunuz SpeechConfig nesnesi.
- Çıkış sonuçlarının nasıl işleneceğini belirten bir AudioConfig nesnesi.
AudioConfig
işlevini kullanarakFromWavFileOutput()
çı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"); }
Örnek oluşturma
SpeechSynthesizer
. NesnenizispeechConfig
veaudioConfig
nesnesini parametre olarak geçirin. Konuşmayı sentezlemek ve dosyaya yazmak için bir metin dizesiyle komutunu çalıştırınSpeakTextAsync()
.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 AudioConfig
SpeechSynthesizer
. 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 AudioConfig
geç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 SpeechSynthesisOutputFormat
SpeechConfig
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.
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ştirmenizename
olanak tanır. Desteklenen sinir seslerinin tam listesi için bkz . Desteklenen diller.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ızSpeakSsmlAsync()
. 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 SpeechSynthesisVoiceName
ile 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 subscription
region
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 SpeechSynthesizer
nil
.
Not
önceki konuşmacı çıktı örneğinde yaptığınız gibi yerine için geçirildiğinde nil
AudioConfig
, 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 subscription
region
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.
Konuşan ses, öncelik sırasına göre aşağıdaki gibi belirlenir:
- veya
SpeechSynthesisLanguage
seçeneğini ayarlamazsanızSpeechSynthesisVoiceName
, içinen-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
SpeechSynthesisVoiceName
SpeechSynthesisLanguage
ayarlandıysa,SpeechSynthesisLanguage
ayar yoksayılır. Konuşmaları kullanarakSpeechSynthesisVoiceName
belirttiğiniz ses. - Ses öğesi Konuşma Sentezi Biçimlendirme Dili (SSML) kullanılarak ayarlanırsa ve
SpeechSynthesisVoiceName
SpeechSynthesisLanguage
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.
Konuşan ses, öncelik sırasına göre aşağıdaki gibi belirlenir:
- veya
SpeechSynthesisLanguage
seçeneğini ayarlamazsanızSpeechSynthesisVoiceName
, içinen-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
SpeechSynthesisVoiceName
SpeechSynthesisLanguage
ayarlandıysa,SpeechSynthesisLanguage
ayar yoksayılır. KullanarakSpeechSynthesisVoiceName
belirttiğiniz ses, konuşmaları ifade eder. - Ses öğesi Konuşma Sentezi Biçimlendirme Dili (SSML) kullanılarak ayarlanırsa ve
SpeechSynthesisVoiceName
SpeechSynthesisLanguage
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.
AudioConfig
Statik işlevi kullanarakfromWavFileOutput()
çı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"); }
Örnek oluşturma
SpeechSynthesizer
. NesnenizispeechConfig
veaudioConfig
nesnesini parametre olarak geçirin. Konuşmayı sentezlemek ve dosyaya yazmak için bir metin dizesiyle komutunu çalıştırınSpeakText()
.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 SpeechSynthesizer
null
.
Not
null
önceki konuşmacı çıktı örneğinde yaptığınız gibi yerine için AudioConfig
geç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 SpeechSynthesisOutputFormat
SpeechConfig
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.
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ştirmenizename
olanak tanır. Desteklenen sinir seslerinin tam listesi için bkz . Desteklenen diller.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ızSpeakSsml()
. 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 SpeechSynthesisVoiceName
ile 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.
Konuşan ses, öncelik sırasına göre aşağıdaki gibi belirlenir:
- veya
SpeechSynthesisLanguage
seçeneğini ayarlamazsanızSpeechSynthesisVoiceName
, içinen-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
SpeechSynthesisVoiceName
SpeechSynthesisLanguage
ayarlandıysa,SpeechSynthesisLanguage
ayar yoksayılır. Konuşmaları kullanarakSpeechSynthesisVoiceName
belirttiğiniz ses. - Ses öğesi Konuşma Sentezi Biçimlendirme Dili (SSML) kullanılarak ayarlanırsa ve
SpeechSynthesisVoiceName
SpeechSynthesisLanguage
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 SpeechSynthesizer
null
.
Not
null
önceki konuşmacı çıktı örneğinde yaptığınız gibi yerine için AudioConfig
geç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 speechSynthesisOutputFormat
SpeechConfig
ö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 speechSynthesisOutputFormat
SpeechConfig
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.
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ştirmenizename
olanak tanır. Desteklenen sinir seslerinin tam listesi için bkz . Desteklenen diller.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ızspeakSsmlAsync()
. 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
readFileSync
daha 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:
- macOS'ta Objective-C'de konuşmayı sentezle
- iOS'ta Objective-C'de konuşmayı sentezle
- iOS'ta Objective-C için daha fazla örnek
Ö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 SpeechSynthesisVoiceName
ile 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.
Konuşan ses, öncelik sırasına göre aşağıdaki gibi belirlenir:
- veya
SpeechSynthesisLanguage
seçeneğini ayarlamazsanızSpeechSynthesisVoiceName
, içinen-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
SpeechSynthesisVoiceName
SpeechSynthesisLanguage
ayarlandıysa,SpeechSynthesisLanguage
ayar yoksayılır. Konuşmaları kullanarakSpeechSynthesisVoiceName
belirttiğiniz ses. - Ses öğesi Konuşma Sentezi Biçimlendirme Dili (SSML) kullanılarak ayarlanırsa ve
SpeechSynthesisVoiceName
SpeechSynthesisLanguage
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:
- Önceki
SpeechConfig
adımda oluşturduğunuz nesne. AudioOutputConfig
Çıkış sonuçlarının nasıl işleneceğini belirten bir nesne.
AudioOutputConfig
Oluşturucu parametresini kullanarakfilename
çı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")
SpeechSynthesizer
Nesnenizispeech_config
veaudio_config
nesnesini parametre olarak geçirerek örneğinizi belirleyin. Konuşmayı sentezlemek ve dosyaya yazmak için bir metin dizesiyle komutunu çalıştırınspeak_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 AudioConfig
geç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 SpeechSynthesisOutputFormat
SpeechConfig
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.
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ştirmenizename
olanak tanır. Desteklenen sinir seslerinin tam listesi için bkz . Desteklenen diller.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ınspeak_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. Parametresiniencoding
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_name
ile 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.mp3
bir 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.
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
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ştirinREGION
.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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin