https://a.storyblok.com/f/270183/961037/0cefb25bb5/classify-audio-nlp.png

NLPを使用して通話録音を自動的に分類

最終更新日 April 28, 2021

所要時間:1 分

NexmoのVoice APIを使えば、電話の着信や発信を簡単に録音することができます。しかし、「コンピュータサイエンス」のような特定のトピックについて人々が議論しているすべての通話を見つけるには、すべての音声ファイルを毎回聞く必要があり、非常に時間がかかります。

このチュートリアルでは、Google Cloud Services経由で自然言語処理を使用して各録音の内容を自動的に分類し、特定のトピックに関する音声通話をすばやく識別する方法を紹介します。

前提条件

すべての このチュートリアルのコードはすべてGitHubにあります。.このチュートリアルでは pipenvを使用し、Python 3.6.4が必要です。仮想環境を作成し、依存関係をインストールすることができます:

pipenv install

ここではNexmo Voice API、具体的には recordアクションを使用します。このチュートリアルを続ける前に、Voice Building BlocksとVoice Applicationsの作成に関する過去のチュートリアルを読んでください。

このチュートリアルでは、Cloud Speech-to-TextとCloud Natural Languageの2つのGoogle Cloud Services APIも使用します。新しいGoogle Cloud Platform(GCP)プロジェクトを作成し、Speech-to-TextとNatural Languageを有効にしてください。

GCPプロジェクトの認証情報をダウンロードし、スクリプトがアクセスできる場所に保存することを忘れないでください。私はプロジェクトのルートに追加し、名前を google_private.json.

プロジェクトのルートに .env.exampleファイルがあります。このサンプル・ファイルは、アプリケーションが期待するさまざまな環境変数の概要を示しています。このファイルをコピーし、名前を .env.このファイルで設定された値は、実行時に自動的に環境にロードされます:

pipenv shell

通話の録音

もうお分かりいただけただろうか。 NCCO.最初のFlaskルートはNCCOファイルを提供し、Nexmo Voice APIにVirtual Numberへの通話を録音するように指示します:

@app.route("/", methods=["GET"])
def ncco():
    logger.info(f"New call received from {request.args['from']}")
    return jsonify(
        [
            {"action": "talk", "text": "Record your message after the beep"},
            {
                "action": "record",
                "eventUrl": [f"{os.environ['BASE_URL']}/recordings"],
                "format": "wav",
                "endOnKey": "*",
                "beepStart": True,
            },
        ]
    )

上記のコードで注意すべき点は主に2つある:

  1. その event_urlはローカルのFlaskサーバーを指しています。このルートのハンドラについてはチュートリアルの後半で説明します。

  2. 録音形式は wavデフォルトでは、Nexmoは録音をMP3ファイルとして提供します。しかし、Google Speech-to-TextサービスはWAVをサポートしているので、録音形式をそれに合わせる必要があります。

新しいレコーディング・ウェブフック

通話が完了するたびに、Nexmo Voice APIは以下のリクエストを送信します。 POSTリクエストを event_url.Flaskのビューハンドラーから重い作業のほとんどを抜き出し、一連のバックグラウンドタスクに移した。 Huey:

pipeline = download_recording_task.then(transcribe_audio).then(classify_transcription)
huey.enqueue(pipeline)

録音をダウンロードする

その get_recordingメソッドは NexmoのPythonクライアントのメソッドは新しいので、もし以前にPythonクライアントをインストールしたことがあるなら、アップグレードする必要があるでしょう:

@huey.task()
def download_recording(recording_url, recording_uuid):
    logger.info(f"Download recording {recording_uuid}")

    recording = nexmo_client.get_recording(recording_url)
    recordingfile = f"./recordings/{recording_uuid}.wav"
    os.makedirs(os.path.dirname(recordingfile), exist_ok=True)

    with open(recordingfile, "wb") as f:
        f.write(recording)

    return {"recording_uuid": recording_uuid}

NexmoからWAVファイルを取得した後、アプリケーションはそれを以下のディレクトリに保存します。 recordingsディレクトリに保存されます。この download_recording関数は辞書内の recording_uuidHuey は戻り値をキーワード引数としてパイプラインの次の関数に渡します。

録音を書き起こす

オーディオファイルの内容を自然言語処理する前に、テキストに変換する必要があります:

@huey.task()
def transcribe_audio(*args, recording_uuid):
    # Instantiates a client
    client = speech.SpeechClient()

    # The name of the audio file to transcribe
    file_name = f"./recordings/{recording_uuid}.wav"

    # Loads the audio into memory
    with io.open(file_name, "rb") as audio_file:
        content = audio_file.read()
        audio = speech_types.RecognitionAudio(content=content)

    config = speech_types.RecognitionConfig(
        encoding=speech_enums.RecognitionConfig.AudioEncoding.LINEAR16,
        sample_rate_hertz=16000,
        language_code="en-US",
    )

    # Detects speech in the audio file
    logger.info(f"Sending file {recording_uuid} for transcribing")
    response = client.recognize(config, audio)

    return {
        "transcription_text": response.results[0].alternatives[0].transcript,
        "recording_uuid": recording_uuid,
    }

Google Cloud Speech-to-Text APIについては Google Cloud Speech-to-Text APIについては、Google Cloudのウェブサイトをご覧ください。.音声ファイルがテキストに変換されると、パイプラインの次の関数がトリガーされます。

録画の分類

Screenshot of terminal showing audio classificationScreenshot of terminal showing audio classification

アプリケーションは最後のAPIコールを行い、今度はGoogle Cloud Languageサービスにコールする:

@huey.task()
def classify_transcription(transcription_text, recording_uuid):
    client = language.LanguageServiceClient()

    document = language_types.Document(
        content=transcription_text, type=language_enums.Document.Type.PLAIN_TEXT
    )

    logger.info(f"Classifying transcription for recording {recording_uuid}")
    categories = client.classify_text(document).categories

    for category in categories:
        print(colorful.bold_violet("=" * 20))
        print(colorful.bold_violet("{:<16}: {}".format("name", category.name)))
        print(
            colorful.bold_violet("{:<16}: {}".format("confidence", category.confidence))
        )

    return True

このAPIは単にテキストを分類するだけでなく、提供されたテキストのセンチメントに関する洞察を提供したり、構文解析を使用してテキストを一連の文やトークンに分解したりすることができる。 詳しくはドキュメントを読んでほしい。.

さらに読む

このチュートリアルで、Nexmo Voice APIとGoogle Cloudを組み合わせるとどんなことができるのか、ある程度ご理解いただけたと思います。Nexmo Voice APIで実現できる他のエキサイティングなことについての情報をお知りになりたい場合は、他のチュートリアルをご覧ください:

シェア:

https://a.storyblok.com/f/270183/150x150/a3d03a85fd/placeholder.svg
Aaron Bassettヴォネージの卒業生

アーロンはNexmoの開発者支持者だった。ベテランのソフトウェア・エンジニアであり、デジタル・アーティスト志望でもあるアーロンは、コードや電子機器、時にはその両方を使って何かを作っているところをよく見かける。彼が何か新しいことに取り組んでいるときは、空気中の部品が燃える匂いでわかるのが通例だ。