Menggunakan penilaian pengucapan

Dalam artikel ini, Anda akan mempelajari cara menggunakan penilaian pengucapan melalui SDK Azure Cognitive Service untuk Ucapan.

Catatan

Penilaian pengucapan tidak tersedia dengan Speech SDK untuk Go. Anda dapat membaca tentang konsep di bawah ini, tetapi Anda harus memilih bahasa pemrograman lain untuk detail implementasi.

Anda bisa mendapatkan skor penilaian pengucapan untuk:

  • Teks lengkap
  • Kata
  • Grup suku kata
  • Fonem dalam format SAPI atau IPA

Catatan

Untuk informasi tentang ketersediaan penilaian pengucapan, lihat bahasa yang didukung dan wilayah yang tersedia.

Grup suku kata, fonem IPA, dan fitur fonem lisan penilaian pengucapan saat ini hanya tersedia untuk lokal en-US.

Parameter konfigurasi

Tabel ini mencantumkan beberapa parameter konfigurasi utama untuk penilaian pengucapan.

Parameter Deskripsi
ReferenceText Teks pengucapan yang akan dievaluasi.
GradingSystem Sistem poin untuk kalibrasi skor. Sistem FivePoint memberikan skor poin floating 0-5, dan HundredMark memberikan skor poin floating 0-100.
Granularity Menentukan tingkat granularitas evaluasi terendah. Skor untuk tingkat di atas atau sama dengan nilai minimal dikembalikan. Nilai yang diterima adalah Phoneme, yang menunjukkan skor pada teks lengkap, tingkat kata, suku kata, dan fonem, Syllable, yang menunjukkan skor pada teks lengkap, kata dan tingkat suku kata, Word, yang menunjukkan skor pada teks lengkap dan tingkat kata, FullText, yang menunjukkan skor hanya pada level teks lengkap. Teks referensi lengkap yang disediakan dapat berupa kata, kalimat, atau paragraf, dan hal tersebut tergantung pada teks referensi input Anda.
EnableMiscue Memungkinkan perhitungan miscue ketika kata-kata yang diucapkan dibandingkan dengan teks referensi. Jika nilai ini adalah True, nilai hasil ErrorType dapat diatur ke Omission atau Insertion berdasarkan perbandingan. Nilai yang diterima adalah False dan True. Default: False.

Anda harus membuat objek PronunciationAssessmentConfig dengan teks referensi, sistem penilaian, dan granularitas. Mengaktifkan pengaturan konfigurasi kesalahan dan lainnya bersifat opsional.

var pronunciationAssessmentConfig = new PronunciationAssessmentConfig(
    referenceText: "good morning",
    gradingSystem: GradingSystem.HundredMark, 
    granularity: Granularity.Phoneme, 
    enableMiscue: true);
auto pronunciationAssessmentConfig = PronunciationAssessmentConfig::CreateFromJson("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\"}");
PronunciationAssessmentConfig pronunciationAssessmentConfig = PronunciationAssessmentConfig.fromJson("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\"}");
pronunciation_assessment_config = speechsdk.PronunciationAssessmentConfig(json_string="{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\"}")
var pronunciationAssessmentConfig = SpeechSDK.PronunciationAssessmentConfig.fromJSON("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\"}");
SPXPronunciationAssessmentConfiguration *pronunciationAssessmentConfig =
[[SPXPronunciationAssessmentConfiguration alloc] init:@"good morning"
                            gradingSystem:SPXPronunciationAssessmentGradingSystem_HundredMark
                            granularity:SPXPronunciationAssessmentGranularity_Phoneme
                            enableMiscue:true];
var pronunciationAssessmentConfig: SPXPronunciationAssessmentConfiguration?
do {
    try pronunciationAssessmentConfig = SPXPronunciationAssessmentConfiguration.init(referenceText, gradingSystem: SPXPronunciationAssessmentGradingSystem.hundredMark, granularity: SPXPronunciationAssessmentGranularity.phoneme, enableMiscue: true)
} catch {
    print("error \(error) happened")
    pronunciationAssessmentConfig = nil
    return
}

