J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 2

Préface

C'est pourquoi je décrirai la vérification réelle de l'identification du locuteur à l'aide de "l'API de reconnaissance du locuteur". (S'il vous plaît laissez-moi savoir s'il y a quelque chose d'étrange!)

Flux de processus

Les trois étapes suivantes sont nécessaires pour identifier le locuteur.

  1. Créez un profil utilisateur
  2. Enregistrer la voix dans le profil utilisateur
  3. Identifiez qui a dit en fonction de la voix enregistrée

Alors cette fois, j'aimerais créer trois processus pour chaque étape afin de pouvoir les comprendre facilement.

Étape 1 Créez un profil utilisateur

Tout d'abord, créez un utilisateur qui souhaite identifier le locuteur. En tant que fonction API, utilisez "Créer un profil" de "Profil d'identification". Il crée un profil pour l'utilisateur et renvoie l'ID de profil de l'utilisateur. (Le nom n'étant pas enregistré, il est nécessaire de gérer la liste séparément)

Dans le script de vérification, le nom d'utilisateur est spécifié comme argument et le nom d'utilisateur et l'ID sont liés au fichier "Profile_List.csv" et à la sortie.

CreateProfile.py

########### module #############

import sys # Bibliothèque pour stocker des arguments demandes d'importation # Bibliothèque pour la communication HTTP import json # Bibliothèque pour l'utilisation de données au format json import base64 import csv

########### Args & variable #########################
args = sys.argv
Profile_Name = args[1]
Profile_List = 'Profile_List.csv'

########### Create Profile #########################
with open(Profile_List) as fp:
    lst = list(csv.reader(fp))

for i in lst:
    if Profile_Name in i:

