0

Im currently using Azure pronunciation assessment example from cognitive services speech SDK with the next code:

` const speechConfig = sdk.SpeechConfig.fromSubscription( API_KEY, REGION, ); speechConfig.speechRecognitionLanguage = 'es-ES';

const referenceText =
  'Internet es una enorme red de dispositivos interconectados mundialmente gracias a millones de kilómetros de cables de fibra óptica que pasan por debajo de los océanos. Para poder viajar, los archivos deben convertirse a un lenguaje que entiendan las computadoras. Ese es el LENGUAJE DE MÁQUINA y es de tipo BINARIO, porque solo tiene dos valores: 1 y 0. Combinando esos dos valores se generan todos los tipos de contenidos que ves y escuchás en cualquier dispositivo. ¡Increíble! ¿No?. Además, para llegar más velozmente (y que no te aburras esperando), los archivos se dividen en pequeñas partes, llamadas PAQUETES DE DATOS, que toman el mejor camino disponible hasta a tu dispositivo. Para lograrlo, los paquetes viajan por el mundo a través de la inmensa red de CABLES DE FIBRA ÓPTICA SUBMARINOS, redirigiéndose por varios ROUTERS. En tu dispositivo, que puede estar conectado a internet a través de un CABLE o INALÁMBRICAMENTE (gracias a tu MÓDEM), los pequeños paquetes se unen formando el archivo que habías solicitado y aparecen de forma completa.';

const pronunciationAssessmentConfig = new sdk.PronunciationAssessmentConfig(
  referenceText,
  sdk.PronunciationAssessmentGradingSystem.HundredMark,
  sdk.PronunciationAssessmentGranularity.Phoneme,
  true,
);

const audioConfig = sdk.AudioConfig.fromWavFileInput(
  fs.readFileSync('test.wav'),
);

const reco = new sdk.SpeechRecognizer(speechConfig, audioConfig);
pronunciationAssessmentConfig.applyTo(reco);

function onRecognizedResult(result: { text: string }) {
  console.log('pronunciation assessment for:', result.text);
  const pronunciation_result =
    sdk.PronunciationAssessmentResult.fromResult(result);
  console.log(
    ' Accuracy score:',
    pronunciation_result.accuracyScore,
    '\n',
    'pronunciation score:',
    pronunciation_result.pronunciationScore,
    '\n',
    'completeness score :',
    pronunciation_result.completenessScore,
    '\n',
    'fluency score:',
    pronunciation_result.fluencyScore,
  );
  console.log('  Word-level details:');
  for (const [
    idx,
    word,
  ] of pronunciation_result.detailResult.Words.entries()) {
    console.log(
      '    ',
      idx + 1,
      ': word:',
      word.Word,
      '\taccuracy score:',
      word.PronunciationAssessment.AccuracyScore,
      '\terror type:',
      word.PronunciationAssessment.ErrorType,
      ';',
    );
  }
  reco.close();
}

reco.recognizeOnceAsync(function (successfulResult: any) {
  onRecognizedResult(successfulResult);
});`

The problem occurs when the audio i record is larger than 1 minute. The assessment is only executed for the first minute giving omission for every word that is not mentioned. How can I process the entire length of the audio?

Thanks, Matías

Dasari Kamali
  • 811
  • 2
  • 2
  • 6

1 Answers1

0

I made some change to your code and got the complete text output with input speech in spanish.

Code:

const sdk = require("microsoft-cognitiveservices-speech-sdk");
const fs = require("fs");

const speechKey = "<speech-key>";
const speechRegion = "<speech-region>";

const speechConfig = sdk.SpeechConfig.fromSubscription(speechKey, speechRegion);
speechConfig.speechRecognitionLanguage = 'es-ES';

