💨

字幕付きの音声ファイルをIIIFビューアで表示する

2024/07/10に公開

概要

字幕付きの音声ファイルをIIIFビューアで表示する機会がありましたので、備忘録です。

国立国会図書館 歴史的音源で公開されている「日本のアクセントと言葉調子(下)」を対象に、OpenAIのSpeech to textを使用しています。文字起こし結果には誤りが含まれていますので、その点はご注意ください。

以下は、Rampでの表示例です。

https://ramp.avalonmediasystem.org/?iiif-content=https://nakamura196.github.io/ramp_data/demo/3571280/manifest.json

以下は、Cloverでの表示例です。

https://samvera-labs.github.io/clover-iiif/docs/viewer/demo?iiif-content=https://nakamura196.github.io/ramp_data/demo/3571280/manifest.json

以下は、Aviaryでの表示例です。こちらについては、残念ながら今回使用したマニフェストファイルの形式では、文字起こしテキストは表示できませんでした。

https://iiif.aviaryplatform.com/player?manifest=https://nakamura196.github.io/ramp_data/demo/3571280/manifest.json

以下、これらのマニフェストファイルの作成方法について紹介します。

mp4ファイルの準備

以下の記事を参考に、mp4ファイルを取得します。

https://zenn.dev/nakamura196/articles/60fbd0c96b44c5

vttファイルの作成

OpenAIのAPIを使用して、文字起こしを行います。

from openai import OpenAI

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
audio_file= open(output_mp4_path, "rb")
transcript = client.audio.transcriptions.create(
    model="whisper-1", 
    file=audio_file,
    response_format="vtt")
with open(output_vtt_path, "w", encoding="utf-8") as file:
    file.write(transcript)

マニフェストファイルの作成

不完全なコードですが、以下のようなプログラムによって、マニフェストファイルを作成します。

from iiif_prezi3 import Manifest, AnnotationPage, Annotation, ResourceItem, config
from moviepy.editor import VideoFileClip

def get_video_duration(filename):
    with VideoFileClip(filename) as video:
        return video.duration

config.configs['helpers.auto_fields.AutoLang'].auto_lang = "ja"

duration=get_video_duration(mp4_path)

manifest = Manifest(id=f"{prefix}/manifest.json", label=label)
canvas = manifest.make_canvas(id=f"{prefix}/canvas", duration=duration)
anno_body = ResourceItem(id=mp4_url,
                        type="Sound",
                        format="audio/mp4",
                        duration=duration)
anno_page = AnnotationPage(id=f"{prefix}/canvas/page")
anno = Annotation(id=f"{prefix}/canvas/page/annotation",
                motivation="painting",
                body=anno_body,
                target=canvas.id)
anno_page.add_item(anno)
canvas.add_item(anno_page)

# VTT URLを追加
vtt_body = ResourceItem(id=vtt_url, type="Text", format="text/vtt")
vtt_anno = Annotation(
    id=f"{prefix}/canvas/annotation/webvtt",
    motivation="supplementing",
    body=vtt_body,
    target=canvas.id,
    label = "WebVTT Transcript (machine-generated)"
    )

vtt_anno_page = AnnotationPage(id=f"{prefix}/canvas/page/2")
vtt_anno_page.add_item(vtt_anno)

canvas.annotations = [vtt_anno_page]

with open(output_path, "w") as f:
    f.write(manifest.json(indent=2))

ライブラリとして、iiif-prezi3を使用しています。以下の記事も参考にしてください。

https://zenn.dev/nakamura196/articles/c07753e47ab393

まとめ

動画や音声へのIIIFの応用にあたり、参考になりましたら幸いです。

Discussion