Konuşma SDK'sı kullanarak konuşma sentezi gecikme süresini kısaltma
Sentez gecikmesi uygulamalarınız için kritik öneme sahiptir. Bu makalede, gecikme süresini azaltmak ve son kullanıcılarınıza en iyi performansı sunmak için en iyi yöntemleri tanıtacağız.
Normalde gecikme süresini first byte latency
ve finish latency
ile ölçeriz:
Gecikme süresi | Açıklama | SpeechSynthesisResult özellik anahtarı |
---|---|---|
ilk bayt gecikme süresi | Sentez görevinin başlangıcı ile ses verilerinin ilk öbeklerinin alınması arasındaki gecikme süresini gösterir. | SpeechServiceResponse_SynthesisFirstByteLatencyMs |
bitiş gecikmesi | Sentez görevinin başlangıcı ile sentezlenen ses verilerinin tamamının alınması arasındaki gecikme süresini gösterir. | SpeechServiceResponse_SynthesisFinishLatencyMs |
Konuşma SDK'sı gecikme sürelerini Özellikler koleksiyonuna SpeechSynthesisResult
yerleştirir. Aşağıdaki örnek kod bu değerleri gösterir.
var result = await synthesizer.SpeakTextAsync(text);
Console.WriteLine($"first byte latency: \t{result.Properties.GetProperty(PropertyId.SpeechServiceResponse_SynthesisFirstByteLatencyMs)} ms");
Console.WriteLine($"finish latency: \t{result.Properties.GetProperty(PropertyId.SpeechServiceResponse_SynthesisFinishLatencyMs)} ms");
// you can also get the result id, and send to us when you need help for diagnosis
var resultId = result.ResultId;
Gecikme süresi | Açıklama | SpeechSynthesisResult özellik anahtarı |
---|---|---|
first byte latency |
Sentezin başlamasıyla ilk ses öbeklerinin alınması arasındaki gecikme süresini gösterir. | SpeechServiceResponse_SynthesisFirstByteLatencyMs |
finish latency |
Sentezin başlaması ve sentezlenen sesin tamamının alınması arasındaki gecikme süresini gösterir. | SpeechServiceResponse_SynthesisFinishLatencyMs |
Konuşma SDK'sı gecikme sürelerini ölçtü ve özelliğinin çantasına SpeechSynthesisResult
yerleştirir. Almak için aşağıdaki kodlara bakın.
auto result = synthesizer->SpeakTextAsync(text).get();
auto firstByteLatency = std::stoi(result->Properties.GetProperty(PropertyId::SpeechServiceResponse_SynthesisFirstByteLatencyMs));
auto finishedLatency = std::stoi(result->Properties.GetProperty(PropertyId::SpeechServiceResponse_SynthesisFinishLatencyMs));
// you can also get the result id, and send to us when you need help for diagnosis
auto resultId = result->ResultId;
Gecikme süresi | Açıklama | SpeechSynthesisResult özellik anahtarı |
---|---|---|
first byte latency |
Sentezin başlamasıyla ilk ses öbeklerinin alınması arasındaki gecikme süresini gösterir. | SpeechServiceResponse_SynthesisFirstByteLatencyMs |
finish latency |
Sentezin başlaması ve sentezlenen sesin tamamının alınması arasındaki gecikme süresini gösterir. | SpeechServiceResponse_SynthesisFinishLatencyMs |
Konuşma SDK'sı gecikme sürelerini ölçtü ve özelliğinin çantasına SpeechSynthesisResult
yerleştirir. Almak için aşağıdaki kodlara bakın.
SpeechSynthesisResult result = synthesizer.SpeakTextAsync(text).get();
System.out.println("first byte latency: \t" + result.getProperties().getProperty(PropertyId.SpeechServiceResponse_SynthesisFirstByteLatencyMs) + " ms.");
System.out.println("finish latency: \t" + result.getProperties().getProperty(PropertyId.SpeechServiceResponse_SynthesisFinishLatencyMs) + " ms.");
// you can also get the result id, and send to us when you need help for diagnosis
String resultId = result.getResultId();
Gecikme süresi | Açıklama | SpeechSynthesisResult özellik anahtarı |
---|---|---|
first byte latency |
Sentezin başlamasıyla ilk ses öbeklerinin alınması arasındaki gecikme süresini gösterir. | SpeechServiceResponse_SynthesisFirstByteLatencyMs |
finish latency |
Sentezin başlaması ve sentezlenen sesin tamamının alınması arasındaki gecikme süresini gösterir. | SpeechServiceResponse_SynthesisFinishLatencyMs |
Konuşma SDK'sı gecikme sürelerini ölçtü ve özelliğinin çantasına SpeechSynthesisResult
yerleştirir. Almak için aşağıdaki kodlara bakın.
result = synthesizer.speak_text_async(text).get()
first_byte_latency = int(result.properties.get_property(speechsdk.PropertyId.SpeechServiceResponse_SynthesisFirstByteLatencyMs))
finished_latency = int(result.properties.get_property(speechsdk.PropertyId.SpeechServiceResponse_SynthesisFinishLatencyMs))
# you can also get the result id, and send to us when you need help for diagnosis
result_id = result.result_id
Gecikme süresi | Açıklama | SPXSpeechSynthesisResult özellik anahtarı |
---|---|---|
first byte latency |
Sentezin başlamasıyla ilk ses öbeklerinin alınması arasındaki gecikme süresini gösterir. | SPXSpeechServiceResponseSynthesisFirstByteLatencyMs |
finish latency |
Sentezin başlaması ve sentezlenen sesin tamamının alınması arasındaki gecikme süresini gösterir. | SPXSpeechServiceResponseSynthesisFinishLatencyMs |
Konuşma SDK'sı gecikme sürelerini ölçtü ve özelliğinin çantasına SPXSpeechSynthesisResult
yerleştirir. Almak için aşağıdaki kodlara bakın.
SPXSpeechSynthesisResult *speechResult = [speechSynthesizer speakText:text];
int firstByteLatency = [intString [speechResult.properties getPropertyById:SPXSpeechServiceResponseSynthesisFirstByteLatencyMs]];
int finishedLatency = [intString [speechResult.properties getPropertyById:SPXSpeechServiceResponseSynthesisFinishLatencyMs]];
// you can also get the result id, and send to us when you need help for diagnosis
NSString *resultId = result.resultId;
çoğu durumda ilk bayt gecikme süresi, son gecikme süresinden daha düşüktür. İlk bayt gecikme süresi metin uzunluğundan bağımsızdır, ancak bitiş gecikme süresi metin uzunluğuyla artar.
İdeal olarak, kullanıcı tarafından karşılaşılan gecikme süresini (kullanıcı sesi duymadan önceki gecikme süresi) bir ağ yolu seyahat süresine ve konuşma sentezi hizmetinin ilk ses öbek gecikme süresini en aza indirmek istiyoruz.
Akışlar
Gecikme süresini azaltmak için Akış kritik önem taşır. İlk ses öbeği alındığında istemci kodu kayıttan yürütmeyi başlatabilir. Bir hizmet senaryosunda, tüm sesin tamamlanmasını beklemeden istemcilerinize ses öbeklerini hemen iletebilirsiniz.
PullAudioOutputStream
Akışı etkinleştirmek için Konuşma SDK'sının , PushAudioOutputStream
, Synthesizing
olayını ve AudioDataStream
kullanabilirsiniz.
Örnek olarak:AudioDataStream
using (var synthesizer = new SpeechSynthesizer(config, null as AudioConfig))
{
using (var result = await synthesizer.StartSpeakingTextAsync(text))
{
using (var audioDataStream = AudioDataStream.FromResult(result))
{
byte[] buffer = new byte[16000];
uint filledSize = 0;
while ((filledSize = audioDataStream.ReadData(buffer)) > 0)
{
Console.WriteLine($"{filledSize} bytes received.");
}
}
}
}
PullAudioOutputStream
Akışı etkinleştirmek için Konuşma SDK'sının , PushAudioOutputStream
, Synthesizing
olayını ve AudioDataStream
kullanabilirsiniz.
Örnek olarak:AudioDataStream
auto synthesizer = SpeechSynthesizer::FromConfig(config, nullptr);
auto result = synthesizer->SpeakTextAsync(text).get();
auto audioDataStream = AudioDataStream::FromResult(result);
uint8_t buffer[16000];
uint32_t filledSize = 0;
while ((filledSize = audioDataStream->ReadData(buffer, sizeof(buffer))) > 0)
{
cout << filledSize << " bytes received." << endl;
}
PullAudioOutputStream
Akışı etkinleştirmek için Konuşma SDK'sının , PushAudioOutputStream
, Synthesizing
olayını ve AudioDataStream
kullanabilirsiniz.
Örnek olarak:AudioDataStream
SpeechSynthesizer synthesizer = new SpeechSynthesizer(config, null);
SpeechSynthesisResult result = synthesizer.StartSpeakingTextAsync(text).get();
AudioDataStream audioDataStream = AudioDataStream.fromResult(result);
byte[] buffer = new byte[16000];
long filledSize = audioDataStream.readData(buffer);
while (filledSize > 0) {
System.out.println(filledSize + " bytes received.");
filledSize = audioDataStream.readData(buffer);
}
PullAudioOutputStream
Akışı etkinleştirmek için Konuşma SDK'sının , PushAudioOutputStream
, Synthesizing
olayını ve AudioDataStream
kullanabilirsiniz.
Örnek olarak:AudioDataStream
speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=None)
result = speech_synthesizer.start_speaking_text_async(text).get()
audio_data_stream = speechsdk.AudioDataStream(result)
audio_buffer = bytes(16000)
filled_size = audio_data_stream.read_data(audio_buffer)
while filled_size > 0:
print("{} bytes received.".format(filled_size))
filled_size = audio_data_stream.read_data(audio_buffer)
SPXPullAudioOutputStream
Akışı etkinleştirmek için Konuşma SDK'sının , SPXPushAudioOutputStream
, Synthesizing
olayını ve SPXAudioDataStream
kullanabilirsiniz.
Örnek olarak:AudioDataStream
SPXSpeechSynthesizer *synthesizer = [[SPXSpeechSynthesizer alloc] initWithSpeechConfiguration:speechConfig audioConfiguration:nil];
SPXSpeechSynthesisResult *speechResult = [synthesizer startSpeakingText:inputText];
SPXAudioDataStream *stream = [[SPXAudioDataStream alloc] initFromSynthesisResult:speechResult];
NSMutableData* data = [[NSMutableData alloc]initWithCapacity:16000];
while ([stream readData:data length:16000] > 0) {
// Read data here
}
SpeechSynthesizer'ı önceden bağlama ve yeniden kullanma
Konuşma SDK'sı, hizmetle iletişim kurmak için bir websocket kullanır.
İdeal olarak, ağ gecikme süresi tek bir rota yolculuğu süresi (RTT) olmalıdır.
Bağlantı yeni kurulduysa, ağ gecikme süresi bağlantıyı kurmak için fazladan zaman içerir.
Websocket bağlantısının kurulması için TCP el sıkışması, SSL el sıkışması, HTTP bağlantısı ve zaman gecikmesine neden olan protokol yükseltmesi gerekir.
Bağlantı gecikmesini önlemek için önceden bağlanmanızı ve yeniden kullanmanızı SpeechSynthesizer
öneririz.
Önceden bağlanma
Önceden bağlanmak için, bağlantının yakında gerekli olduğunu bildiğiniz konuşma hizmetiyle bağlantı kurun. Örneğin, istemcide bir konuşma botu oluşturuyorsanız, kullanıcı konuşmaya başladığında konuşma sentezi hizmetine önceden bağlanabilir ve bot yanıt metni hazır olduğunda çağırabilirsiniz SpeakTextAsync
.
using (var synthesizer = new SpeechSynthesizer(uspConfig, null as AudioConfig))
{
using (var connection = Connection.FromSpeechSynthesizer(synthesizer))
{
connection.Open(true);
}
await synthesizer.SpeakTextAsync(text);
}
auto synthesizer = SpeechSynthesizer::FromConfig(config, nullptr);
auto connection = Connection::FromSpeechSynthesizer(synthesizer);
connection->Open(true);
SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, (AudioConfig) null);
Connection connection = Connection.fromSpeechSynthesizer(synthesizer);
connection.openConnection(true);
synthesizer = speechsdk.SpeechSynthesizer(config, None)
connection = speechsdk.Connection.from_speech_synthesizer(synthesizer)
connection.open(True)
SPXSpeechSynthesizer* synthesizer = [[SPXSpeechSynthesizer alloc]initWithSpeechConfiguration:self.speechConfig audioConfiguration:nil];
SPXConnection* connection = [[SPXConnection alloc]initFromSpeechSynthesizer:synthesizer];
[connection open:true];
Not
Sentez metni kullanılabiliyorsa sesi sentezlemek için araman SpeakTextAsync
yeter. SDK bağlantıyı işler.
SpeechSynthesizer'i yeniden kullanma
Bağlantı gecikme süresini azaltmanın bir diğer yolu da her sentez için yeni SpeechSynthesizer
bir oluşturma gereksinimini yaşamamak için öğesini yeniden kullanmaktırSpeechSynthesizer
.
Hizmet senaryosunda nesne havuzunu kullanmanızı öneririz. Bkz. C# ve Java için örnek kodumuz.
Sıkıştırılmış sesi ağ üzerinden aktarma
Ağ kararsız veya sınırlı bant genişliğine sahip olduğunda yük boyutu gecikme süresini de etkiler. Bu arada, sıkıştırılmış ses biçimi kullanıcıların ağ bant genişliğinin kaydedilmesine yardımcı olur ve bu da mobil kullanıcılar için özellikle değerlidir.
, , silk
webm
mp3
vb. gibi opus
birçok sıkıştırılmış biçimi destekliyoruz, SpeechSynthesisOutputFormat'daki tam listeye bakın.
Örneğin, biçimin Riff24Khz16BitMonoPcm
bit hızı 384 kb/sn iken Audio24Khz48KBitRateMonoMp3
yalnızca 48 kb/sn'dir.
Konuşma SDK'mız, çıkış biçimi ayarlandığında iletim için otomatik olarak sıkıştırılmış bir pcm
biçim kullanır.
Linux ve Windows için GStreamer
bu özelliği etkinleştirmek için gereklidir.
Konuşma SDK'sını yüklemek ve yapılandırmak GStreamer
için bu yönergeye bakın.
Android, iOS ve macOS için sürüm 1.20'den itibaren ek yapılandırma gerekmez.
Diğer ipuçları
CRL dosyalarını önbelleğe alma
Konuşma SDK'sı sertifikayı denetlemek için CRL dosyalarını kullanır. Süresi dolana kadar CRL dosyalarını Önbelleğe Alma, CRL dosyalarını her seferinde indirmekten kaçınmanıza yardımcı olur. Ayrıntılar için bkz. Linux için OpenSSL'yi yapılandırma.
En son Konuşma SDK'sı kullanma
Konuşma SDK'sının performansını geliştirmeye devam ediyoruz, bu nedenle uygulamanızda en son Konuşma SDK'sını kullanmayı deneyin.
Yük testi kılavuzu
Konuşma sentezi hizmeti kapasitesini ve gecikme süresini test etmek için yük testini kullanabilirsiniz. Bazı yönergeler şunlardır:
- Konuşma sentezi hizmeti otomatik ölçeklendirme özelliğine sahiptir, ancak ölçeği genişletmek zaman alır. Eşzamanlılık kısa sürede artarsa, istemci uzun gecikme süresi veya
429
hata kodu (çok fazla istek) alabilir. Bu nedenle, yük testinde eşzamanlılığınızı adım adım artırmanızı öneririz. Özellikle bu iş yükü desenleri örneği olmak üzere daha fazla ayrıntı için bu makaleye bakın. - Yük testi ve gecikme süresi numaralarını almak için nesne havuzunu (C# ve Java) kullanarak örneğimizi kullanabilirsiniz. Hedef eşzamanlılığınızı karşılamak için örnekteki test dönüşlerini ve eşzamanlılığını değiştirebilirsiniz.
- Hizmetin gerçek trafiğe göre kota sınırlaması vardır, bu nedenle gerçek trafiğinizden daha yüksek eşzamanlılık ile yük testi gerçekleştirmek istiyorsanız testten önce bağlanın.
Sonraki adımlar
- GitHub'da örneklere bakın