コンテンツへスキップ
チュートリアル14分で読めます

Praat TextGrid の往復による ToBI 韻律ラベリング

Potato 2.13.1 で ToBI の音調と切れ目指標を点ティアとしてラベル付けします。Praat の TextGrid から始め、Praat が読み戻せる TextGrid をエクスポートします。

Potato Team

録音と Praat の TextGrid を持つ音声学者や韻律研究者は、このチュートリアルに従うことで、Potato 2.13.1 で ToBI ラベリングを行い、ラベルを TextGrid として取り戻せます。ToBI(Tones and Break Indices)は、イントネーションと韻律的なフレージングを書き起こすための規約の集まりです。Silverman et al. (1992) が、アメリカ英語向けに ToBI を導入しました。このページのタスクは、録音の波形と、その下に4つのティアを表示します。音調ティアと切れ目指標ティアは時間上の点を保持し、単語ティアはインターバルを保持し、その他(misc)ティアは非流暢性とノイズを記録します。点ティアは Potato 2.13.1 で導入され、インポーターと textgrid エクスポーターは、どちらも Praat の点ティアを読み書きします。1台のサーバーで、複数の書き起こし担当者が同じ発話にラベルを付けられ、各担当者の作業は別々の TextGrid としてエクスポートされます。

ToBI の4つのティア

ToBI の書き起こしは、音声と F0 の記録を4つのティアと組み合わせます。Beckman, Hirschberg, and Shattuck-Hufnagel (2005) は、元の主流アメリカ英語のシステム(MAE_ToBI)のティアを次のように挙げています。

  • 音調(Tones)。 ピッチアクセント、句アクセント、境界音調で、それぞれ時間上の1点に置かれます。
  • 単語(Words)。 正書法による書き起こしで、各単語の終わりが時間上に印されます。
  • 切れ目指標(Break indices)。 各単語のあとの連接の程度を表す、0から4の数字です。
  • その他(Misc)。 非流暢性、コメント、その他の事象です。

Praat の TextGrid では、音調と切れ目指標は通常、点ティア(TextTier)で、単語とその他はインターバルティアです。次の設定のラベル一覧は、同じ章の MAE_ToBI の表に従っています。

ラベルの種類ラベル
ピッチアクセントH*、L*、L+H*、L*+H、H+!H*、およびダウンステップした !H*、L+!H*、L*+!H
句アクセントL-、H-、!H-(切れ目指標が3または4のすべての位置)
境界音調L%、H%(切れ目指標が4のすべての位置)、および周辺的な語頭の %H
不確実性音調が生じたかどうかについての *?、-?、%?、およびどの音調かについての X*?、X-?、X%?
切れ目指標0、1、2、3、4。不確実性は - で(3-、4-)、ためらいは p で(1p、2p、3p)表します

ティア表示と、ない F0 トラック

Potato の tiered_annotation スキームは、録音全体の波形、現在のウィンドウを拡大した波形、ティアごとの1行を描画します。点ティアでは、書き起こし担当者がクリックして、選択中のラベルで点を置き、ドラッグして点を動かします。点を選択して別のラベルボタンをクリックすると、その点のラベルを付け替えられ、選択した点は Delete キーで削除できます。インターバルティアでは、クリックしてドラッグします。

Potato 2.13.1 のティア表示には、F0 トラックもスペクトログラムもありません。書き起こし担当者は、F0 の曲線を見てピッチアクセントを判断します。ピッチのトラックを見るために、同じ WAV ファイルを Praat で開いたままにしてください。また、各ティアで選べるのは、設定に列挙されたラベルだけで、ラベルを入力するボックスはありません。そのため、単語は書き起こし担当者からではなく、TextGrid から取り込まれます。

TextGrid を準備する

