Reconnaissance vocale – Bing Speech

Pour la partie reconnaissance vocale de mon robot, j’ai décidé de comparer et d’utiliser des services web de différents groupes, leur système de reconnaissance vocale étant extrêmement performante, simple à mettre en place et moins gourmandes en ressources, contrairement à certaines librairies JAVA que j’ai pu tester.
Dans ce tutoriel, je vous présente brièvement l’API Bing Speech de Microsoft et son utilisation au travers d’une classe JAVA.

  • Documentation : API Bing Speech
  • Authentification : il faut créer un compte Azure et s’abonner au service Speech To Text (il est nécessaire de renseigner un numéro de carte de crédit mais rien ne sera débité). Il faut ensuite récupérer une clé d’API nécessaire à l’acquisition d’un jeton pour l’appel au service web (voir dans le code). Un GUID généré par vous-même est également nécessaire à l’appel.
  • Prix : facturé 3,374 € toutes les 1 000 transactions (fichier de 15 secondes maximum) sachant que quelque soit la durée du fichier à reconnaître, il sera facturé au multiple des 15 secondes supérieur. Etant donné qu’en pratique, une phrase à reconnaître dure au maximum 5 secondes, 15 secondes seront donc débitées de votre crédit.
  • Quota gratuit : 5000 requêtes / mois de 15 secondes.

Pour appeler le service web REST, j’utilise Unirest pour et la librairie Gson de Google pour transformer le résultat JSON en objets JAVA (objets que j’ai créés spécialement). Il faudra donc rajouter les dépendances suivantes :

<dependency>
    <groupId>com.mashape.unirest</groupId>
    <artifactId>unirest-java</artifactId>
    <version>1.4.9</version>
</dependency>

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.3.1</version>
</dependency>

Voici maintenant le code du moteur de reconnaissance vocale que vous pouvez retrouver sur GitHub :

package fr.roboteek.robot.sandbox.reconnaissance.vocale.bing;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.UUID;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;

import fr.roboteek.robot.sandbox.reconnaissance.vocale.DetecteurVocal;
import fr.roboteek.robot.sandbox.reconnaissance.vocale.SpeechRecognizer;


/**
 * Moteur de reconnaissance vocale utilisant le service web Speech de Microsoft.
 * @author Nicolas Peltier
 *
 */
public class BingSpeechRecognizerRest implements SpeechRecognizer {

	/** URL du service web de récupération du token. */
	private static String WEB_SERVICE_TOKEN_URL = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken";

	/** URL du service web de reconnaissance. */
	private static String WEB_SERVICE_SPEECH_URL = "https://speech.platform.bing.com/recognize";

	/** Singleton de la classe. */
	private static BingSpeechRecognizerRest instance;

	/** Clé API Bing Speech (à récupérer sur le site de l'API). */
	private String bingSpeechApiKey= "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

	/** GUID de l'application Bing (GUID personnel à générer par le développeur). */
	private static String bingSpeechApplicationId = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";

	/** Classe GSON permettant la création des objets JSON. */
	private Gson gson;

	/** Constructeur privé. */
	private BingSpeechRecognizerRest() {

		// Décodeur JSON
		gson = new GsonBuilder().create();
	}

	/**
	 * Récupère l'instance du moteur de reconnaissance.
	 * @return l'instance du moteur de reconnaissance
	 */
	public static BingSpeechRecognizerRest getInstance() {
		if (instance == null) {
			instance = new BingSpeechRecognizerRest();
		}
		return instance;
	}

	public String reconnaitre(String cheminFichierWav) {

		BingSpeechResponse response = null;

		try {
			// Récupération du contenu du fichier WAV
			final byte[] contenuFichierWav = Files.readAllBytes(Paths.get(cheminFichierWav));

			// Appel du service web avec Unirest et transformation de la réponse JSON
			response = gson.fromJson(
					Unirest.post(WEB_SERVICE_SPEECH_URL)
					.queryString("scenarios", "smd")
					.queryString("appid", bingSpeechApplicationId)
					.queryString("locale", "fr-FR")
					.queryString("device.os", "Windows")
					.queryString("version", "3.0")
					.queryString("format", "json")
					.queryString("instanceid", UUID.randomUUID())
					.queryString("requestid", UUID.randomUUID())
					.header("Authorization", "Bearer " + getToken())
					.header("Content-type", "audio/wav")
					.body(contenuFichierWav)
					.asString()
					.getBody(),
					BingSpeechResponse.class);
		} catch (UnirestException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}


		// Récupération du résultat
		if (response != null && response.getHeader() != null && response.getHeader().getStatus() != null && response.getHeader().getStatus().equals("success")) {
			if (response.getHeader().getName() != null) {
				return response.getHeader().getName();
			}
		}

		return "";
	}

	/**
	 * Récupère le jeton permettant d'utiliser le service de reconnaissance.
	 * @return le jeton
	 */
	private String getToken() {
		try {
			return Unirest.post(WEB_SERVICE_TOKEN_URL)
					.header("Ocp-Apim-Subscription-Key", bingSpeechApiKey)
					.asString()
					.getBody();
		} catch (UnirestException e) {
			e.printStackTrace();
		}
		return "";

	}

	public static void main(String[] args) throws IOException {
		final BingSpeechRecognizerRest bingSpeechRecognizerRest = BingSpeechRecognizerRest.getInstance();
		// Création et lancement du détecteur vocal en passant le moteur de reconnaissance à utiliser
		final DetecteurVocal detecteurVocal = new DetecteurVocal(bingSpeechRecognizerRest);
		detecteurVocal.demarrer();
	}
}
Nicolas

About Nicolas

Développeur JAVA, je suis passionné de robotique depuis quelques années, notamment tout ce qui concerne la partie programmation (vision artificielle, synthèse et reconnaissance vocale, intelligence artificielle, ...).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces tags et attributs HTML :

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>