본문으로 건너뛰기
튜토리얼16분 분량

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를 도입했습니다. 이 페이지의 과제는 녹음의 파형과 그 아래의 티어 네 개를 보여 줍니다. 성조 티어와 경계 지수 티어는 시간 점을 담고, 단어 티어는 구간을 담으며, 기타 티어는 비유창성과 잡음을 표시합니다. 점 티어는 Potato 2.13.1에서 도입되었으며, 가져오기 도구와 textgrid 내보내기 도구는 모두 Praat 점 티어를 읽고 씁니다. 여러 전사자가 한 서버에서 같은 발화를 레이블링할 수 있으며, 각 전사자의 작업은 별도의 TextGrid로 내보내집니다.

ToBI의 네 티어

ToBI 전사는 오디오와 F0 기록에 티어 네 개를 짝짓습니다. Beckman, Hirschberg, and Shattuck-Hufnagel (2005)은 원래의 주류 미국 영어 체계(MAE_ToBI)의 티어를 다음과 같이 나열합니다.

  • 성조(Tones). 피치 악센트, 구 악센트, 경계 성조이며 각각 시간 점 하나에 놓입니다.
  • 단어(Words). 정서법 전사이며 각 단어의 끝이 시간으로 표시됩니다.
  • 경계 지수(Break indices). 각 단어 뒤의 연접 정도를 나타내는 0에서 4까지의 숫자.
  • 기타(Misc). 비유창성, 코멘트, 그 밖의 사건.

Praat TextGrid에서 성조와 경계 지수는 보통 점 티어(TextTier)이고 단어와 기타는 구간 티어입니다. 아래 설정의 레이블 목록은 같은 장의 MAE_ToBI 표를 따릅니다.

레이블 유형레이블
피치 악센트H*, L*, L+H*, L*+H, H+!H*, 그리고 하강 단계(downstepped)인 !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 스킴은 녹음 전체의 파형, 현재 구간을 확대한 파형, 티어당 한 행을 그립니다. 점 티어에서 전사자는 클릭해서 활성 레이블로 점을 놓고 드래그해서 점을 옮깁니다. 점을 선택한 뒤 다른 레이블 버튼을 클릭하면 레이블을 바꾸고, 선택한 점은 Delete 키로 제거합니다. 구간 티어에서는 클릭하고 드래그합니다.

Potato 2.13.1의 티어 보기에는 F0 트랙이나 스펙트로그램이 없습니다. 전사자는 F0 윤곽에 비추어 피치 악센트를 판단합니다. 피치 트랙을 보려면 같은 WAV 파일로 Praat을 열어 두세요. 또한 각 티어는 설정에 나열된 레이블만 제공하며 레이블을 직접 입력하는 상자는 없습니다. 따라서 단어는 전사자가 아니라 TextGrid에서 옵니다.

TextGrid 준비

발화당 TextGrid 하나와 WAV 파일 하나를 utt01.TextGrid와 utt01.wav처럼 이름이 같게 하여 폴더에 넣습니다. 티어 이름은 tones, words, breaks, misc로 하고 tones와 breaks를 점 티어로 만듭니다. 단어 티어는 강제 정렬기로 만들 수 있으며, Montreal Forced Aligner는 기본적으로 긴 형식의 TextGrid를 씁니다. 정렬기 출력에 없는 세 티어는 Praat의 Insert point tier와 Insert interval tier 명령으로 추가합니다. 아래 설정이 ToBI 티어 네 개만 지정하므로, 가져오기 전에 정렬기의 음소 티어를 제거하세요. 이미 레이블이 들어 있는 티어는 사전 주석으로 Potato에 들어옵니다. 따라서 다른 전사자의 1차 작업도 사전 주석으로 도착합니다.

TextGrid 가져오기

가져오기 명령은 폴더를 TextGrid당 항목 하나인 Potato 프로젝트로 바꿉니다.

bash
potato import -i textgrids -o tobi_project

테스트 폴더에는 발화 세 개가 있었으며, 하나는 이미 레이블이 있었고 둘은 단어만 있었습니다. 가져오기 도구는 다음과 같이 보고했습니다.

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라는 tiered_annotation 스킴 하나의 티어가 되고, 각 점 티어는 점 티어로 남습니다. 서로 다른 값이 최대 30개인 티어는 그 값들을 티어의 레이블로 받습니다. 테스트 폴더에서 성조 티어는 레이블이 있는 발화가 사용한 성조 다섯 개만 받았고, 경계 티어는 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%로 레이블된 점 하나가 구 악센트와 경계 성조를 함께 표시합니다. 같은 이유로 단독 L%와 H%는 제외했습니다.
  • 티어 이름과 순서. 이름이 TextGrid 티어와 일치하면 사전 주석이 올바른 행에 놓입니다. 내보내기는 설정 순서대로 티어를 씁니다.
  • 고정된 기타 목록. Potato 티어는 입력한 레이블을 받지 않습니다. 따라서 기타 티어는 사건 레이블 여섯 개를 제공하며, 자유 텍스트 코멘트는 Praat에 남습니다.
  • 성조 티어의 %r. MAE_ToBI는 윤곽의 재시작을 성조 티어에, 비유창성 자체는 기타 티어에 표시합니다.
  • 유일한 단어 레이블로서의 words. 이 레이블은 가져오기 도구가 쓴 것과 일치합니다. 따라서 단어 티어는 단어 경계를 옮기기 위한 것이며, 단어 티어에 새로 그린 구간은 텍스트 words로 내보내집니다.