発話ごとに1つの TextGrid と1つの WAV ファイルをフォルダーに入れ、utt01.TextGrid と utt01.wav のように名前を対応させます。ティアには tones、words、breaks、misc と名前を付け、tones と breaks を点ティアにします。単語ティアは強制アライナーで作れ、Montreal Forced Aligner は、デフォルトで long 形式の TextGrid を書き出します。アライナーの出力に足りない3つのティアは、Praat の Insert point tier と Insert interval tier のコマンドで追加します。後述の設定が名前を挙げているのは4つの ToBI ティアだけなので、インポートの前に、アライナーの音素ティアは削除してください。すでにラベルが入っているティアは、事前アノテーションとして Potato に取り込まれます。したがって、別の書き起こし担当者による最初のパスは、事前アノテーションとして届きます。

TextGrid をインポートする

インポートコマンドは、フォルダーを、TextGrid ごとに1項目の Potato プロジェクトに変換します。

bash
potato import -i textgrids -o tobi_project

テスト用のフォルダーには発話が3つあり、1つはすでにラベル付けされ、2つは単語だけでした。インポーターは次のように報告しました。

text
Imported 3 item(s), 1 question(s), 0 answer(s) from 0 annotator(s), and 3 model suggestion(s) on 3 item(s) from Praat TextGrid files (with their audio) as tiered annotations.
  wrote tobi_project/data/textgrids.jsonl
  wrote tobi_project/media/utt01.wav
  wrote tobi_project/media/utt02.wav
  wrote tobi_project/media/utt03.wav
  wrote tobi_project/config.yaml
  wrote tobi_project/README.md

各 TextGrid ティアは、tiers という名前の1つの tiered_annotation スキームのティアになり、各点ティアは点ティアのままです。異なる値が30個以下のティアは、その値をティアのラベルとして持ちます。このフォルダーでは、音調ティアには、ラベル付けされた発話が使った5つの音調だけが入り、切れ目指標ティアには 0、1、3、4 が入りました。異なる値がそれより多いティアは、ティアの名前を付けた単一のラベルを持ち、各インターバルのテキストをセグメントの value フィールドに保持します。実際のコーパスの単語ティアは、そうしたティアです。インポートされたすべての点とインターバルは、事前アノテーションです。各書き起こし担当者には、インポートされたラベルが出発点として見え、Potato は、その担当者が保存したときにだけラベルを保存します。

波形の上に単語を表示する

単語ティアは、すべてのインターバルにラベル words を表示し、単語自体は value フィールドに残ります。インポーターは、各項目のテキストを TextGrid のファイル名に設定します。tobi_project で次のスクリプトを実行すると、そのテキストが、発話の単語を順に並べたものに置き換わります。

python
import json
 
path = "data/textgrids.jsonl"
items = [json.loads(line) for line in open(path)]
for item in items:
    words = item["predictions"]["tiers"]["annotations"].get("words", [])
    item["text"] = " ".join(w["value"] for w in sorted(words, key=lambda w: w["start_time"]))
with open(path, "w") as f:
    f.writelines(json.dumps(item) + "\n" for item in items)

すると Potato は、最初の発話について、ティアの上に「Marianna made the marmalade before the guests arrived at noon」と表示します。

設定

次の設定は、生成された config.yaml を置き換えます。新しい設定は、生成されたデータと事前アノテーションの設定を保持し、各ティアに完全なラベル一覧を与えます。

yaml
annotation_task_name: ToBI labeling
task_dir: .
port: 8000
data_files:
  - data/textgrids.jsonl
item_properties:
  id_key: id
  text_key: text
output_annotation_dir: annotation_output/
user_config:
  allow_all_users: true
  users: []
pre_annotation:
  enabled: true
  field: predictions
  allow_modification: true
