[PYTHON] Verwendung von Cloud-Spracherkennungsdiensten von 4 großen Unternehmen

Verwendet Spracherkennungsdienste von Amazon, Google, IBM und Microsoft

Der Name der API des Spracherkennungsdienstes jedes Unternehmens (der Name variiert von Person zu Person, aber es tut mir leid, wenn er falsch ist).

Sie finden es, indem Sie nach einer API namens Speech-to-Text suchen. Nur Amazon heißt Transcribe ...

*** Dieser Artikel basiert auf der Voraussetzung, dass die Vorbereitungen für die Verwendung der einzelnen APIs (Kontoregistrierung usw.) abgeschlossen wurden *** *** Es gibt eine Website, auf der erklärt wird, wie Sie ein Konto auf leicht verständliche Weise durch Suchen registrieren. Geben Sie also bitte Ihr Bestes, um sich zu registrieren ***

So verwenden Sie Amazon Transcribe

――Zunächst müssen Sie die Audiodatei, die Sie erkennen möchten, im AWS-Cloud-Speicher namens S3 ablegen. --Klicken Sie oben links auf der S3-Seite auf *** Bucket erstellen ***, um einen Bucket zu erstellen. Der Bucket-Name kann beliebig sein. Die Region ist Tokio.

% export AWS_SECRET_ACCESS_KEY=[Mein AWS_SECRET_ACCESS_KEY]
% export AWS_ACCESS_KEY_ID=[Mein AWS_ACCESS_KEY_ID]
% export AWS_DEFAULT_REGION=ap-northeast-1
% source ~/.zshrc

recognize.py


from __future__ import print_function
import os,sys
import time
import boto3
import glob
from pprint import pprint
import re
import requests
import json

def extract_url(response):
    '''
Extrahieren Sie die URL-Informationen von S3, in denen das Transkript gespeichert ist, aus der Antwort von api
    '''
    p = re.compile(r'(?:\{\'TranscriptFileUri\':[ ]\')(.*?)(?:\'\}\,)')
    url = re.findall(p,str(response))[0]
    return url

def get_json_result(url):
    '''
Laden Sie Informationen einschließlich der Ergebnisse der Erkennung des JSON-Formats aus der Cloud herunter
    '''
    try:
        r = requests.get(url)
        return str(r.text)
    except requests.exceptions.RequestException as err:
        print(err)

def extract_recognition_result(_json):
    '''
Extrahieren Sie nur das Erkennungsergebnis von json einschließlich des Erkennungsergebnisses
    '''
    json_dict = json.loads(_json)
    recognized_result = json_dict['results']['transcripts'][0]['transcript']
    return recognized_result

