[PYTHON] Synthèse vocale et reconnaissance vocale par Microsoft Project Oxford

Microsoft a publié une API d'apprentissage automatique dans le cadre d'un projet appelé Project Oxford à partir du 1er mai 2015.

[API de reconnaissance de visage, d'image et de voix disponible auprès de Microsoft Project Oxford](http://jp.techcrunch.com/2015/05/01/20150430microsofts-project-oxford-gives-developers-access-to- apis-de-reconnaissance-d'images-faciales-et-de-parole /)

Cette fois, nous allons utiliser l'API Speech qui effectue la synthèse vocale et la reconnaissance vocale.

En effet, de nombreux services effectuent une synthèse vocale, mais en ce qui concerne la reconnaissance vocale, ceux qui peuvent être utilisés comme API sont assez limités. Surtout les SDK Android / iOS, même s'ils peuvent être utilisés sur le Web, ils dépendent du navigateur. Google a également une API Speech, mais je ne trouve aucune documentation officielle, et la limite de 50 fois par jour est assez stricte (à partir de juillet 2015. Cela ne semble pas augmenter si vous payez).

google_speech_api_quote.PNG

Project Oxford est une version bêta publique depuis juillet 2015, et pour l'instant, il est gratuit et peut être utilisé sans aucune restriction (le japonais est également pris en charge). En plus de la synthèse vocale, il existe des API telles que la reconnaissance faciale, alors essayez-la sur ici.

Préparation environnementale

Tout d'abord, préparez l'environnement pour l'utilisation de l'API Speech. Un compte Microsoft Azure est requis pour l'utiliser, alors enregistrez-le.

Microsoft Azure

Il y a une description que c'est pour un mois, mais comme l'API Speech utilisée cette fois-ci est gratuite, je pense que ça va probablement même après un mois.

Une fois que vous avez créé un compte, accédez au portail. L'API Speech semble avoir été achetée via Marketplace, alors appuyez sur le bouton "Nouveau" en bas à gauche et sélectionnez Marketplace.

image

De là, sélectionnez l'API Speech. Vous pouvez également voir l'API Face, donc je pense que vous pouvez acheter l'API Project Oxford en utilisant la même méthode (* actuellement GRATUIT).

image

Après l'achat, vous pouvez vous référer à la clé requise pour accéder à l'API en appuyant sur le bouton «Gérer» ci-dessous.

image

À ce stade, la préparation de l'environnement est terminée.

Utilisation de l'API

Bien sûr, il existe un SDK pour l'API ainsi qu'une autre reconnaissance vocale, mais il peut également être utilisé au format API Web. Vous pouvez télécharger le SDK qui convient à votre environnement / utilisation à partir de ce qui suit.

Software Development Kit (SDK)

La documentation officielle est ci-dessous.

Cette fois, nous décrirons l'utilisation au format API Web et un exemple de code en Python3 (bien que tout langage tel que JavaScript / Ruby / PHP / Java puisse être utilisé tant que HTTP peut être ignoré). Pour HTTP Request en Python, le standard est assez difficile, utilisez donc requests. Je veux l'utiliser rapidement car c'est assez ennuyeux! Pour ceux d'entre vous qui ont créé une bibliothèque simple ci-dessous, veuillez l'essayer ici.

icoxfog417/pyoxford

Authentification

Tout d'abord, authentifiez-vous à l'aide de la clé requise pour l'accès API obtenue dans la préparation de l'environnement plus tôt. Il existe deux clés, mais primaire est client_id et secondaire client_secret (jeton secret). Vous trouverez ci-dessous un exemple de code d'authentification (extrait du référentiel ci-dessus avec des modifications mineures).

    def authorize(self, client_id, client_secret):
        url = "https://oxford-speech.cloudapp.net//token/issueToken"

        headers = {
            "Content-type": "application/x-www-form-urlencoded"
        }

        params = urllib.parse.urlencode(
            {"grant_type": "client_credentials",
             "client_id": client_id,
             "client_secret": client_secret,
             "scope": "https://speech.platform.bing.com"}
        )

        response = requests.post(url, data=params, headers=headers)
        if response.ok:
            _body = response.json()
            return _body["access_token"]
        else:
            response.raise_for_status()

Le jeton d'authentification (_body [" access_token "]) obtenu ici sera utilisé pour une future synthèse / reconnaissance.

Synthèse vocale