Grup suku kata

Penilaian pengucapan dapat memberikan hasil penilaian tingkat suku kata. Pengelompokan dalam suku kata lebih mudah terbayangkan dan selaras dengan kebiasaan berbicara, karena sebuah kata biasanya diucapkan suku kata demi suku kata daripada fonem demi fonem.

Tabel berikut membandingkan contoh fonem dengan suku kata yang sesuai.

Contoh kata Fonem Suku kata
technological teknələdʒɪkl tek·nə·lɑ·dʒɪkl
halo hɛloʊ hɛ·loʊ
luck lʌk lʌk
photosynthesis foʊtəsɪnθəsɪs foʊ·tə·sɪn·θə·sɪs

Untuk meminta hasil tingkat suku kata bersama dengan fonem, atur parameter konfigurasi granularitas ke Phoneme.

Format alfabet fonem

Nama fonem disediakan bersama dengan skor, untuk membantu mengidentifikasi fonem mana yang diucapkan secara akurat atau tidak akurat. Untuk bahasa yang didukung, Anda bisa mendapatkan nama fonem dalam format SAPI, dan untuk en-US lokal, Anda juga bisa mendapatkan nama fonem dalam format IPA.

Tabel berikut membandingkan contoh fonem SAPI dengan fonem IPA yang sesuai.

Contoh kata Fonem SAPI Fonem IPA
halo h eh l ow h ɛ l oʊ
luck l ah k l ʌ k
photosynthesis f ow t ax s ih n th ax s ih s f oʊ t ə s ɪ n θ ə s ɪ s

Untuk meminta fonem IPA, atur alfabet fonem ke "IPA". Jika Anda tidak menentukan alfabet, secara default fonem akan memiliki format SAPI.

pronunciationAssessmentConfig.PhonemeAlphabet = "IPA";
auto pronunciationAssessmentConfig = PronunciationAssessmentConfig::CreateFromJson("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\"}");
PronunciationAssessmentConfig pronunciationAssessmentConfig = PronunciationAssessmentConfig.fromJson("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\"}");
pronunciation_assessment_config = speechsdk.PronunciationAssessmentConfig(json_string="{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\"}")
var pronunciationAssessmentConfig = SpeechSDK.PronunciationAssessmentConfig.fromJSON("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\"}");
pronunciationAssessmentConfig.phonemeAlphabet = @"IPA";
pronunciationAssessmentConfig?.phonemeAlphabet = "IPA"

Fonem lisan

Dengan fonem lisan, Anda bisa mendapatkan skor keyakinan yang menunjukkan seberapa besar kemungkinan fonem lisan cocok dengan fonem yang diharapkan.

Misalnya, ketika Anda mengucapkan kata "halo", fonem IPA yang diharapkan adalah "h ɛ l oʊ". Fonem lisan yang sebenarnya bisa menjadi "h ə l oʊ". Dalam hasil penilaian berikut, fonem yang paling mungkin diucapkan adalah "ə" alih-alih fonem "ɛ" yang diharapkan. Fonem "ɛ" yang diharapkan hanya menerima skor keyakinan 47. Potensi kecocokan lainnya mendapatkan skor keyakinan 52, 17, dan 2.

{
    "Phoneme": "ɛ",
    "PronunciationAssessment": {
        "AccuracyScore": 47.0,
        "NBestPhonemes": [
            {
                "Phoneme": "ə",
                "Score": 100.0
            },
            {
                "Phoneme": "l",
                "Score": 52.0
            },
            {
                "Phoneme": "ɛ",
                "Score": 47.0
            },
            {
                "Phoneme": "h",
                "Score": 17.0
            },
            {
                "Phoneme": "æ",
                "Score": 2.0
            }
        ]
    },
    "Offset": 11100000,
    "Duration": 500000
},

Untuk menunjukkan apakah, dan berapa banyak potensi fonem lisan untuk mendapatkan skor keyakinan, atur parameter NBestPhonemeCount ke nilai bilangan bulat seperti 5.

