Skip to content
Announcements5 min read

Potato 2.7.1: 전사본은 이미 있습니다

Potato 2.7.1은 21가지 전사·자막 형식을 그대로 읽고, 미디어 옆에 놓인 사이드카 파일에서 불러오며, ASR 출력이 담긴 폴더를 주석에 바로 쓸 수 있는 데이터 파일로 바꾸는 변환기를 함께 제공합니다.

Potato Team

원본 오디오만 달랑 들고 주석 도구를 찾아오는 사람은 거의 없습니다. 다들 전사본을 들고 옵니다. 누군가는 인터뷰가 담긴 폴더에 Whisper를 돌렸습니다. 누군가는 학회 발표 백 개에서 자막을 뽑아 왔습니다. 누군가는 2019년에 끝난 현장 조사 프로젝트에서 TextGrid 뭉치를 물려받았습니다.

그러면 도구는 변환 스크립트를 짜라고 합니다.

Potato 2.7.1은 그 단계를 없애는 일입니다. 21가지 전사·자막 형식을 그대로 읽고, 모든 것을 데이터 파일에 붙여 넣으라고 요구하는 대신 미디어 옆에 놓인 파일에서 불러오며, 결국 데이터 파일 하나가 필요한 경우를 위한 변환기도 들어 있습니다.

Potato 2.7.1: 21가지 전사 형식이 들어가고 하나의 발화 차례 모델이 나옵니다Potato 2.7.1

21가지 형식이 들어가고, 하나의 모델이 나옵니다

6가지에서 늘었습니다. 전체 목록은 전사 형식 문서에 있지만 대략 이렇습니다. ASR 출력 아홉 가지(Whisper JSON, WhisperX를 비롯한 화자 분리 JSON, whisper.cpp, Whisper TSV, AWS Transcribe, Deepgram, AssemblyAI, Rev.ai, SPoRC), 자막·캡션 형식 여섯 가지(SubRip, WebVTT, SubStation Alpha, TTML과 DFXP, YouTube json3, YouTube srv1/srv2/srv3), 강제 정렬 쪽에서 온 세 가지(NIST CTM, Praat TextGrid, ELAN EAF), 그리고 아예 다른 곳에서 온 데이터를 위한 범용 형태 세 가지입니다.

가장 반가운 추가는 정렬 형식입니다. EAF와 TextGrid로 내보내기는 이미 있었으므로, 이제 계층 주석이 왕복합니다. 기존 정렬을 들여와 Potato에서 고친 뒤 ELAN이나 Praat로 돌려보내면 됩니다.

판별은 파일 확장자가 아니라 데이터의 생김새로 합니다. captions.txt라는 이름의 WebVTT 파일도 여전히 WebVTT로 해석된다는 뜻이고, 같은 전사가 데이터에 직접 들어 있든 디스크에서 읽히든 설정을 바꾸지 않고 동작한다는 뜻입니다.

단어 단위 시간과 구간별 신뢰도는 원본이 제공하는 경우 그대로 유지됩니다. CTM, Deepgram, AssemblyAI처럼 본래 단어 단위인 형식은 화자가 바뀌는 지점과 멈춤 임계값을 기준으로 발화 차례로 묶입니다.

색으로 구분된 화자 말풍선으로 표시된 전사. 차례마다 재생 버튼과 라벨 질문이 붙어 있다어떤 형식이 들어갔든 나오는 모습은 이것입니다

사이드카 파일

여러분의 ASR 도구는 이미 파일을 합리적인 구조로 써 두었습니다. 미디어가 여기 있고 전사본이 그 옆에 있습니다. 그것을 데이터 덩어리로 눌러 담게 만들 이유가 없었으므로, 이제 그냥 그쪽을 가리키면 됩니다.

json
{"id": "int_001", "conversation": {"audio": "media/int_001.mp3",
                                   "transcript": "media/int_001.srt"}}

경로는 task_dir 기준으로 해석되며, 설정으로 지정하는 다른 모든 경로와 똑같은 디렉터리 탐색 검증을 거칩니다. 데이터에 정말로 파일 이름처럼 생긴 한 줄짜리 인라인 전사가 들어 있다면 transcript_is_path: false로 이 휴리스틱을 끌 수 있습니다.

실질적인 이점은 전사본이 파일로 남는다는 것입니다. diff를 뜨고, 다시 생성하고, 다른 사람에게 건넬 수 있습니다. JSON 배열 안에 화석처럼 굳은 사본을 갖는 대신에 말입니다.

