[アップデート] 音声データを文字起こしして、医療向けインサイトとして要約ができる AWS HealthScribe がGA になりました!! #AWSreinvent

2023.11.28

こんちには。

データアナリティクス事業本部 機械学習チームの中村です。

AWS HealthScribeがGAとして発表されました。

本機能はプレビューとして今年の7月に発表されていたものになります。

公式ドキュメントとしては以下に説明があります。

本記事ではその機能概要の紹介と、実際に使ってみたいと思います。

AWS HealthScribeについて

機能の概要は以下の通りです。

  • コア機能は会話音声データから臨床文書を生成
    • ヘルスケアアプリケーション開発者が患者と医師の会話から臨床文書を自動的に作成
    • 医療業界の文書作成を支援するために特別に訓練された音声認識とGenerative AIをアプリケーションに統合可能
    • Generative AIが生成した文章には、生成された要約の正確性を検証するために、元のトランスクリプトへの参照を付与
    • 基盤となる機械学習(ML)インフラを管理したり、ヘルスケアに特化した大規模言語モデル(LLM)を独自にトレーニングせずに簡単に組み込み可能
  • 話者の識別や発話のカテゴリ化
    • 話者の役割を臨床医または患者として識別し、対話を雑談、主観的、客観的などのカテゴリーに分類することも可能
    • カテゴリー分類により、診察録の最も関連性の高い部分を素早く見つけることが可能
  • 医療用語を抽出の抽出
    • 病状、投薬、治療などの構造化された医療用語を抽出
    • これらの医療用語は、有用なワークフロー候補の生成や、臨床アプリケーションにおける関連データエントリの自動提案に使用することを想定
  • 強固なセキュリティとプライバシー
    • 受信音声や出力テキストを保持しないため、セキュリティとプライバシーが組み込まれている
    • データの保存場所を制御することができ、データは転送中および保存時に暗号化される
  • 対応リージョン
    • US East (N. Virginia)のみ
  • 対応言語
    • 英語(en-US)のみ

Pricing

価格については以下にあります通り、秒単位で$0.001667となっています。

使ってみる

コンソールからの見た目

コンソールとしてはAmazon Transcribeの画面にAWS HealthScribeがありました。

左側メニューから「医療用インサイト」をクリックすることでデモ画面を使用可能で、実際にジョブを実行したい場合は「トランスクリプションジョブ」をクリックします。

まずはデモ画面から使ってみましょう

デモ画面

デモ画面では2種類のデモ音声データと、それに対応するカスタムボキャブラリーが選択できます。

今回は、「遠隔医療 - 血圧」とそれに対応するカスタムボキャブラリーを選択してみます。

音声ファイルは再生が可能で、カスタムボキャブラリーもプレビューを押下すると中身が確認できます。

音声フォーマットは特別にHealthScribe専用の記述が見つけられませんでしたので、Transcribeと同様の以下に沿っていると考えられます。

カスタムボキャブラリーは、トランスクリプションジョブの画面で確認する限りではAmazon Transcribe Medicalのものが指定可能となっているようです。

「分析を開始」を押下すると、分析結果が出力されます。

トランスクリプトを選択すると、各発話の音声を聞くことが可能です。

またインサイトを選択すると、そのインサイトの根拠となっているトランスクリプトが分かるようになっています。

トランスクリプションジョブも実行してみる

S3にデータの準備

データとしてサンプリングレート16000Hz、モノラルの16bit-PCM音声のwavファイルを準備しておきます。

リージョンは同じである必要がありますので、S3バケットはUS East (N. Virginia)リージョンに作成します。

そして例えば以下のような場所にwavファイルを配置します。(今回は日本語の適当なデータで試してみました)

  • s3://{バケット名}/sample-ch1-fs16000.wav

そしてバケットポリシーを以下のように設定しておきます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "transcribe.amazonaws.com"
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::{バケット名}",
                "arn:aws:s3:::{バケット名}/*"
            ]
        }
    ]
}

ジョブの作成

トランスクリプションジョブの画面から「ジョブを作成」を押下します。

ジョブ名や入出力のURIを入力します。

以下はデフォルトで進めます。

IAMロールは作成を選択して、suffixを入れておきます。

最後に末尾の「ジョブを作成」を押下します。

ジョブの結果確認

しばらくまつとジョブが以下のように完了します。

選択すると、出力先を見ることができます。

2つのものが出力されており、transcript.jsonは単純に文字起こしした結果で、summary.jsonは文字起こしした結果から作成された臨床文書(デモ画面でいうとインサイト)となっています。

transcript.jsonの中身は以下のようになっていました。

