R-Blogger블로그·해설한국어2025-11-04
readtextgrid, 이제 C++ 사용 (ChatGPT 도움)
0.2.0 버전 readtextgrid 패키지 출시 공지 이번 글에서는 readtextgrid R 패키지의 0.2.0 버전 출시를 알리고, 이 패키지가 해결하는 문제를 설명하며, LLM(대형 언어 모델) 지원 프로그래밍에 대한 생각을 공유합니다. TextGrid란? TextGrid는 Praat 프로그램에서 오디오 데이터를 주석화하는 방식입니다. Praat은 30년이 넘는 역사와 함께 음성 및 음향 분석을 위한 스크립트 언어를 제공하며, 주석 워크플로를 만들 수 있습니다. 사용자는 TextGrid 객체를 이용해 음성 파일의 시간 구간(interval)이나 시점(point)에 주석을 달 수 있습니다. 아래는 Praat에서의 TextGrid 스크린샷입니다. 스크린샷: Praat 편집기 창. 3개의 행이 있으며, 모두 동일한 x축(시간)을 공유합니다. - 진폭 파형: 시간에 따른 강도 표시 - 스펙트로그램: 주파수(y축)별 강도(색상) 변화 표시 - 빨간 점: 음성 신호에서 추정된 형태음(공진) 표시 - TextGrid: 녹음에 대한 텍스트 주석 readtextgrid 패키지 소개 TextGrid 파일을 R에 읽어들이는 작업은 번거로웠습니다. 그래서 readtextgrid라는 단일 함수 기반 패키지를 작성하여 출시했습니다. 사용 예시는 다음과 같습니다. library(tidyverse) library(readtextgrid) path_tg %>% readtextgrid() %>% head(10) #> #> library-t… 1 words Interval… 0 3.60 0 0.08 "" #> #> 2 library-t… 1 words Interval… 0 3.60 0.08 0.74 "lib… #> #> 3 library-t… 1 words Interval… 0 3.60 0.74 1.12 "tid… #> #> 4 library-t… 1 words Interval… 0 3.60 1.12 1.58 "ver… #> #> 5 library-t… 1 words Interval… 0 3.60 1.58 1.74 "" #> #> 6 library-t… 1 words Interval… 0 3.60 1.74 2.46 "lib… #> #> 7 library-t… 1 words Interval… 0 3.60 2.46 2.72 "b" #> #> 8 library-t… 1 words Interval… 0 3.60 2.72 2.9 "r" #> #> 9 library-t… 1 words Interval… 0 3.60 2.9 3.04 "m" #> #>10 library-t… 1 words Interval… 0 3.60 3.04 3.46 "s" #> #> # ℹ 33 more rows 함수는 주석마다 한 행을 반환하는 tidy tibble을 반환하며, 파일명도 열에 저장됩니다. 주석은 번호가 매겨져 있어 group_by(text, annotation_num) 로 반복 단어를 별도로 처리할 수 있습니다. 이를 통해 말하기 속도를 측정하거나 스펙트로그램에 주석을 올릴 수 있습니다. 말하기 속도 측정 예시 data_tg %>% filter(tier_name == "phones", text != "") %>% summarise( speaking_time = sum(xmax - xmin), # 발음에 사용된 시간 num_vowels = sum(str_detect(text, "\\d")) # 강세를 표시하는 숫자 개수 ) %>% mutate( syllables_per_sec = num_vowels / speaking_time ) #> # A tibble: 1 × 3 #> speaking_time num_vowels syllables_per_sec #> 3.22 13 4.04 스펙트로그램에 주석 달기 예시 library(tidyverse) library(ggplot2) data_spectrogram %>% mutate( db = ifelse(db > 15, db, NA) # 15 dB 이하를 NA로 변환 ) %>% ggplot(aes(x = time, y = frequency)) + geom_raster(aes(fill = db)) + geom_text( aes(label = text, x = (xmin + xmax) / 2), data = data_tg %>% filter(tier_name == "words"), y = 6500, vjust = 0 ) + geom_text( aes(label = text, x = (xmin + xmax) / 2), data = data_tg %>% filter(tier_name == "phones"), y = 6100, vjust = 0, size = 2 ) + ylim(c(NA, 6600)) + theme_minimal() + scale_fill_gradient(low = "white", high = "black") + guides(fill = "none") + labs(x = "time [s]", y = "frequency [Hz]") # (스펙트로그램 이미지가 출력됩니다.) 초기 파서와 그 한계 TextGrid 파일 구조는 아래와 같은 키-값 형식으로 이루어져 있습니다. path_tg %>% readLines() %>% head(26) %>% writeLines() #> File type = "ooTextFile
원문 URL
전체 글은 원문 페이지에서 이어서 읽을 수 있습니다.
- 작성자
- R-Blogger
- 출처
- R-Blogger
- 플랫폼
- R-Blogger
- 분류
- 블로그·해설
- 언어
- 한국어
- 발행일
- 2025-11-04