💨
字幕付きの音声ファイルをIIIFビューアで表示する
概要
字幕付きの音声ファイルをIIIFビューアで表示する機会がありましたので、備忘録です。
国立国会図書館 歴史的音源で公開されている「日本のアクセントと言葉調子(下)」を対象に、OpenAIのSpeech to textを使用しています。文字起こし結果には誤りが含まれていますので、その点はご注意ください。
以下は、Rampでの表示例です。
以下は、Cloverでの表示例です。
以下は、Aviaryでの表示例です。こちらについては、残念ながら今回使用したマニフェストファイルの形式では、文字起こしテキストは表示できませんでした。
以下、これらのマニフェストファイルの作成方法について紹介します。
mp4ファイルの準備
以下の記事を参考に、mp4ファイルを取得します。
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を使用しています。以下の記事も参考にしてください。
まとめ
動画や音声へのIIIFの応用にあたり、参考になりましたら幸いです。
Discussion