annotation_schemes:
  - annotation_type: tiered_annotation
    name: tiers
    description: Label tones and break indices; correct the word boundaries if needed.
    source_field: audio_url
    media_type: audio
    tiers:
      - name: tones
        point: true
        labels: ["H*", "!H*", "L*", "L+H*", "L+!H*", "L*+H", "L*+!H", "H+!H*",
                 "L-", "H-", "!H-", "L-L%", "L-H%", "H-L%", "H-H%", "!H-L%", "%H",
                 "*?", "X*?", "-?", "X-?", "%?", "X%?", "%r"]
      - name: words
        labels: [words]
      - name: breaks
        point: true
        labels: ["0", "1", "2", "3", "4", "3-", "4-", "1p", "2p", "3p"]
      - name: misc
        labels: [disfl, laugh, breath, cough, noise, interrupt]

この設定では、次の選択をしています。

  • 完全なラベル一覧。 インポーターが列挙するのはファイルにあったラベルだけで、書き起こし担当者は、設定にない音調を置けません。
  • 結合した境界の音調。 MAE_ToBI では、切れ目指標4における句アクセントと境界音調は、その切れ目の時刻に置かれます。したがって、L-L% というラベルの1つの点が、句アクセントと境界音調をまとめて表します。単独の L% と H% は、同じ理由で除外しています。
  • ティア名と順序。 名前が TextGrid のティアと一致すると、事前アノテーションは正しい行に置かれます。エクスポートは、設定の順序でティアを書き出します。
  • 固定の misc リスト。 Potato のティアは、入力したラベルを受け付けません。そのため misc ティアは6つの事象ラベルを提供し、自由記述のコメントは Praat に残ります。
  • 音調ティアの %r。 MAE_ToBI は、曲線の再開を音調ティアに、非流暢性そのものを misc ティアに記します。
  • words を単語の唯一のラベルにする。 このラベルは、インポーターが書いたものと一致します。したがって、単語ティアは単語の境界を動かすためのものであり、単語ティアに新しく描いたインターバルは、テキスト words としてエクスポートされます。

バリデーターは、すべてのキーを Potato 自身の一覧と照合し、この設定と、インポーターが生成した設定の両方について OK — no issues found. を出力しました。

bash
python -m potato.validate_cli config.yaml --strict

ブラウザでラベル付けする

起動コマンドは、ポート 8000 でタスクを提供します。

bash
potato start config.yaml -p 8000

各書き起こし担当者はサインインして、波形の上に単語が表示されているのを確認し、点を置く前にティアメニューからティアを選びます。実用的な順序の1つは、まず各単語の終わりに切れ目指標を置き、次にピッチアクセント、最後に、切れ目指標が3または4の各位置に境界音調を置く方法です。一致度を測るために、すべての発話に2人の書き起こし担当者を付けたい場合は、設定で num_annotators_per_item: 2 を設定してください。

Praat へエクスポートする

エクスポートコマンドは、書き起こし担当者ごと、保存済みの発話ごとに、1つの TextGrid を書き出します。

bash
python -m potato.export -c config.yaml -f textgrid -o textgrid_out

テストでは、2人の模擬の書き起こし担当者が最初の発話を保存し、エクスポートは次のファイルを書き出しました。

text
Files written:
  textgrid_out/utt01_annotator1_tiers.TextGrid
  textgrid_out/utt01_annotator2_tiers.TextGrid

書き起こし担当者が1人のプロジェクトでは、utt01_tiers.TextGrid のように、ユーザー名のないファイル名になります。Praat 6.1.38 は、Parselmouth 0.4.6 を通じて両方のファイルを読み込みました。Praat は、音調と切れ目指標を点ティアとして、10個の単語を、そして misc ティアの息継ぎを見つけました。2人目の書き起こし担当者のファイルが元の TextGrid と異なっていたのは、その担当者が 0.35 秒から 0.36 秒へ動かした1つの音調と、0 が 0.0 と書かれていた点だけでした。

往復で保たれる TextGrid のフィールドと失われるもの