pronunciationAssessmentConfig.NBestPhonemeCount = 5;
auto pronunciationAssessmentConfig = PronunciationAssessmentConfig::CreateFromJson("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\",\"nBestPhonemeCount\":5}");
PronunciationAssessmentConfig pronunciationAssessmentConfig = PronunciationAssessmentConfig.fromJson("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\",\"nBestPhonemeCount\":5}");
pronunciation_assessment_config = speechsdk.PronunciationAssessmentConfig(json_string="{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\",\"nBestPhonemeCount\":5}")
var pronunciationAssessmentConfig = SpeechSDK.PronunciationAssessmentConfig.fromJSON("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\",\"nBestPhonemeCount\":5}");
pronunciationAssessmentConfig.nbestPhonemeCount = 5;
pronunciationAssessmentConfig?.nbestPhonemeCount = 5

Mendapatkan hasil penilaian pengucapan

Saat ucapan dikenali, Anda dapat meminta hasil penilaian pengucapan sebagai objek SDK atau string JSON.

using (var speechRecognizer = new SpeechRecognizer(
    speechConfig,
    audioConfig))
{
    pronunciationAssessmentConfig.ApplyTo(speechRecognizer);
    var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();

    // The pronunciation assessment result as a Speech SDK object
    var pronunciationAssessmentResult =
        PronunciationAssessmentResult.FromResult(speechRecognitionResult);

    // The pronunciation assessment result as a JSON string
    var pronunciationAssessmentResultJson = speechRecognitionResult.Properties.GetProperty(PropertyId.SpeechServiceResponse_JsonResult);
}

Hasil kata, suku kata, dan fonem tidak tersedia melalui objek SDK dengan Speech SDK foc C++. Hasil kata, suku kata, dan fonem hanya tersedia dalam string JSON.

auto speechRecognizer = SpeechRecognizer::FromConfig(
    speechConfig,
    audioConfig);

pronunciationAssessmentConfig->ApplyTo(speechRecognizer);
speechRecognitionResult = speechRecognizer->RecognizeOnceAsync().get();

// The pronunciation assessment result as a Speech SDK object
auto pronunciationAssessmentResult =
    PronunciationAssessmentResult::FromResult(speechRecognitionResult);

// The pronunciation assessment result as a JSON string
auto pronunciationAssessmentResultJson = speechRecognitionResult->Properties.GetProperty(PropertyId::SpeechServiceResponse_JsonResult);

Untuk pengembangan aplikasi Android, hasil kata, suku kata, dan fonem tersedia melalui objek SDK dengan Speech SDK foc Java. Hasilnya juga tersedia dalam string JSON. Untuk pengembangan aplikasi Java Runtime (JRE), hasil kata, suku kata, dan fonem hanya tersedia dalam string JSON.

SpeechRecognizer speechRecognizer = new SpeechRecognizer(
    speechConfig,
    audioConfig);

pronunciationAssessmentConfig.applyTo(speechRecognizer);
Future<SpeechRecognitionResult> future = speechRecognizer.recognizeOnceAsync();
SpeechRecognitionResult speechRecognitionResult = future.get(30, TimeUnit.SECONDS);

// The pronunciation assessment result as a Speech SDK object
PronunciationAssessmentResult pronunciationAssessmentResult =
    PronunciationAssessmentResult.fromResult(speechRecognitionResult);

// The pronunciation assessment result as a JSON string
String pronunciationAssessmentResultJson = speechRecognitionResult.getProperties().getProperty(PropertyId.SpeechServiceResponse_JsonResult);

recognizer.close();
speechConfig.close();
audioConfig.close();
pronunciationAssessmentConfig.close();
speechRecognitionResult.close();
var speechRecognizer = SpeechSDK.SpeechRecognizer.FromConfig(speechConfig, audioConfig);

pronunciationAssessmentConfig.applyTo(speechRecognizer);

speechRecognizer.recognizeOnceAsync((speechRecognitionResult: SpeechSDK.SpeechRecognitionResult) => {
    // The pronunciation assessment result as a Speech SDK object
	var pronunciationAssessmentResult = SpeechSDK.PronunciationAssessmentResult.fromResult(speechRecognitionResult);

	// The pronunciation assessment result as a JSON string
	var pronunciationAssessmentResultJson = speechRecognitionResult.properties.getProperty(SpeechSDK.PropertyId.SpeechServiceResponse_JsonResult);
},
{});


