永里氏の自己紹介

永里洋氏:今回はStudyCoさんのLT会に初参加ということで、よろしくお願いいたします。

本日は「Azure OpenAI Service」を利用して、リアルタイムで音声データを取得して、文字起こしをリアルタイムで処理して動かしてみるということをやったので、軽く話します。

一瞬だけ「Notebook」を動かします。うまくいくかどうかわからないですが、リアルタイム文字起こしをこの発表でそのままやって、うまくいくかどうかを試してみようかと思います。

まず自己紹介をします。永里洋と申します。現在、株式会社エーピーコミュニケーションズで仕事をしています。もともとはネットワークインフラ系の職種をやっていたところ、クラウド基盤系の案件から機械学習系、ビッグデータ系の案件に関わるようになってきて、徐々にそちらの仕事をしています。現在はデータエンジニアリング系やデータサイエンス系の仕事も徐々に担当しています。

本セッションで話すこと

本日は、先ほど少し話しましたが、リアルタイムの音声の文字起こし処理の検証をやったことのシナリオ説明して、今デモンストレーションを動かしてみていますが、内容の紹介を軽くして、デモを見てもらおうかなと考えています。

デモンストレーションシナリオ

(スライドを示して)では、まずはやってみたいことと検証のシナリオになりますが、こちらになります。弊社でも現在、Azure OpenAIといった生成AIを有効活用して、いろいろなお客さまに導入しようという話がよく出ています。

典型的な導入パターンだと、「Azure Cognitive Search」、現在は「Azure AI Search」と呼ばれています。いわゆるテキスト検索です。

今はベクトルサーチやセマンティック検索もできるようなサービスになってきていますが、そういったナレッジデータベースとAzure OpenAI Serviceを組み合わせたRAG(Retrieval-Augmented Generation)の形態でのFAQサービスなど……。典型的なサービスになっちゃうかもしれませんが、こういった話の導入をよく聞いています。

こちらは、リアルタイムで会議のやり取りを取得して、文字起こししたデータをどんどんAzure AI Searchに溜め込んでいき、会議が進行中の状態で、その時点での要約情報を取ったり、進行状況の確認、今どういった話が進んでいるかや、論点や課題の整理、進行中の会議の中でのナレッジの有効活用などができるんじゃないかなというところを期待していて、少しずつ検証をやっています。

内容としてはまだ雑なところもありますが、想定としては現場の中で会議やミーティングでやり取りされている意見や議事とか、レビューなどを取ったり、なにかしらのイベントやLT会で発表された内容などを収集、蓄積していって、うまく有効活用できないかというところを試しています。

Azure OpenAI Service について

今回は、対象としてAzure OpenAI Serviceを利用しようかと思っています。みなさんもよく利用していると思いますが、テキストの生成部分では、GPT-3.5やGPT-4を使い分けながら試しています。あと、まだ日本では提供できていないようですが、Azure OpenAI Serviceの中の音声文字起こしサービスとして「Whisper」を今回使っています。

厳密にはリアルタイムでの音声の取得はまだできないようですが、今回はいったんバッチ方式で取ろうということをやっています。

厳密には、Azureは別のAIサービスで「Speech to Text」といったサービスもあるにはあるのですが、今回はWhisperを利用しています。画像生成サービスもあるようですが、今回は使っていません。

デモンストレーションの内容

デモンストレーションの内容の紹介に移ります。(スライドを示して)大まかな構成になりますが、上段の会議参加者の部分と、下段の取得したナレッジからなにかしらの要約を取得したい人、上の人と下の人の2つの登場人物がいるようなイメージで書いています。

上のほうでは、参加者の方がなにかしらの発声をした場合、今回はPythonスクリプトを使っているのですが、そこから音声データをWebファイルとして取得して、WebファイルからAzure OpenAIのWhisperにアクセスして文字起こしするといった構成を取っています。

そして、文字起こししたサービスの中の言語情報に整形をかけたり、元データで発声されている方が国外の方だった場合も見据えて、日本語に翻訳するというかたちで今回やっています。

文字起こしされたデータをリアルタイムでどんどんAzure AI Searchに蓄積するというかたちでリアルタイムでナレッジが蓄積されている動きを取り、それに対して進行中の会議やミーティングでなにかしらのデータ、要約文とかを取得したいという登場人物が下にいます。

今回はPythonで「LangChain」を使っていますが、Azure OpenAIとAzure AI Searchを組み合わせたRAGの構成で、AI Searchから該当の会議の情報を抜き出してくる、欲しい情報を抜き出せるというかたちを目指してやっています。

ただ今回は、そこまで複雑なかたちは目指さずに、いったん会議の要約ができないかなと目指しています。

会議参加者のパターンの構成

