🙆

IIIF Audio/Visual: 複数のvttファイルを記述する

2024/07/12に公開

概要

IIIFを用いたAudio/Visual資料の記述について、複数のvttファイルを記述する方法に関する備忘録です。

ここでは、以下のように、日英の文字起こしテキストを記述します。

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

マニフェストファイルの記述

以下に例を格納しています。

https://github.com/nakamura196/ramp_data/blob/main/docs/demo/3571280/manifest.json

以下の記事も参考にしてください。

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

具体的には、以下のように複数のアノテーションとして記述することで、rampビューアによって正しく処理されました。

...
"annotations": [
        {
          "id": "https://nakamura196.github.io/ramp_data/demo/3571280/canvas/page/2",
          "type": "AnnotationPage",
          "items": [
            {
              "id": "https://nakamura196.github.io/ramp_data/demo/3571280/canvas/annotation/webvtt",
              "type": "Annotation",
              "label": {
                "ja": [
                  "日本語 (machine-generated)"
                ]
              },
              "motivation": "supplementing",
              "body": {
                "id": "https://nakamura196.github.io/ramp_data/demo/3571280/3571280.vtt",
                "type": "Text",
                "format": "text/vtt",
                "label": {
                  "ja": [
                    "日本語 (machine-generated)"
                  ]
                }
              },
              "target": "https://nakamura196.github.io/ramp_data/demo/3571280/canvas"
            },
            {
              "id": "https://nakamura196.github.io/ramp_data/demo/3571280/canvas/annotation/webvtt/2",
              "type": "Annotation",
              "label": {
                "ja": [
                  "English (machine-generated)"
                ]
              },
              "motivation": "supplementing",
              "body": {
                "id": "https://nakamura196.github.io/ramp_data/demo/3571280/3571280_en.vtt",
                "type": "Text",
                "format": "text/vtt",
                "label": {
                  "ja": [
                    "English (machine-generated)"
                  ]
                }
              },
              "target": "https://nakamura196.github.io/ramp_data/demo/3571280/canvas"
            }
          ]
        }
      ]
...

なお、Cloverでは、2つの文字起こしテキストが連続して表示されました。

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

(参考)英語の文字起こしテキストの作成

英語の文字起こしテキストの作成にあたっては、以下のようなプログラムを使用しました。以下はGitHub版Whisperを使用した例です。

https://github.com/openai/whisper

def format_timestamp(seconds):
    """Converts time in seconds to a formatted string 'HH:MM:SS.mmm'."""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    seconds = seconds % 60
    return f"{hours:02}:{minutes:02}:{seconds:06.3f}"

def write_vtt(transcription, file_path):
    with open(file_path, 'w') as file:
        file.write("WEBVTT\n\n")
        for i, segment in enumerate(transcription['segments']):
            start = format_timestamp(segment['start'])
            end = format_timestamp(segment['end'])
            text = segment['text'].strip()
            file.write(f"{start} --> {end}\n{text}\n\n") # {i + 1}\n

def translate(input_path, output_path, verbose=False):
    model = whisper.load_model('medium')
    result = model.transcribe(input_path, verbose=verbose, language="ja", task="translate")
    write_vtt(result, output_path)
    return result

当初、API版Whisperによる翻訳を以下のように試しましたが、日本語で出力され、うまく英語テキストを作成できませんでした。

transcript = client.audio.translations.create(
    model="whisper-1", 
    file=audio_file,
    response_format="vtt",
)

まとめ

複数の文字起こしテキストや字幕ファイルの記述にあたり、参考になりましたら幸いです。

Discussion