speech_recognizer = speechsdk.SpeechRecognizer(
        speech_config=speech_config, \
        audio_config=audio_config)

pronunciation_assessment_config.apply_to(speech_recognizer)
speech_recognition_result = speech_recognizer.recognize_once()

# The pronunciation assessment result as a Speech SDK object
pronunciation_assessment_result = speechsdk.PronunciationAssessmentResult(speech_recognition_result)

# The pronunciation assessment result as a JSON string
pronunciation_assessment_result_json = speech_recognition_result.properties.get(speechsdk.PropertyId.SpeechServiceResponse_JsonResult)
SPXSpeechRecognizer* speechRecognizer = \
        [[SPXSpeechRecognizer alloc] initWithSpeechConfiguration:speechConfig
                                              audioConfiguration:audioConfig];

[pronunciationAssessmentConfig applyToRecognizer:speechRecognizer];

SPXSpeechRecognitionResult *speechRecognitionResult = [speechRecognizer recognizeOnce];

// The pronunciation assessment result as a Speech SDK object
SPXPronunciationAssessmentResult* pronunciationAssessmentResult = [[SPXPronunciationAssessmentResult alloc] init:speechRecognitionResult];

// The pronunciation assessment result as a JSON string
NSString* pronunciationAssessmentResultJson = [speechRecognitionResult.properties getPropertyByName:SPXSpeechServiceResponseJsonResult];
let speechRecognizer = try! SPXSpeechRecognizer(speechConfiguration: speechConfig, audioConfiguration: audioConfig)

try! pronConfig.apply(to: speechRecognizer)

let speechRecognitionResult = try? speechRecognizer.recognizeOnce()

// The pronunciation assessment result as a Speech SDK object
let pronunciationAssessmentResult = SPXPronunciationAssessmentResult(speechRecognitionResult!)

// The pronunciation assessment result as a JSON string
let pronunciationAssessmentResultJson = speechRecognitionResult!.properties?.getPropertyBy(SPXPropertyId.speechServiceResponseJsonResult)

Parameter hasil

Tabel ini mencantumkan beberapa hasil utama penilaian pengucapan.

Parameter Deskripsi
AccuracyScore Akurasi pelafalan ucapan. Akurasi menunjukkan seberapa dekat fonem cocok dengan pengucapan penutur asli. Skor akurasi suku kata, kata, dan teks lengkap diagregasi dari skor akurasi tingkat fonem.
FluencyScore Kelancaran ucapan yang diberikan. Kefasihan menunjukkan seberapa dekat ucapan cocok dengan penggunaan jeda diam antara kata-kata penutur asli.
CompletenessScore Kelengkapan ucapan, dihitung dengan rasio kata yang diucapkan ke teks referensi input.
PronScore Skor keseluruhan menunjukkan kualitas pelafalan ucapan yang diberikan. PronScore diagregasi dari AccuracyScore, FluencyScore, dan CompletenessScore dengan bobot.
ErrorType Nilai ini menunjukkan apakah kata dihilangkan, disisipkan, atau diucapkan dengan buruk, dibandingkan dengan ReferenceText. Nilai yang mungkin adalah None, Omission, Insertion, dan Mispronunciation.

Contoh hasil JSON