검증기는 모든 키를 Potato 자체의 목록과 대조하며, 이 설정과 가져오기 도구가 생성한 설정 모두에서 OK — no issues found.를 출력했습니다.

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

브라우저에서 레이블링

시작 명령은 8000번 포트에서 과제를 제공합니다.

bash
potato start config.yaml -p 8000

각 전사자는 로그인한 뒤 파형 위의 단어를 보고, 점을 놓기 전에 티어 메뉴에서 티어를 고릅니다. 실행 가능한 순서 하나는 각 단어 끝에 경계 지수를 먼저 놓는 것입니다. 피치 악센트가 그다음이고, 가장자리 성조는 경계 지수 3 또는 4마다 마지막에 놓습니다. 모든 발화에 합의도를 위해 전사자 두 명이 붙어야 한다면 설정에 num_annotators_per_item: 2를 지정합니다.

Praat으로 다시 내보내기

내보내기 명령은 저장된 발화마다 전사자당 TextGrid 하나를 씁니다.

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

테스트에서 모의 전사자 두 명이 첫 번째 발화를 저장했으며, 내보내기는 다음 파일을 썼습니다.

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

전사자가 한 명인 프로젝트는 utt01_tiers.TextGrid처럼 사용자 이름이 없는 파일 이름을 받습니다. Praat 6.1.38이 Parselmouth 0.4.6을 통해 두 파일을 모두 읽었습니다. Praat은 성조와 경계를 점 티어로, 단어 열 개를, 기타 티어의 숨소리 하나를 찾았습니다. 두 번째 전사자의 파일은 원본 TextGrid와, 그 전사자가 0.35초에서 0.36초로 옮긴 성조 하나, 그리고 0이 0.0으로 쓰인 것에서만 달랐습니다.

왕복에서 TextGrid 필드가 유지되는 것과 사라지는 것

Potato를 거치는 왕복은 TextGrid의 다음 부분을 유지합니다.

  • 티어. 티어 이름과 점 또는 구간 유형은 가져온 그대로 돌아오며, 설정이 원본 순서를 유지하면 티어 순서도 일치합니다.
  • 시간. Potato는 점 시간과 구간 경계를 소수점 아래 세 자리의 밀리초로 저장합니다. 따라서 모든 시간은 마이크로초 정밀도를 유지합니다.
  • 레이블. 성조 레이블, 경계 레이블, 모든 단어 구간의 텍스트가 돌아오며, 레이블 안의 따옴표는 Praat이 쓰는 대로 두 번 쓰입니다.
  • 격자 길이. 격자는 주석 페이지가 측정한 오디오 길이 또는 원본의 xmax에서 끝납니다.

왕복은 다음 부분을 잃습니다.

  • 시작 시간. 내보내기는 원본의 xmin이 무엇이든 격자와 모든 티어를 0에서 시작합니다.
  • 저장되지 않은 발화. 아무도 저장하지 않은 발화는 TextGrid를 전혀 받지 못합니다.
  • 파일 이름. 내보내기는 파일 이름을 <item>_<scheme>.TextGrid로 짓고, 전사자가 여럿이면 <item>_<user>_<scheme>.TextGrid로 짓습니다.
  • 인코딩. Praat은 흔히 UTF-16으로 저장하고 내보내기는 UTF-8로 씁니다. Praat은 두 인코딩을 모두 읽습니다.
  • 겹침. Praat은 한 티어에서 겹치는 구간을 거부하며, 내보내기는 겹침마다 경고를 나열합니다.

전사자 두 명 사이의 합의도

/admin/iaa의 Potato 합의도 보고서는 tiered_annotation 스킴마다 평균 합의도 하나를 주며 네 티어를 합쳐서 계산합니다. Potato는 두 전사자의 점과 구간을 시간적 겹침으로 짝짓고, 레이블이 다른 짝은 부분 점수 절반을 받습니다. 두 점은 정확히 같은 시간일 때만 짝지어집니다. 테스트에서 첫 번째 발화의 두 답이 성조 하나를 10밀리초 다르게 놓은 것만 달랐을 때 점수는 1.0이 아니라 0.93이었습니다. 모든 성조와 경계가 1밀리초씩 다른 두 답은 단어 구간 열 개만 여전히 짝지어졌기 때문에 0.24였습니다.

Potato 2.13.1은 시간 허용 오차를 둔 성조 레이블 합의도, 티어별 합의도, 경계 지수에 대한 카파나 순서 통계량을 계산하지 않습니다. 시간에 따른 합의도의 허용 오차 스윕은 로봇 에피소드의 분할점에 속하며 tiered_annotation은 다루지 않습니다. ToBI 신뢰도 수치를 얻으려면 두 전사자의 TextGrid를 내보내고 Praat이나 직접 작성한 스크립트에서 선택한 구간 안에서 두 전사자의 성조를 짝지으세요.

이 페이지의 테스트 실행

이 페이지의 TextGrid와 WAV 파일은 스크립트가 작성했으며, WAV 파일에는 음성이 아니라 합성 톤이 들어 있습니다. 스크립트는 각 단어의 길이에 따라 시간을 정했고 성조와 경계 시간은 직접 선택했습니다. 가져오기, 검증기, 서버, 내보내기는 Potato 2.13.1이 실행했습니다. 모의 전사자 두 명은 주석 페이지가 보내는 것과 같은 /updateinstance 요청으로 저장했습니다. 합의도 수치는 /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