print ('L'utilisateur spécifié est déjà enregistré.') sys.exit()

ApiPath = 'https://speaker-recognitionapi.cognitiveservices.azure.com/spid/v1.0/identificationProfiles'

headers = {
    # Request headers
    'Content-Type': 'application/json',

'Ocp-Apim-Subscription-Key': '<clé d'abonnement>', }

body = {
    'locale':'en-us',
}

r = requests.post(
    ApiPath,            # URL 

headers = headers, # headers json = corps # corps )

try:
    ProfileId = r.json()['identificationProfileId']
except Exception:
    print('Error:{}'.format(r.status_code))
    print(r.json()['error'])
    sys.exit()

print(ProfileId)

f = open(Profile_List, 'a')
writer = csv.writer(f, lineterminator='\n')
writer.writerow([Profile_Name, ProfileId])
####################################

Étape 2 Enregistrer la voix dans le profil utilisateur

Nous enregistrerons la voix auprès de l'utilisateur créé ci-dessus. (Contrairement à l'authentification du locuteur, aucune phrase n'est spécifiée, donc tout semble être OK)

Les fonctions suivantes sont utilisées ici.

  1. "Créer une inscription" du "Profil d'identification" (enregistrement vocal)
  2. "Get Operation Status" de "Speaker Recognition" (confirmation de l'état d'enregistrement)

J'en suis également fou personnellement, mais il existe des restrictions assez strictes sur les fichiers audio pouvant être utilisés.

Propriété Valeur requise
récipient WAV
Encoder PCM
taux 16K
Format d'échantillon 16 bits
canal monaural

Je n'ai pas pu obtenir le son qui remplissait les conditions, mais j'ai réussi à l'enregistrer avec un logiciel gratuit appelé "Audacity". (C'est très pratique)

L'argument du script est le nom d'utilisateur. (On suppose que le fichier audio a un nom d'utilisateur, mais il est bon de vérifier)

CreateEnrollment.py

########### module #############

import sys # Bibliothèque pour stocker des arguments demandes d'importation # Bibliothèque pour la communication HTTP import json # Bibliothèque pour l'utilisation de données au format json import base64 import csv import time

########### Args & variable #########################
args = sys.argv
Profile_Name = args[1]
Profile_List = 'Profile_List.csv'
WavFile = f'{Profile_Name}.wav'

with open(Profile_List) as fp:
    lst = list(csv.reader(fp))

for i in lst:
    if Profile_Name in i:
        break

j = lst.index(i)
ProfileId = lst[j][1]

########### Create Enrollment #########################
ApiPath = f'https://speaker-recognitionapi.cognitiveservices.azure.com/spid/v1.0/identificationProfiles/{ProfileId}/enroll?shortAudio=true'

headers = {
    # Request headers
    'Content-Type': 'application/octet-stream',

'Ocp-Apim-Subscription-Key': '<clé d'abonnement>', }

with open(WavFile, 'rb') as f:
    body = f.read()

r = requests.post(
    ApiPath,            # URL 

headers = headers, # headers data = corps # corps )

try:
    response = r
    print('response:', response.status_code)
    if response.status_code == 202:
        print(response.headers['Operation-Location'])
        operation_url = response.headers['Operation-Location']
    else:
        print(response.json()['error'])
        sys.exit()
except Exception:
    print(r.json()['error'])
    sys.exit()
####################################
########### Get Operation Status #########################
url = operation_url

headers = {
    # Request headers

'Ocp-Apim-Subscription-Key': '<clé d'abonnement>', }

status = ''
while status != 'succeeded':
    
    r = requests.get(
        url,            # URL 

headers = headers, # headers )

    try:
        response = r
        print('response:', response.status_code)
        if response.status_code == 200:
            status = response.json()['status']

print (f'état actuel; {status} ') if status == 'failed': message = response.json()['message'] print(f'error:{message}') sys.exit() elif status != 'succeeded': time.sleep(3) else: print(r.json()['error']) sys.exit() except Exception: print(r.json()['error']) sys.exit()

enrollmentStatus = response.json()['processingResult']['enrollmentStatus']
remainingEnrollmentSpeechTime = response.json()['processingResult']['remainingEnrollmentSpeechTime']
speechTime = response.json()['processingResult']['speechTime']

if enrollmentStatus == 'enrolling':

status = 'Le profil est en cours d'enregistrement et n'est pas prêt pour l'identification. ' elif enrollmentStatus == 'training': status = 'Le profil est en cours de formation et n'est pas prêt pour l'identification. ' else: status = 'Le profil est en cours d'enregistrement et prêt pour l'identification. '

print (f '\ n status; {registrationStatus}') print (f'état actuel; {status} ') print (f'temps audio valide total (secondes): {speechTime} ') print (f'Temps audio restant (secondes) requis pour une inscription réussie: {restanteEnrollmentSpeechTime} ')

Étape 3 Identifiez qui a dit en fonction de la voix enregistrée

C'est finalement le processus principal. Les fonctions suivantes sont utilisées ici.

  1. "Identification" de "Speaker Recognition"
  2. «Get Operation Status» de «Speaker Recognition»

Dans cette vérification, le fichier audio dont vous souhaitez identifier les arguments est utilisé. À propos, en ce qui concerne l'identification des locuteurs, il semble que jusqu'à 10 utilisateurs (profils) puissent être vérifiés en même temps jusqu'à présent. En tant que processus, POST la voix et l'ID de profil (multiple) que vous voulez identifier avec "Identification", exécutez "Get Operation Status" pour l'URL retournée ʻOperation-Location`, et vérifiez le statut d'identification et le résultat. C'est l'image à obtenir. {Lors de la vérification, il a fallu jusqu'à 9 secondes pour terminer l'identification) De plus, comme l '"ID de profil" est renvoyé comme résultat d'identification, il est nécessaire de le remplacer par le nom d'utilisateur séparément. La fiabilité de l'identification est également renvoyée, mais il semble qu'il y ait trois niveaux: faible, moyen et élevé.

Identification.py

########### module #############

import sys # Bibliothèque pour stocker des arguments demandes d'importation # Bibliothèque pour la communication HTTP import json # Bibliothèque pour l'utilisation de données au format json import base64 import csv import time

########### Args & variable #########################
args = sys.argv
WavFile = args[1]
Profile_List = 'Profile_List.csv'

with open(Profile_List) as fp:
    lst = list(csv.reader(fp))

########### Identification #########################
ProfileIds = ''
for a, b in lst:
    ProfileIds += b + ','

ProfileIds = ProfileIds[:-1]

url = 'https://speaker-recognitionapi.cognitiveservices.azure.com/spid/v1.0/identify'

params = {
    'identificationProfileIds': ProfileIds,
    'shortAudio': True,
}

headers = {
    # Request headers
    'Content-Type': 'application/octet-stream',

'Ocp-Apim-Subscription-Key': '<clé d'abonnement>', }

with open(WavFile, 'rb') as f:
    body = f.read()

r = requests.post(
    url,            # URL 
    params = params,

headers = headers, # headers data = corps # corps )

try:
    response = r
    print('response:', response.status_code)
    if response.status_code == 202:
        print(response.headers['Operation-Location'])
        operation_url = response.headers['Operation-Location']
    else:
        print(response.json()['error'])
        sys.exit()
except Exception:
    print(r.json()['error'])
    sys.exit()

####################################
########### Get Operation Status #########################
url = operation_url
#url = 'https://speaker-recognitionapi.cognitiveservices.azure.com/spid/v1.0/operations/ea1edc22-32f4-4fb9-81d6-d597a0072c76'

headers = {
    # Request headers

'Ocp-Apim-Subscription-Key': '<clé d'abonnement>', }

status = ''
while status != 'succeeded':
    
    r = requests.get(
        url,            # URL 

headers = headers, # headers )

    try:
        response = r
        print('response:', response.status_code)
        if response.status_code == 200:
            status = response.json()['status']

print (f'état actuel; {status} ') if status == 'failed': message = response.json()['message'] print(f'error:{message}') sys.exit() elif status != 'succeeded': time.sleep(3) else: print(r.json()['error']) sys.exit() except Exception: print(r.json()['error']) sys.exit()

identifiedProfileId = response.json()['processingResult']['identifiedProfileId']
confidence = response.json()['processingResult']['confidence']

for i in lst:
    if identifiedProfileId in i:
        break

j = lst.index(i)
Profile_Name = lst[j][0]

print (f '\ n haut-parleur; {Profile_Name}') print (f 'fiabilité; {confiance}') ####################################

fin

Donc, cette fois, j'ai essayé de vérifier "l'API de reconnaissance de haut-parleur". On a dit que ce n'était pas compatible avec le japonais, mais j'ai personnellement estimé que l'identification du locuteur était assez précise. Il semble que vous puissiez faire diverses choses si vous l'utilisez bien!

Article précédent

J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services en Python. # 1

Recommended Posts

J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 2
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de résoudre le problème avec Python Vol.1
[Python] Utilisez l'API Face de Microsoft Cognitive Services
J'ai essayé de frapper l'API avec le client python d'echonest
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé de publier automatiquement sur ChatWork au moment du déploiement avec Fabric et ChatWork Api
J'ai essayé de créer une API RESTful en connectant l'API rapide du framework Python explosif à MySQL.
J'ai essayé de résoudre le problème de F02 comment écrire en temps réel hors ligne avec Python
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé de prédire les ventes de logiciels de jeux avec VARISTA en me référant à l'article du Codexa
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
Je veux sortir le début du mois prochain avec Python
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
PhytoMine-I a essayé d'obtenir les informations génétiques de la plante avec Python
[Python] J'ai essayé de visualiser le prix en argent de "ONE PIECE" plus de 100 millions de caractères avec matplotlib.
J'ai essayé de résumer le contenu de chaque paquet enregistré par Python pip en une seule ligne
J'ai essayé de résoudre la première question de l'examen d'entrée en mathématiques 2019 de l'Université de Tokyo avec python sympy
J'ai essayé de toucher l'API COTOHA
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
765 J'ai essayé d'identifier les trois familles professionnelles par CNN (avec Chainer 2.0.0)
[AWS] [GCP] J'ai essayé de rendre les services cloud faciles à utiliser avec Python
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé de trouver l'itinéraire optimal du pays des rêves par recuit (quantique)
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
[Linux] J'ai essayé de vérifier la méthode de confirmation sécurisée du FQDN (CentOS7)
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.