{
    "Conversation":{
        "ClinicalInsights":[],"ConversationId":"jvIiwfMJJchFUe4al5ylVF","JobName":"cm-nakamura-healthscribe-job","JobType":"ASYNC","LanguageCode":"en-US",
        "TranscriptItems":[
            {
                "Alternatives":[{"Confidence":0.303,"Content":"A"}],"BeginAudioTime":9.97,"EndAudioTime":9.979,"Type":"PRONUNCIATION"
            },{
                "Alternatives":[{"Confidence":0.0,"Content":","}],"BeginAudioTime":0.0,"EndAudioTime":0.0,"Type":"PUNCTUATION"
            },{
                "Alternatives":[{"Confidence":0.027,"Content":"no"}],"BeginAudioTime":12.17,"EndAudioTime":12.189,"Type":"PRONUNCIATION"
            },{
                "Alternatives":[{"Confidence":0.0,"Content":"."}],"BeginAudioTime":0.0,"EndAudioTime":0.0,"Type":"PUNCTUATION"
            }
        ],
        "TranscriptSegments":[
            {
                "BeginAudioTime":9.97,"Content":"A, no.","EndAudioTime":12.189,
                "ParticipantDetails":{"ParticipantRole":"PATIENT_0"},
                "SectionDetails":{"SectionName":"SUBJECTIVE"},
                "SegmentId":"712d8797-0e22-44f7-bdc0-2f9e6c19b46b"
            }
        ]
    }
}

summary.jsonは以下のようになっていました。

{
    "ClinicalDocumentation":{
        "Sections":[
            {
                "SectionName":"CHIEF_COMPLAINT",
                "Summary":[
                    {
                        "EvidenceLinks":[
                            {"SegmentId":"712d8797-0e22-44f7-bdc0-2f9e6c19b46b"}
                        ],
                        "SummarizedSegment":"No clear primary reason for visit could be determined from limited information provided."
                    }
                ]
            },
            {
                "SectionName":"HISTORY_OF_PRESENT_ILLNESS",
                "Summary":[
                    {
                        "EvidenceLinks":[
                            {"SegmentId":"712d8797-0e22-44f7-bdc0-2f9e6c19b46b"}
                        ],
                        "SummarizedSegment":"The patient presents to the clinic today for an unknown reason."
                    },
                    {
                        "EvidenceLinks":[
                            {"SegmentId":"712d8797-0e22-44f7-bdc0-2f9e6c19b46b"}
                        ],
                        "SummarizedSegment":"Based on the extremely limited information provided by the patient stating \"PT: A, no\", there are no discernible details about their current medical condition that can be summarized."
                    },
                    {
                        "EvidenceLinks":[
                            {"SegmentId":"712d8797-0e22-44f7-bdc0-2f9e6c19b46b"}
                        ],
                        "SummarizedSegment":"More context and discussion would be needed to construct a meaningful history of present illness."
                    }
                ]
            },
            {
                "SectionName":"REVIEW_OF_SYSTEMS","Summary":[]
            },
            {
                "SectionName":"PAST_MEDICAL_HISTORY","Summary":[]
            },
            {
                "SectionName":"ASSESSMENT",
                "Summary":[
                    {
                        "EvidenceLinks":[
                            {"SegmentId":"712d8797-0e22-44f7-bdc0-2f9e6c19b46b"}
                        ],
                        "SummarizedSegment":"Unable to determine diagnosis or assessment from limited information provided"
                    }
                ]
            },
            {
                "SectionName":"PLAN",
                "Summary":[
                    {
                        "EvidenceLinks":[
                            {"SegmentId":"712d8797-0e22-44f7-bdc0-2f9e6c19b46b"}
                        ],
                        "SummarizedSegment":"Assessment\n  - Further history and examination is required to understand the patient's concerns.\n"
                    },
                    {
                        "EvidenceLinks":[
                            {"SegmentId":"712d8797-0e22-44f7-bdc0-2f9e6c19b46b"}
                        ],
                        "SummarizedSegment":"Follow up\n  - Schedule a follow up appointment to obtain more information.\n"
                    }
                ]
            }
        ]
    }
}

summary.jsonの各セクション毎に、transcription.jsonのどこに紐づいているかがSegmentIdで表現されていることが分かります。

出力フォーマットの詳細は以下も参照ください。

今回は日本語の適当なファイルを処理してしまったため、有効な結果となっていないように見えますが、実際の音声データを入れる場合は便利そうな機能だなと感じました。

まとめ

いかがでしたでしょうか。今回はGAとなったAWS HealthScribeについてご紹介致しました。

本記事が、今後AWS HealthScribeを活用されようとする方の一助となれば幸いです。