Potato を通した往復では、TextGrid の次の部分が保たれます。

  • ティア。 ティア名と、点かインターバルかの種類は、インポートしたとおりに戻り、設定が元の順序を保っていれば、ティアの順序も一致します。
  • 時刻。 Potato は、点の時刻とインターバルの境界を、小数点以下3桁のミリ秒で保存します。そのため、すべての時刻がマイクロ秒の精度を保ちます。
  • ラベル。 音調ラベル、切れ目指標のラベル、すべての単語インターバルのテキストが戻り、ラベル内の引用符は、Praat が書くとおりに二重になります。
  • グリッドの長さ。 グリッドは、アノテーションページが測定した音声の長さ、または元の xmax で終わります。

往復で、次の部分は失われます。

  • 開始時刻。 エクスポートは、元の xmin にかかわらず、グリッドとすべてのティアを 0 から始めます。
  • 未保存の発話。 誰も保存しなかった発話には、TextGrid がまったく作られません。
  • ファイル名。 エクスポートは、ファイルに <item>_<scheme>.TextGrid と名前を付け、書き起こし担当者が複数いる場合は <item>_<user>_<scheme>.TextGrid とします。
  • 文字エンコーディング。 Praat は UTF-16 で保存することが多く、エクスポートは UTF-8 で書き出します。Praat はどちらのエンコーディングも読み込めます。
  • 重なり。 Praat は、1つのティア上の重なったインターバルを拒否し、エクスポートは、重なりごとに警告を出します。

2人の書き起こし担当者間の一致度

/admin/iaa にある Potato の一致度レポートは、tiered_annotation スキームごとに1つの平均一致度を出し、4つのティアをまとめて扱います。Potato は、2人の書き起こし担当者の点とインターバルを時間的な重なりで対応づけ、対応づけた組でラベルが異なる場合は、半分の得点になります。2つの点が対応するのは、時刻がまったく同じ場合だけです。このテストでは、最初の発話に対する2つの回答が、10ミリ秒ずれた位置に置かれた1つの音調だけで異なる場合、スコアは 1.0 ではなく 0.93 になりました。すべての音調と切れ目指標が1ミリ秒ずれた2つの回答は、10個の単語インターバルしか対応しなかったため、0.24 になりました。

Potato 2.13.1 は、時間の許容幅を持つ音調ラベルの一致度、ティアごとの一致度、切れ目指標のカッパや順序統計量を計算しません。時間にわたる一致度の許容幅のスイープは、ロボットのエピソードの切り替え点のためのもので、tiered_annotation は対象外です。ToBI の信頼性の数値が必要な場合は、両方の書き起こし担当者の TextGrid をエクスポートし、Praat または自作のスクリプトで、選んだウィンドウ内で2人の音調を対にしてください。

このページの裏にあるテスト実行

このページの TextGrid と WAV ファイルは、スクリプトで書き出しました。WAV ファイルには、音声ではなく合成音が入っています。スクリプトは各単語の長さに応じて時刻を決め、音調と切れ目指標の時刻は、私たちが手作業で選びました。インポート、バリデーター、サーバー、エクスポートは、Potato 2.13.1 で実行しました。2人の模擬の書き起こし担当者は、アノテーションページが送るのと同じ /updateinstance リクエストで保存しました。一致度の数値は、保存された2つの回答に対して、/admin/iaa の背後にある関数を実行して得たものです。

次に読むもの

参考文献

  1. Beckman, M. E., Hirschberg, J., & Shattuck-Hufnagel, S. (2005). The original ToBI system and the evolution of the ToBI framework. In S.-A. Jun (Ed.), Prosodic Typology: The Phonology of Intonation and Phrasing (pp. 9-54). Oxford University Press. https://doi.org/10.1093/acprof:oso/9780199249633.003.0002
  2. Silverman, K., Beckman, M., Pitrelli, J., Ostendorf, M., Wightman, C., Price, P., Pierrehumbert, J., & Hirschberg, J. (1992). ToBI: A standard for labeling English prosody. Proceedings of the 2nd International Conference on Spoken Language Processing (ICSLP 1992), 867-870. https://doi.org/10.21437/ICSLP.1992-260