Hasil penilaian pengucapan untuk kata lisan "hello" ditampilkan sebagai string JSON dalam contoh berikut. Berikut yang harus Anda ketahui:

  • Alfabet fonem adalah IPA.
  • Suku kata ditampilkan bersama fonem untuk kata yang sama.
  • Anda dapat menggunakan nilai Offset dan Duration untuk menyelaraskan suku kata dengan fonem yang sesuai. Misalnya, offset awal (11700000) dari suku kata kedua ("loʊ") selaras dengan fonem ketiga ("l").
  • Terdapat lima NBestPhonemes yang sesuai dengan jumlah fonem lisan yang diminta.
  • Dalam Phonemes, fonem lisan yang paling mungkin adalah "ə" alih-alih fonem "ɛ"yang diharapkan. Fonem "ɛ" yang diharapkan hanya menerima skor keyakinan 47. Potensi kecocokan lainnya mendapatkan skor keyakinan 52, 17, dan 2.
{
	"Id": "bbb42ea51bdb46d19a1d685e635fe173",
	"RecognitionStatus": 0,
	"Offset": 7500000,
	"Duration": 13800000,
	"DisplayText": "Hello.",
	"SNR": 34.879055,
	"NBest": [
		{
			"Confidence": 0.975003,
			"Lexical": "hello",
			"ITN": "hello",
			"MaskedITN": "hello",
			"Display": "Hello.",
			"PronunciationAssessment": {
				"AccuracyScore": 100,
				"FluencyScore": 100,
				"CompletenessScore": 100,
				"PronScore": 100
			},
			"Words": [
				{
					"Word": "hello",
					"Offset": 7500000,
					"Duration": 13800000,
					"PronunciationAssessment": {
						"AccuracyScore": 99.0,
						"ErrorType": "None"
					},
					"Syllables": [
						{
							"Syllable": "hɛ",
							"PronunciationAssessment": {
								"AccuracyScore": 91.0
							},
							"Offset": 7500000,
                            "Duration": 4100000
						},
						{
							"Syllable": "loʊ",
							"PronunciationAssessment": {
								"AccuracyScore": 100.0
							},
							"Offset": 11700000,
                            "Duration": 9600000
						}
					],
					"Phonemes": [
						{
							"Phoneme": "h",
							"PronunciationAssessment": {
								"AccuracyScore": 98.0,
								"NBestPhonemes": [
									{
										"Phoneme": "h",
										"Score": 100.0
									},
									{
										"Phoneme": "oʊ",
										"Score": 52.0
									},
									{
										"Phoneme": "ə",
										"Score": 35.0
									},
									{
										"Phoneme": "k",
										"Score": 23.0
									},
									{
										"Phoneme": "æ",
										"Score": 20.0
									}
								]
							},
							"Offset": 7500000,
                            "Duration": 3500000
						},
						{
							"Phoneme": "ɛ",
							"PronunciationAssessment": {
								"AccuracyScore": 47.0,
								"NBestPhonemes": [
									{
										"Phoneme": "ə",
										"Score": 100.0
									},
									{
										"Phoneme": "l",
										"Score": 52.0
									},
									{
										"Phoneme": "ɛ",
										"Score": 47.0
									},
									{
										"Phoneme": "h",
										"Score": 17.0
									},
									{
										"Phoneme": "æ",
										"Score": 2.0
									}
								]
							},
							"Offset": 11100000,
                            "Duration": 500000
						},
						{
							"Phoneme": "l",
							"PronunciationAssessment": {
								"AccuracyScore": 100.0,
								"NBestPhonemes": [
									{
										"Phoneme": "l",
										"Score": 100.0
									},
									{
										"Phoneme": "oʊ",
										"Score": 46.0
									},
									{
										"Phoneme": "ə",
										"Score": 5.0
									},
									{
										"Phoneme": "ɛ",
										"Score": 3.0
									},
									{
										"Phoneme": "u",
										"Score": 1.0
									}
								]
							},
							"Offset": 11700000,
                            "Duration": 1100000
						},
						{
							"Phoneme": "oʊ",
							"PronunciationAssessment": {
								"AccuracyScore": 100.0,
								"NBestPhonemes": [
									{
										"Phoneme": "oʊ",
										"Score": 100.0
									},
									{
										"Phoneme": "d",
										"Score": 29.0
									},
									{
										"Phoneme": "t",
										"Score": 24.0
									},
									{
										"Phoneme": "n",
										"Score": 22.0
									},
									{
										"Phoneme": "l",
										"Score": 18.0
									}
								]
							},
							"Offset": 12900000,
                            "Duration": 8400000
						}
					]
				}
			]
		}
	]
}

Langkah berikutnya