기술 · 실용 가이드
Audacity 주파수 라벨을 CSV로: 주파수와 라벨이 어긋나지 않게
주파수 이어지는 줄을 해당 라벨과 짝짓고 원래 초 텍스트를 보존합니다. 주파수 기록 없음, 경계 미정의와 실제 0Hz를 구별합니다.

주파수 라벨 내보내기는 라벨 하나가 표 한 행인 형식만 쓰지 않습니다. Audacity 확장 텍스트는 시간과 문자를 한 줄에, 저장된 주파수 범위를 역슬래시로 시작하는 다음 줄에 씁니다. 각 줄을 새 라벨로 취급하면 연결이 깨집니다.
기본 확장 내보내기는 이미 주파수를 보존합니다. 이 방법은 직접 만든 지원 UTF-8 텍스트를 오프라인 CSV로 바꾸며 연결과 원래 숫자 문자열을 검사합니다. 오디오를 분석하거나 내보내기에서 빠진 주파수를 복원하지 않습니다.
올바른 텍스트와 범위 확인하기
프로젝트와 원래 라벨 텍스트를 보관하세요. SRT, WebVTT나 오디오 대신 일반 텍스트 라벨 내보내기를 선택합니다. 버전에 Exported Label Style이 있으면 주파수 범위가 포함된 Extended를 선택하세요. 알려진 주파수 라벨에서 시간·문자 줄 뒤에 역슬래시, 탭, 낮은 주파수, 탭, 높은 주파수가 오는지 확인합니다. 메뉴 문구는 버전마다 다르며 현재 화면을 실행하지 않았습니다.
내보낼 라벨 트랙을 확인하세요. 현재 트랙 설명서는 특정 트랙 메뉴에서 해당 트랙을 내보낸다고 설명하며 현재 원본 내보내기 모델도 트랙 선택을 지원합니다. 이전 문서는 트랙들을 합치는 방식을 설명합니다. 오래된 우회 절차 때문에 트랙을 삭제하지 마세요. 트랙 귀속이 필요하면 각각 내보내고 프로젝트, 트랙, 버전과 날짜는 CSV 밖에 기록합니다.
주파수 다음 줄이 없다고 0Hz인 것은 아닙니다. 표준 형식으로 내보냈거나 범위 자체가 저장되지 않았을 수 있습니다. 확장 형식의 -1은 해당 경계가 정의되지 않았다는 뜻입니다. 필요하면 원본 라벨을 확인해 다시 내보내세요. 변환은 누락 범위를 추정하거나 텍스트에 없는 트랙 이름을 복구하지 못합니다.
Python 3로 지원 복사본 변환하기
입력은 탭으로 나뉜 음이 아닌 시작·끝 초 두 값, 선택적 라벨 문자와 바로 뒤 주파수 줄 최대 하나입니다. 점 소수 숫자, 유한한 음이 아닌 주파수 또는 미정의 -1을 지원합니다. 음수 시간 라벨, 쉼표 소수, 빈 기록, 추가 탭 필드와 미래 확장 줄은 범위 밖이며 출력 생성 전에 멈춥니다.
Python 3가 설치된 Linux Bash 터미널에서 직접 만든 labels.txt 복사본 폴더로 이동하세요. 명령을 곧은 따옴표와 역슬래시를 보존한 한 줄로 복사합니다. 입력 이름을 유지하고 새로운 출력 이름을 고릅니다. 기존 labels.csv는 거부됩니다. 정확한 명령은 Linux Bash에서만 검사했고 Windows/macOS에서는 실행하지 않았습니다.
python3 -c 'exec('"'"'import csv\nfrom decimal import Decimal\nimport pathlib\nimport re\nimport sys\n\ndef number(text, minimum):\n if not re.fullmatch(r"[+-]?[0-9]+(?:\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?", text):\n raise ValueError("Expected an unpadded dot-decimal number")\n value = Decimal(text)\n if not value.is_finite() or value < minimum:\n raise ValueError("Unsupported numerical value")\n return value\n\nrows = []\nraw = pathlib.Path(sys.argv[1]).read_text(encoding="utf-8-sig")\nlines = raw.split("\\n")\nif lines[-1] == "":\n lines.pop()\nfor line in lines:\n fields = line.split("\\t")\n if fields[0] == "\\\\":\n if len(fields) != 3 or not rows or rows[-1][-1] != "absent":\n raise ValueError("Orphan, repeated or unsupported frequency line")\n low, high = [number(text, Decimal(-1)) for text in fields[1:]]\n if any(value < 0 and value != -1 for value in [low, high]):\n raise ValueError("Negative frequency must be the undefined -1 sentinel")\n if low >= 0 and high >= 0 and low > high:\n raise ValueError("Reversed frequency bounds")\n rows[-1][4:] = [fields[1], fields[2], "present"]\n else:\n if len(fields) not in [2, 3]:\n raise ValueError("Expected two times and optional label, tab separated")\n start, end = [number(text, Decimal(0)) for text in fields[:2]]\n if end < start:\n raise ValueError("Reversed time bounds")\n rows.append([str(len(rows) + 1), fields[0], fields[1], fields[2] if len(fields) == 3 else "", "", "", "absent"])\nif not rows:\n raise ValueError("No label records")\nheader = ["ordinal", "start_seconds", "end_seconds", "label", "low_hz", "high_hz", "frequency_record"]\nwith open(sys.argv[2], "x", encoding="utf-8-sig", newline="") as output:\n writer = csv.writer(output)\n writer.writerow(header)\n writer.writerows(rows)\nwith open(sys.argv[2], encoding="utf-8-sig", newline="") as output:\n if list(csv.reader(output)) != [header] + rows:\n raise ValueError("Readback differs; discard output and use a new name")\nprint(len(rows), "label records checked; missing frequency is not zero")\n'"'"')' "labels.txt" "labels.csv"
일곱 열의 의미를 보존해 읽기
열은 ordinal, start_seconds, end_seconds, label, low_hz, high_hz, frequency_record입니다. ordinal은 입력 순서대로 1부터 시작하며 트랙 번호가 아닙니다. present는 실제 다음 주파수 줄을 읽었다는 의미이고 absent는 두 주파수 셀이 비어 있습니다. 명시적 -1은 원래 텍스트로 남고 0이나 추정 경계로 바뀌지 않습니다.
문자, 중복 기록, 입력 순서와 원래 숫자 문자열을 보존합니다. Decimal은 경계 검증에만 쓰며 부동소수점 반올림, 기간 계산, 정렬이나 주파수 추정은 하지 않습니다. CSV 인용은 문자 속 쉼표와 큰따옴표를 처리합니다. 출력을 다시 읽어 파싱한 기록과 모든 필드를 비교한 후에만 성공을 표시합니다.
LibreOffice Calc에서 UTF-8, 쉼표와 곧은 큰따옴표 문자열 구분을 선택합니다. 일곱 열 모두 텍스트로 설정하고 구분자 병합, 공백 제거와 수식 평가를 끕니다. 창이 생략되면 필터 설정 편집을 켜세요. 변경하지 않은 CSV 원본을 보관하고 계산 전 별도 작업 복사본을 만들어 그곳에서 적합한 소수 로캘을 선택합니다.
연결 검사와 불완전한 결과 처리하기
표시된 라벨 수를 의도한 내보내기와 비교하고 실제 줄 수와는 비교하지 마세요. 주파수 다음 줄은 새 라벨이 아닙니다. 알려진 점·영역 라벨과 한쪽 경계 미정의 라벨을 확인합니다. 범위가 빠진 곳 주변에서 뒤의 주파수가 다른 라벨에 붙지 않았는지 살핍니다. 여러 트랙을 합친 출력은 귀속을 이미 잃었을 수 있고 CSV는 복구하지 못합니다.
이 정확한 명령으로 23개 합성 사례를 실행해 점·영역 연결, 없음과 0, -1 경계, 긴 숫자 문자, 유니코드와 구두점, 중복 빈 라벨, UTF-8 BOM/CRLF를 검사했습니다. 유효한 여섯 사례는 반복 쓰기 거부와 출력 불변, 입력 바이트 불변도 확인했습니다. Audacity·Calc나 Windows/macOS의 명령은 실행하지 않았습니다.
잘못되거나 고립된 주파수 줄, 반복 다음 줄, 반대 경계와 지원하지 않는 기록은 생성 전에 멈춥니다. 쓰기나 다시 읽기가 실패하면 부분 CSV를 버리고 새 이름으로 다시 실행합니다. 원래 텍스트를 비교용으로 보관하세요. 표는 내보낸 선택 기록이지 측정 피크, 진폭, 종 탐지나 완료된 오디오 내보내기가 아닙니다. 주파수 범위는 저장된 주석이며 새로운 스펙트럼 측정이 아닙니다.
