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!)
Les trois étapes suivantes sont nécessaires pour identifier le locuteur.
Alors cette fois, j'aimerais créer trois processus pour chaque étape afin de pouvoir les comprendre facilement.
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])
####################################
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.
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} ')
C'est finalement le processus principal. Les fonctions suivantes sont utilisées ici.
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}') ####################################
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!
Recommended Posts