def main():
    #Arbeitsverzeichnis
    _dir = '/Users/RecognitionTest'
    #Speicherverzeichnis für Erkennungsergebnisse(Erstellen Sie im Voraus ein Verzeichnis mit dem Namen AWS. Antwortinformationen von der API und Transkriptionsergebnisse werden in diesem Verzeichnis gespeichert.)
    recognition_result = _dir+'/AWS'
    #Eine Textdatei mit dem Namen der Audiodatei, die Sie erkennen möchten
    speech_fname_file = _dir+'/speech_fname.txt'
    #Speichern Sie den Namen der Audiodatei, die Sie erkennen möchten, in der Liste
    speech_fname_list = []
    with open(speech_fname_file,'r') as f:
        path = f.readline()
        while path:
            speech_fname_list.append(path.strip())
            path = f.readline()

    status_file     = recognition_result+'/status.txt'
    json_file       = recognition_result+'/json_response.txt'
    recog_result    = recognition_result+'/recognition_result.txt' #Datei zum Speichern des Erkennungsergebnisses

    with open(status_file,'w') as status_out:
        for speech_fname in speech_fname_list:
            transcribe = boto3.client('transcribe')
            job_name = str(speech_fname) #Name der Audiodatei(Es muss kein Name einer Audiodatei sein, es kann alles sein)
            job_uri = f'https://[Eimername].s3-ap-northeast-1.amazonaws.com/{job_name}' # Bucket name -> recongnitiontest
            transcribe.start_transcription_job(
                TranscriptionJobName=job_name,
                Media={'MediaFileUri': job_uri},
                MediaFormat='wav',
                LanguageCode='ja-JP'
            )
            while True:
                # status:Antwortinformationen(Enthält eine S3-Cloud-URL, in der Erkennungsergebnisse gespeichert werden)
                status = transcribe.get_transcription_job(TranscriptionJobName=job_name)
                if status['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
                    break
                print("Not ready yet...")
                time.sleep(5)

            status_out.write(f'{speech_fname} {status}\n')

    with open(status_file,'r') as status_in, open(json_file,'w') as json_out, open(recog_result,'w') as result:
        status_list = status_in.readlines()
        client = boto3.client('transcribe')
        for status in status_list:
            job_name = status.strip().split(' ')[0]
            response = client.get_transcription_job(TranscriptionJobName=job_name)
            url = extract_url(response)
            _json = get_json_result(url)
            recog_text = extract_recognition_result(_json)
            json_out.write(f'{job_name} {_json}\n')
            result.write(f'{job_name} {recog_text}\n')

if __name__ == "__main__":
    main()

--speech_fname.txt ist eine Textdatei, die den Namen der Audiodatei beschreibt, die Sie erkennen möchten. *** Muss mit dem Namen der Audiodatei im S3-Bucket übereinstimmen. *** Ein Beispiel ist unten angegeben. Dies ist ein Beispiel, wenn Sie fünf separate Audiodateien erkennen möchten. Es ist in Ordnung, wenn Sie dieselbe Audiodatei wie diesen Namen der Audiodatei im S3-Cloud-Speicher ablegen.

speech_fname.txt


speech_data1.wav
speech_data2.wav
speech_data3.wav
speech_data4.wav
speech_data5.wav

Verwendung von Google Cloud Speech-to-Text

% export GOOGLE_APPLICATION_CREDENTIALS="[Pfad zur JSON-Datei]" 
% source ~/.zshrc

recognize.py


import io
import glob
import os
import shutil
from google.cloud import speech_v1p1beta1
from google.cloud.speech_v1p1beta1 import enums

def main():
    client = speech_v1p1beta1.SpeechClient()
    #Arbeitsverzeichnis
    _dir = '/Users/RecognitionTest'
    #Speicherverzeichnis für Erkennungsergebnisse
    recognition_result = _dir+'/GCP'

    #Eine Textdatei, die den Pfad zu der Audiodatei enthält, die Sie erkennen möchten
    speech_data_path_file = _dir+'/speech_data_path.txt'
    #Speichern Sie den Pfad der Audiodatei, die Sie erkennen möchten, in der Liste
    speech_path_list = []
    with open(speech_data_path_file,'r') as f:
        path = f.readline()
        while path:
            speech_path_list.append(path.strip())
            path = f.readline()

    recog_result_fname    = recognition_result+'/recognition_result.txt' #Datei zum Speichern des Erkennungsergebnisses
    with open(recog_result_fname,'w') as recog_result:
        for speech_path in speech_path_list:
            #Namen der Audiodatei abrufen(Wird für den Dateinamen verwendet, um das Erkennungsergebnis zu schreiben)
            speech_file_name = speech_path.split('/')[-1].split('.')[0]   #Ändern Sie den Namen der Audiodatei in den Dateinamen, um das Erkennungsergebnis zu schreiben

            # The use case of the audio, e.g. PHONE_CALL, DISCUSSION, PRESENTATION, et al.
            interaction_type = enums.RecognitionMetadata.InteractionType.DISCUSSION

            # The kind of device used to capture the audio
            recording_device_type = enums.RecognitionMetadata.RecordingDeviceType.RECORDING_DEVICE_TYPE_UNSPECIFIED

            # The device used to make the recording.
            # Arbitrary string, e.g. 'Pixel XL', 'VoIP', 'Cardioid Microphone', or other
            # value.
            recording_device_name = "MR"
            metadata = {
                "interaction_type": interaction_type,
                "recording_device_type": recording_device_type,
                "recording_device_name": recording_device_name,
            }

            # The language of the supplied audio. Even though additional languages are
            # provided by alternative_language_codes, a primary language is still required.
            language_code = "ja-JP" #Stellen Sie die Sprache auf Japanisch ein
            config = {"metadata": metadata, "language_code": language_code}
            with io.open(speech_path, "rb") as f:
                content = f.read()
            audio = {"content": content}

            #Starten Sie die Erkennung
            response = client.recognize(config, audio)

            #Speichern und Anzeigen von Erkennungsergebnissen
            for result in response.results:
                # First alternative is the most probable result
                alternative = result.alternatives[0]
                print(u"Transcript: {}".format(alternative.transcript))
                recog_result.write(u"{} {}".format(speech_file_name,alternative.transcript)+'\n')

if __name__ == "__main__":
    main()

Verwendung von IBM Watson Speech-to-Text

recognize.py


import os,sys
import glob
import re
import json
from os.path import join, dirname
from ibm_watson import SpeechToTextV1
from ibm_watson.websocket import RecognizeCallback, AudioSource
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
from pprint import pprint
import shutil
import jaconv


def extract_recognition_result(_json):
    recognized_result = []
    json_dict = json.loads(_json)
    try:
        transcript = json_dict['results'][0]['alternatives'][0]['transcript'].split(' ')
    except:
        return ' '
    #Da das Stagnationswort in Katakana geschrieben ist, wird es in eine einfache Kana-Notation umgewandelt.
    for word in transcript:
        if 'D_' in word:
            recognized_result.append(jaconv.kata2hira(word))
        else:
            recognized_result.append(word)
    recognized_result = ' '.join(recognized_result)
    recognized_result = recognized_result.replace('D_','')  #Die Stagnation ist'D_'Löschen Sie es, da es in ausgedrückt wird
    return str(recognized_result)


def main():
    #Arbeitsverzeichnis
    _dir = '/Users/RecognitionTest'
    #Speicherverzeichnis für Erkennungsergebnisse
    recognition_result = _dir+'/Watson'

    #Eine Textdatei, die den Pfad zu der Audiodatei enthält, die Sie erkennen möchten
    speech_data_path_file = _dir+'/speech_data_path.txt'
    #Speichern Sie den Pfad der Audiodatei, die Sie erkennen möchten, in der Liste
    speech_path_list = []
    with open(speech_data_path_file,'r') as f:
        path = f.readline()
        while path:
            speech_path_list.append(path.strip())
            path = f.readline()

    #JSON-Datei(Erkennungsergebnis)Speicherverzeichnis
    json_result_dir = recognition_result+'/json_result'
    for speech_path in speech_path_list:
        #Namen der Audiodatei abrufen(Wird für den Dateinamen verwendet, um das Erkennungsergebnis zu schreiben)
        speech_file_name = speech_path.split('/')[-1].split('.')[0]
        with open(f'{json_result_dir}/{speech_file_name}.json','w') as json_out:
            # set apikey
            authenticator = IAMAuthenticator('[Mein API-Schlüssel]')
            service = SpeechToTextV1(authenticator=authenticator)
            # set endpoint url
            service.set_service_url('[Endpunkt-URL]')
            lang = 'ja-JP_BroadbandModel'   #Stellen Sie die Sprache auf Japanisch ein
            with open(speech_path,'rb') as audio_file:
                result_json = service.recognize(audio=audio_file, content_type='audio/wav', timestamps=True, model=lang, word_confidence=True, end_of_phrase_silence_time=30.0)
                result_json = result_json.get_result()

            #Da das Erkennungsergebnis im JSON-Format erfasst wird, ist JSON_resultX.Schreiben Sie an json
            result = json.dumps(result_json, indent=2, ensure_ascii=False)
            json_out.write(result)

    json_file_list = glob.glob(json_result_dir+'/*.json')
    recog_result_file = recognition_result+'/recognition_result.txt'
    with open(recog_result_file,'w') as result:
        for json_file in json_file_list:
            with open(json_file,'r') as _json:
                print(json_file)
                speech_file_name = json_file.strip().split('/')[-1].split('.')[0]
                #Gespeicherter json_resultX.Extrahieren Sie nur Erkennungsergebnisse von json
                recog_result = extract_recognition_result(_json.read())
                result.write(f'{speech_file_name} {recog_result}\n')

if __name__ == "__main__":
    main()

So verwenden Sie Microsoft Azure Speech-to-Text

recognize.py


import time
import wave
import glob
import re
import os

try:
    import azure.cognitiveservices.speech as speechsdk
except ImportError:
    print("""
    Importing the Speech SDK for Python failed.
    Refer to
    https://docs.microsoft.com/azure/cognitive-services/speech-service/quickstart-python for
    installation instructions.
    """)
    import sys
    sys.exit(1)

# Set up the subscription info for the Speech Service:
# Replace with your own subscription key and service region (e.g., "westus").
#Service Bereich(service_region)Ostjapan(japaneast)Einstellen
# speech_key ->Überprüfen Sie auf meiner Seite von Azure
speech_key, service_region = "[Meine Rede_key]", "japaneast"

# Specify the path to an audio file containing speech (mono WAV / PCM with a sampling rate of 16
# kHz).


def main():
    """performs continuous speech recognition with input from an audio file"""
    # <SpeechContinuousRecognitionWithFile>

    #Arbeitsverzeichnis
    _dir = '/Users/RecognitionTest'
    #Speicherverzeichnis für Erkennungsergebnisse
    recognition_result = _dir+'/Azure'

    #Eine Textdatei, die den Pfad zu der Audiodatei enthält, die Sie erkennen möchten
    speech_data_path_file = _dir+'/speech_data_path.txt'
    #Speichern Sie den Pfad der Audiodatei, die Sie erkennen möchten, in der Liste
    speech_path_list = []
    with open(speech_data_path_file,'r') as f:
        path = f.readline()
        while path:
            speech_path_list.append(path.strip())
            path = f.readline()

    #Erstellung einer Datei zum Schreiben des Erkennungsergebnisses(pre_result.Andere Informationen als das Erkennungsergebnis werden ebenfalls in txt geschrieben)
    with open(f'{recognition_result}/pre_result.txt','w') as recog_result:
        for speech_path in speech_path_list:
            speech_file_name = speech_path.split('/')[-1].split('.')[0]   #Verwenden Sie den Namen der Audiodatei als Dateinamen, um das Erkennungsergebnis zu schreiben
            speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)
            audio_config = speechsdk.audio.AudioConfig(filename=speech_path)
            speech_config.speech_recognition_language="ja-JP"   #Stellen Sie die Sprache auf Japanisch ein
            profanity_option = speechsdk.ProfanityOption(2) #Unangemessene Sprachverarbeitung 0->ausblenden, 1->Löschen, 2->Einschließlich
            speech_config.set_profanity(profanity_option=profanity_option)  # profanity_Option ändern
            speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

            done = False

            def stop_cb(evt):
                """callback that signals to stop continuous recognition upon receiving an event `evt`"""
                print('CLOSING on {}'.format(evt))
                nonlocal done
                done = True

            # Connect callbacks to the events fired by the speech recognizer
            speech_recognizer.recognizing.connect(lambda evt: print('RECOGNIZING: {}'.format(evt)))

            #Erkennungsergebnis schreiben
            speech_recognizer.recognized.connect(lambda evt: recog_result.write('{} RECOGNIZED: {}'.format(speech_file_name,evt)+'\n'))

            speech_recognizer.session_started.connect(lambda evt: print('SESSION STARTED: {}'.format(evt)))

            speech_recognizer.session_stopped.connect(lambda evt: print('SESSION STOPPED {}'.format(evt)))

            speech_recognizer.canceled.connect(lambda evt: print('CANCELED {}'.format(evt)))

            # stop continuous recognition on either session stopped or canceled events
            speech_recognizer.session_stopped.connect(stop_cb)
            speech_recognizer.canceled.connect(stop_cb)

            # Start continuous speech recognition
            speech_recognizer.start_continuous_recognition()
            while not done:
                time.sleep(.5)

            speech_recognizer.stop_continuous_recognition()
            # </SpeechContinuousRecognitionWithFile>