const referenceText =
  'Internet es una enorme red de dispositivos interconectados mundialmente gracias a millones de kilómetros de cables de fibra óptica que pasan por debajo de los océanos. Para poder viajar, los archivos deben convertirse a un lenguaje que entiendan las computadoras. Ese es el LENGUAJE DE MÁQUINA y es de tipo BINARIO, porque solo tiene dos valores: 1 y 0. Combinando esos dos valores se generan todos los tipos de contenidos que ves y escuchás en cualquier dispositivo. ¡Increíble! ¿No?. Además, para llegar más velozmente (y que no te aburras esperando), los archivos se dividen en pequeñas partes, llamadas PAQUETES DE DATOS, que toman el mejor camino disponible hasta a tu dispositivo. Para lograrlo, los paquetes viajan por el mundo a través de la inmensa red de CABLES DE FIBRA ÓPTICA SUBMARINOS, redirigiéndose por varios ROUTERS. de un CABLE o INALÁMBRICAMENTE , los pequeños paquetes se unen formando el archivo que habías solicitado y aparecen de forma completa.';

const pronunciationAssessmentConfig = new sdk.PronunciationAssessmentConfig(
  referenceText,
  sdk.PronunciationAssessmentGradingSystem.HundredMark,
  sdk.PronunciationAssessmentGranularity.Phoneme,
  true
);

const audioConfig = sdk.AudioConfig.fromWavFileInput(
  fs.readFileSync('kam.wav')
);

const recognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
pronunciationAssessmentConfig.applyTo(recognizer);

function onRecognizedResult(result) {
  console.log('Pronunciation assessment for:', result.text);
  const pronunciation_result = sdk.PronunciationAssessmentResult.fromResult(result);
  console.log(
    'Accuracy score:', pronunciation_result.accuracyScore, '\n',
    'Pronunciation score:', pronunciation_result.pronunciationScore, '\n',
    'Completeness score:', pronunciation_result.completenessScore, '\n',
    'Fluency score:', pronunciation_result.fluencyScore
  );
  console.log('Word-level details:');
  for (const [idx, word] of pronunciation_result.detailResult.Words.entries()) {
    console.log(
      '    ', idx + 1, ': word:', word.Word,
      '\taccuracy score:', word.PronunciationAssessment.AccuracyScore,
      '\terror type:', word.PronunciationAssessment.ErrorType, ';'
    );
  }
}

recognizer.recognized = (s, e) => {
  if (e.result.reason === sdk.ResultReason.RecognizedSpeech) {
    onRecognizedResult(e.result);
  }
};

recognizer.startContinuousRecognitionAsync(() => {
  console.log('Recognition started...');
}, (error) => {
  console.error('Failed to start recognition:', error);
});

setTimeout(() => {
  recognizer.stopContinuousRecognitionAsync(() => {
    console.log('Recognition stopped.');
    recognizer.close();
  }, (error) => {
    console.error('Failed to stop recognition:', error);
    recognizer.close();
  });
}, 60 * 1000); 

Output:

It runs successfully and give the text output with input speech in spanish as below,

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

Dasari Kamali
  • 811
  • 2
  • 2
  • 6
  • 1
    Is there a way to do it in one shot and not continously? I would have to average the results for every pronunciation assessment. The other problem i see is that it doesn't seem to detect insertions or omissions anymore. – Matias Alvarez Jul 20 '23 at 13:58
  • @MatiasAlvarez Yes, you can perform the pronunciation assessment in one shot instead of continuously. Instead of using continuous recognition, you can use single-shot recognition by using the `recognizeOnceAsync()` method of the SpeechRecognizer class. This method performs a single recognition operation and returns the result as [this](https://i.imgur.com/VZz67PV.png). If you want the code, I will provide it. – Dasari Kamali Jul 23 '23 at 15:59
  • How long was the recording in minutes? I already used recognizeOnceAsync but when the recording is longer than one minute it only gives an output for the first minute. Can you share your code? Thanks. – Matias Alvarez Jul 24 '23 at 18:42
  • Ok sure, will edit the code in my answer – Dasari Kamali Jul 25 '23 at 02:46
  • I still see previous code, is that ok? Thanks – Matias Alvarez Jul 26 '23 at 14:39