Aus diesem Grund werde ich die tatsächliche Überprüfung der Sprecheridentifikation mithilfe der "Sprechererkennungs-API" beschreiben. (Bitte lassen Sie mich wissen, wenn es etwas Seltsames gibt!)
Die folgenden drei Schritte sind erforderlich, um den Sprecher zu identifizieren.
Dieses Mal möchte ich drei Prozesse für jeden Schritt erstellen, damit ich ihn leicht verstehen kann.
Erstellen Sie zunächst den Benutzer, für den Sie den Sprecher identifizieren möchten. Verwenden Sie als API-Funktion "Profil erstellen" unter "Identifikationsprofil". Es erstellt ein Profil für den Benutzer und gibt die Profil-ID des Benutzers zurück. (Da der Name nicht registriert ist, muss die Liste separat verwaltet werden.)
Im Überprüfungsskript wird der Benutzername als Argument angegeben und der Benutzername und die ID werden mit der Datei "Profile_List.csv" verknüpft und ausgegeben.
CreateProfile.py
########### module #############
import sys # Library zum Speichern von Argumenten Importanfragen # Bibliothek für HTTP-Kommunikation Importieren Sie die json # -Bibliothek für die Verwendung von Daten im json-Format 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 ('Der angegebene Benutzer ist bereits registriert.') sys.exit()
ApiPath = 'https://speaker-recognitionapi.cognitiveservices.azure.com/spid/v1.0/identificationProfiles'
headers = {
# Request headers
'Content-Type': 'application/json',
'Ocp-Apim-Abonnement-Schlüssel': '<Abonnementschlüssel>', }
body = {
'locale':'en-us',
}
r = requests.post(
ApiPath, # URL
Header = Header, # Header json = body # body )
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])
####################################
Wir werden die Stimme bei dem oben erstellten Benutzer registrieren. (Im Gegensatz zur Sprecherauthentifizierung wird keine Phrase angegeben, daher scheint alles in Ordnung zu sein.)
Die folgenden Funktionen werden hier verwendet.
Ich bin auch persönlich verrückt danach, aber es gibt einige ziemlich strenge Einschränkungen für die Audiodateien, die verwendet werden können.
Eigentum | Erforderlicher Wert |
---|---|
Container | WAV |
Kodieren | PCM |
Bewertung | 16K |
Beispielformat | 16 Bit |
Kanal | monaural |
Ich konnte den Sound, der die Bedingungen erfüllte, nicht bekommen, aber ich konnte ihn mit einer kostenlosen Software namens "Audacity" aufnehmen. (Dies ist sehr praktisch)
Das Argument des Skripts ist der Benutzername. (Es wird angenommen, dass die Audiodatei einen Benutzernamen hat, aber es ist gut zu überprüfen)
CreateEnrollment.py
########### module #############
import sys # Library zum Speichern von Argumenten Importanfragen # Bibliothek für HTTP-Kommunikation Importieren Sie die json # -Bibliothek für die Verwendung von Daten im json-Format 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-Abonnement-Schlüssel': '<Abonnementschlüssel>', }
with open(WavFile, 'rb') as f:
body = f.read()
r = requests.post(
ApiPath, # URL
Header = Header, # Header data = body # body )
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-Abonnement-Schlüssel': '<Abonnementschlüssel>', }
status = ''
while status != 'succeeded':
r = requests.get(
url, # URL
Header = Header, # Header )
try:
response = r
print('response:', response.status_code)
if response.status_code == 200:
status = response.json()['status']
print (aktueller Status; {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 = 'Das Profil wird gerade registriert und ist nicht zur Identifizierung bereit. ' elif enrollmentStatus == 'training': status = 'Das Profil wird gerade trainiert und ist nicht zur Identifizierung bereit. ' else: status = 'Das Profil wird gerade registriert und ist zur Identifizierung bereit. '
print (f '\ n Status; {EnrollmentStatus}') print (aktueller Status; {status} ') print (insgesamt gültige Audiozeit (Sekunden): {languageTime} ') print (f'Resting Audio Time (Sekunden) für eine erfolgreiche Registrierung erforderlich: {verbleibendeEnrollmentSpeechTime} ')
Es ist endlich der Hauptprozess. Die folgenden Funktionen werden hier verwendet.
Bei dieser Überprüfung wird die Audiodatei verwendet, deren Argumente Sie identifizieren möchten. Übrigens scheinen in Bezug auf die Sprecheridentifikation bis zu 10 Benutzer (Profile) gleichzeitig verifiziert werden zu können. POSTEN Sie dabei die Sprach- und Profil-ID (Plural), die Sie mit "Identifikation" identifizieren möchten, führen Sie "Get Operation Status" für die zurückgegebene URL "Operation-Location`" aus und überprüfen Sie den Identifikationsstatus und das Ergebnis. Dies ist das Bild zu bekommen. {Bei der Überprüfung dauerte es bis zu 9 Sekunden, bis die Identifizierung abgeschlossen war.) Da die "Profil-ID" als Identifikationsergebnis zurückgegeben wird, muss sie separat durch den Benutzernamen ersetzt werden. Die Zuverlässigkeit der Identifizierung wird ebenfalls zurückgegeben, es scheint jedoch drei Ebenen zu geben: niedrig, mittel und hoch.
Identification.py
########### module #############
import sys # Library zum Speichern von Argumenten Importanfragen # Bibliothek für HTTP-Kommunikation Importieren Sie die json # -Bibliothek für die Verwendung von Daten im json-Format 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-Abonnement-Schlüssel': '<Abonnementschlüssel>', }
with open(WavFile, 'rb') as f:
body = f.read()
r = requests.post(
url, # URL
params = params,
Header = Header, # Header data = body # body )
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-Abonnement-Schlüssel': '<Abonnementschlüssel>', }
status = ''
while status != 'succeeded':
r = requests.get(
url, # URL
Header = Header, # Header )
try:
response = r
print('response:', response.status_code)
if response.status_code == 200:
status = response.json()['status']
print (aktueller Status; {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 Sprecher; {Profilname}') print (Zuverlässigkeit; {Vertrauen} ') ####################################
Also habe ich diesmal versucht, "Speaker Recognition API" zu überprüfen. Es wurde gesagt, dass es nicht mit Japanisch kompatibel sei, aber ich persönlich war der Meinung, dass die Sprecheridentifikation ziemlich genau war. Es scheint, dass Sie verschiedene Dinge tun können, wenn Sie es gut verwenden!
Recommended Posts