def fix_recognition_result():
    '''
    - pre_result.txt ist das Erkennungsergebnis im folgenden Format
        - [SPEECH FILE NAME] RECOGNIZED: SpeechRecognitionEventArgs(session_id=XXX, result=SpeechRecognitionResult(result_id=YYY, text="[Erkennungsergebnis]", reason=ResultReason.RecognizedSpeech))
    - [SPEECH FILE NAME]Wann[Erkennungsergebnis]Extrahieren Sie nur den Teil von
    '''
    #Erkennungsergebnisdatei
    pre_result = '/Users/kamiken/speech_recognition_data/Cloud_Speech_to_Text/Compare4Kaldi/Compare_Test1/Azure/pre_result.txt'
    #Andere Informationen als Erkennungsergebnisse(Parameter etc.)Löschen
    with open(pre_result,'r') as pre, open(pre_result.replace('pre_',''),'w') as result:
        lines = pre.readlines()
        for line in lines:
            split_line = line.strip().split(' ')
            speech_file_name = split_line[0]
            text = str(re.findall('text=\"(.*)\",',' '.join(split_line[1:]))[0])+'\n'
            result.write(f'{speech_file_name} {text}')

if __name__ == "__main__":
    main()
    fix_recognition_result()

Recommended Posts

Verwendung von Cloud-Spracherkennungsdiensten von 4 großen Unternehmen
Vergleich der Genauigkeit der Cloud-Spracherkennung von 4 großen Unternehmen
Zusammenfassung der Verwendung von pandas.DataFrame.loc
Zusammenfassung der Verwendung von pyenv-virtualenv
[Python] Zusammenfassung der Verwendung von Pandas
Berechnen Verwenden Sie% des Befehls df
[Python2.7] Zusammenfassung der Verwendung von unittest
Jupyter Notebook Grundlagen der Verwendung
Zusammenfassung der Verwendung der Python-Liste
Verwendung der Cloud Vision API von GCP
[Python2.7] Zusammenfassung der Verwendung des Unterprozesses
[Frage] Wie verwende ich plot_surface von Python?
Verwendung von Folium (Visualisierung von Standortinformationen)
Nicht viel erwähnt, wie man Pickle benutzt
Zusammenfassung der Verwendung von MNIST mit Python
Verwendung der Google Cloud Translation API
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
Wie benutzt man Seaboan?
Verwendung von Image-Match
Wie man Shogun benutzt
Verwendung von Virtualenv
Verwendung von numpy.vectorize
Verwendung von pytest_report_header
Wie man teilweise verwendet
Wie man Bio.Phylo benutzt
Verwendung von SymPy
Wie man x-means benutzt
Verwendung von WikiExtractor.py
Verwendung von virtualenv
Wie benutzt man Matplotlib?
Verwendung von iptables
Wie benutzt man numpy?
Verwendung von TokyoTechFes2015
Wie benutzt man venv
Wie benutzt man Pyenv?
Verwendung der Liste []
Wie man Python-Kabusapi benutzt
Verwendung von OptParse
Verwendung von return
Wie man Imutils benutzt
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Hinweise zur Verwendung beim Kombinieren von pandas.DataFrame
Verwendung von Python Kivy ~ ~ Grundlagen der Kv-Sprache ~
Verwendung von Qt Designer
Verwendung der Suche sortiert
python3: Verwendung der Flasche (2)
Verstehen Sie, wie man Django-Filter verwendet
Verwendung des Generators
Verwendung von FastAPI ③ OpenAPI
Wie benutzt man Python Argparse?
Verwendung von IPython Notebook
Wie man Pandas Rolling benutzt
[Hinweis] Verwendung von virtualenv