Maintenant, essayons la synthèse vocale. Dans ce qui suit, l'argument «texte» est la chaîne de caractères à synthétiser vocalement et «jeton» est le jeton d'authentification obtenu précédemment.

    def text_to_speech(self, text, token, lang="en-US", female=True):
        template = """
        <speak version='1.0' xml:lang='{0}'>
            <voice xml:lang='{0}' xml:gender='{1}' name='{2}'>
                {3}
            </voice>
        </speak>
        """

        url = "https://speech.platform.bing.com/synthesize"
        headers = {
            "Content-type": "application/ssml+xml",
            "X-Microsoft-OutputFormat": "riff-16khz-16bit-mono-pcm",
            "Authorization": "Bearer " + token,
            "X-Search-AppId": "07D3234E49CE426DAA29772419F436CA",
            "X-Search-ClientID": "1ECFAE91408841A480F00935DC390960",
            "User-Agent": "OXFORD_TEST"
        }
        name = "Microsoft Server Speech Text to Speech Voice (en-US, ZiraRUS)"
        data = template.format(lang, "Female" if female else "Male", name, text)

        response = requests.post(url, data=data, headers=headers)

        if response.ok:
            return response.content
        else:
            raise response.raise_for_status()

Comme vous pouvez le voir dans le template ci-dessus, la requête est envoyée dans un format XML pour la voix appelé SSML. À ce sujet, le site docomo est détaillé. La limite d'audio qui peut être synthétisée est de 15 secondes. Le résultat est renvoyé au format binaire, donc si vous l'enregistrez sous forme de fichier audio (.wav, etc.), vous pouvez entendre l'audio synthétisé.

Les autres paramètres détaillés sont les suivants.

reconnaissance vocale

Ensuite, effectuons la reconnaissance vocale. Reconnaissons-le en utilisant le contenu (binaire) qui a été synthétisé par la voix tel quel. Il semble qu'il soit censé être utilisé pour faire du texte en continu tout en le reconnaissant, et il semble que la limite soit de 10 secondes à la fois et 14 secondes au total (unité requestid?).

   def speech_to_text(self, binary, token, lang="en-US", samplerate=8000, scenarios="ulm"):
        data = binary
        params = {
            "version": "3.0",
            "appID": "D4D52672-91D7-4C74-8AD8-42B1D98141A5",
            "instanceid": "1ECFAE91408841A480F00935DC390960",
            "requestid": "b2c95ede-97eb-4c88-81e4-80f32d6aee54",
            "format": "json",
            "locale": lang,
            "device.os": "Windows7",
            "scenarios": scenarios,
        }

        url = "https://speech.platform.bing.com/recognize/query?" + urllib.parse.urlencode(params)
        headers = {"Content-type": "audio/wav; samplerate={0}".format(samplerate),
                   "Authorization": "Bearer " + token,
                   "X-Search-AppId": "07D3234E49CE426DAA29772419F436CA",
                   "X-Search-ClientID": "1ECFAE91408841A480F00935DC390960",
                   "User-Agent": "OXFORD_TEST"}

        response = requests.post(url, data=data, headers=headers)

        if response.ok:
            result = response.json()["results"][0]
            return result["lexical"]
        else:
            raise response.raise_for_status()

Il s'agit d'une requête avec une sensation légèrement acrobatique comme si les deux GET / POST, qui sont les informations sur le fichier dans le paramètre de requête et le corps du fichier dans le corps, étaient combinés.

Vous pouvez également éventuellement spécifier les éléments suivants:

La valeur de retour renverra certaines des chaînes de caractères reconnues par ordre décroissant de probabilité. Il est contenu sous forme de tableau dans «results», où «lexical» est la chaîne et «confidence» est la précision.

C'est tout pour l'explication. Vous pouvez facilement synthétiser / reconnaître la voix, alors essayez-la.

Recommended Posts

Synthèse vocale et reconnaissance vocale par Microsoft Project Oxford
Reconnaissance vocale par Python MFCC
Utilisez raspberryPi et julius (reconnaissance vocale). ① Mike
Utilisez raspberryPi et Julius (reconnaissance vocale). ④ L Chika
Utilisez raspberryPi et Julius (reconnaissance vocale). ⑤i2c édition d'affichage des caractères
Reconnaissance vocale des fichiers par l'API Google Speech v2 à l'aide de Python
Utilisez raspberryPi et Julius (reconnaissance vocale). ③ Création de dictionnaire