Share via


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 latencyile ö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 SpeechSynthesisResultyerleş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 SpeechSynthesisResultyerleş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 SpeechSynthesisResultyerleş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 SpeechSynthesisResultyerleş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 SPXSpeechSynthesisResultyerleş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.

PullAudioOutputStreamAkışı 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.");
            }
        }
    }
}

PullAudioOutputStreamAkışı 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;
}

PullAudioOutputStreamAkışı 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);
}

PullAudioOutputStreamAkışı 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)

SPXPullAudioOutputStreamAkışı 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.

, , silkwebmmp3vb. gibi opusbirç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