다른 경우를 위한 변환기

데이터 파일 하나가 필요할 때도 있습니다. potato transcripts는 폴더를 훑어 전사본마다 기본 이름으로 미디어를 짝지어 주고, 파일 이름에서 항목 id를 뽑아낸 뒤 결과를 씁니다.

bash
potato transcripts ./whisper_out --media-dir ./audio -o data/interviews.json

--dry-run은 아무것도 쓰지 않고 무엇을 찾았는지 알려 줍니다. 전사가 구분되지 않은 덩어리 하나로 표시될 때 가장 먼저 돌려 볼 것이기도 합니다.

text
Scanned 3 file(s):
  interview_01.json      Whisper JSON      42 turns    891.4s  undiarized
  interview_02.json      WhisperX JSON     51 turns   1120.8s  2 speaker(s): SPEAKER_00, SPEAKER_01
  interview_03.json      Whisper JSON      38 turns    754.2s  undiarized

3 item(s), 131 turn(s).

plain text로 보고되는 파일은 거의 언제나 .json 출력에 섞여 들어간 Whisper .txt입니다. .txt에는 시간 정보가 전혀 없고, 모델을 다시 돌리지 않고서는 되살릴 수 없습니다. “왜 내 전사가 이상하게 보이나요”라는 제보의 대부분이 이 한 가지에서 나옵니다.

--emit-config는 데이터 파일과 짝이 맞는 config.yaml을 함께 출력합니다.

네 스킴을 관통하는 하나의 어휘

audio_dialogue, speech_transcript, voice_interaction, tiered_annotation은 각각 전사 데이터를 제 나름대로 해석하며 서로 다른 형식 부분집합을 받아들였고, 아무도 그 이유를 설명하지 못했습니다. 이제 넷이 하나의 정규화기를 공유하므로, 하나가 받는 것은 넷 다 받습니다.

기존 설정은 영향을 받지 않습니다. 각 스킴은 예전 해석 방식을 대체 경로로 그대로 갖고 있고, 전에 동작하던 모든 전사 형태가 바이트 단위로 똑같이 동작합니다.

tiered_annotation에는 선택해서 켜는 전사 시딩도 생겼습니다. transcript_field를 전사본 쪽으로 가리키면 계층 하나가 미리 채워진 채 도착하므로, 어노테이터가 음성을 처음부터 다시 분절하는 대신 기존 정렬을 고치면 됩니다.

yaml
  - annotation_type: tiered_annotation
    name: tiers
    source_field: audio_url
    media_type: audio
    tiers:
      - name: utterance
        labels:
          - name: speech
            color: "#7c3aed"

미리 채워진 구간은 어노테이터가 실제로 손대기 전에는 저장되지 않으므로, 건드리지 않은 시드가 사람의 작업으로 잘못 귀속되는 일은 없습니다.

Potato가 여전히 하지 않는 일

전사하지 않고, 화자 분리도 하지 않습니다. ASR은 앞단에서 돌아갑니다. Potato는 여러분의 파이프라인이 만들어 낸 것을 읽습니다.

이 얘기가 나오는 이유는 Potato가 Think-Aloud 모드에서 로컬 Whisper 모델을 실제로 돌리기 때문입니다. 작업하면서 말하는 어노테이터를 녹음하는 기능이지요. 그건 여러분의 코퍼스가 아니라 어노테이터를 겨눈 수집 기능입니다. 다른 것인데 같은 단어를 씁니다.

단어 단위 신뢰도는 원본이 제공하면 해석해서 데이터 모델에 담아 두지만, 아직 그것을 보는 화면은 없습니다.

그리고 아예 파서가 없는 형식도 있습니다. SAMI, MicroDVD, SubViewer, Transcriber .trs, EXMARaLDA, CHAT/CHILDES, 단독 RTTM, 그리고 Montreal Forced Aligner나 Gentle의 네이티브 출력입니다. 이런 것들은 먼저 변환하십시오. 이 목록을 공개하는 이유는 아무것도 빠지지 않은 지원 형식 목록은 별로 값어치가 없기 때문입니다.

문서

업그레이드

bash
pip install --upgrade potato-annotation==2.7.1

설정은 바꿀 필요가 없습니다. 전에 Potato가 받아들이던 모든 전사 형태를 지금도 그대로 받아들입니다.