今、上と下で2役の紹介をしましたが、まずは上の会議参加者の方のパターンにフォーカスして軽く話します。

(スライドを示して)こちらが今回作った簡単な構成についてのパターンになります。今回はこのまま利用しています。ローカルPCの環境でPythonのコードをNotebook環境で動かしていて、こちら(スライド図左)が端末のデバイスですね。マイクデバイスからインプットして入力した音声データを取得しています。

こちら(スライド図の真ん中)が、今実行中のPythonのコードで、「PyAudio」を使って一定間隔ごとにWAVファイルを取得するかたちで進行しています。

こちらはスレッドのかたちで動いていて、ここから一つひとつ生成されたファイル情報がqueueを通り、文字起こしの取得スレッドに渡されるようにしています。

文字起こしの取得スレッドは、queueから受け取った音声情報のファイル名をもとにAzure OpenAI側のWhisper APIを叩いて、文字起こし情報を取得して、そこから翻訳なり文章整形をして、Azure OpenAI側に送るような処理で書いています。

今動いている処理がうまくいったらいいですが。一定間隔ごとにリアルタイムの音声文字起こしが進行しているかたちを、簡単にJSONで吐き出しています。

今想像したとおりに動いているのがいったんはわかるようです。(画面を示して)こんなかたちで、一定間隔ごとに少しずつしゃべっている内容が文字起こしされて、Azure AI Searchにどんどん蓄積されていくような流れになっています。

(画面を示して)今回LLM側については、LangChainとAzure OpenAIの構成を使っていて、こういったかたちでいったん簡単な関数にして、そこからどのモデルを使うか選択するようなイメージにしています。

文字起こしされたデータについては、口語体になっているような文章をよりフォーマルなかたちで整形するというようなお願いごとをするプロンプトを投げていて、それで先ほどのような整形された文章をAzure AI Searchのほうに投げています。

Azure AI Searchは専用のSDKが一応あるにはあるんですが、今回は特には使っていません。そのままの素のREST APIを叩くかたちで、今回は用に立てています。

Azure AI Searchのリソースに対して、関数としてのかたちでRESTでどんどん文字起こしデータを投げているような構成を取っています。

取得したナレッジからなにかしらの要約を取得したいパターンの構成

続いて、下のほうですね。リアルタイムで進行している会議について、なにかしらの知りたい情報を取りたいというパターンです。下の段の役割を取っていた方についての紹介になります。今回、LangChainのAgentを立てるかたちで処理を作ってみました。

1つは、Azure OpenAI側のLLMコンポーネントとして「GPT-4」のモデルを使っています。と同時に、現在のAzure AI Searchのストア上にどういったセッション、会議情報が蓄積されているかというセッションのリストを取得するためのカスタムツールを簡単に作っています。

リストから取得した会議一覧の中から特定の会議を選択して、その会議についての要約文を得るためのカスタムツールをまた別で作っています。

こちらも今回はNotebookで簡単に書いています。(画面をしめして)このように簡単にCustom agentを作っています。

先ほど、セッションのリストを取得するという話をしました。(画面を示して)カスタムツール用としてこんなかたちで「findSessionTool」という簡単な関数のクラスを書いています。

もう1つは特定のセッションの要約文を得るための簡単なクラスを作っています。先ほど簡単に話したAI SearchからRESTで簡単なデータを取るための簡単な関数を使って取得できるように書いています。

2つのパターンそれぞれのデモンストレーション

こちらがうまく意図どおりに動くかどうか試してみようかと思います。(画面を示して)こういったかたちで、Agentに対して「OpenAIに関するセッションを探して、HTMLのリスト形式で教えてほしい」と、聞いてみます。現在進行しているこのLTについてのタイトルもうまく取れたら成功かなと思います。

(取得したデータを確認して)いくつか取れましたね。きれいに行ごとに分かれていたら理想的だったのですが……。他にも蓄積されているタイトルがあるのですが、こういった蓄積しているセッションのタイトルがリストで取れるようなかたちを考えていました。

(画面を示して)今話しているセッションの内容は、Azure OpenAI Serviceを利用したリアルタイム文字起こし処理だと思いますが、こういったかたちで取れています。

では続いて、こちら(スライド下段)の処理の、こちらのセッションのリアルタイムで進行している内容の要約文が取れるかを試してみます。簡単なプロンプトを書いて、「このタイトルについての要約文を取ってくれ」とお願いしてみます。時間がかかっちゃうかもしれませんが、少しお待ちください。

(取得したデータを確認して)こういったかたちで、現在進行しているLTの要約文を簡単に吐き出してくれました。

ちょっとまだコードに粗い部分もありますが、リアルタイムで進行している会議やミーティングについての有用な知見が取れるんじゃないかということで、こんなかたちで情報共有しました。

以上で私のセッションは終了します。ありがとうございました。