テクノロジー · 実用ガイド
Audacityの周波数付きラベルをCSVに:周波数の対応を崩さない
続きの周波数行を正しいラベルに結び付け、秒数の元の文字列を保ちます。周波数行の欠落、未定義の境界、実際の0Hzを区別します。

周波数付きラベルの出力は、必ずしも1ラベルが表の1行になるわけではありません。Audacityの拡張テキスト形式では時刻と文字が1行、保存された周波数範囲がバックスラッシュで始まる次の行です。各行を別ラベルと扱うと対応が壊れます。
標準機能の拡張出力で周波数は既に保存できます。この手順は自分の対応UTF-8テキストをオフラインでCSVに変換し、対応と元の数値文字列を確認します。音声解析や出力から失われた周波数の復元はしません。
正しいテキストを出力し範囲を確認する
プロジェクトと元のラベルテキストを残します。SRT、WebVTTや音声ではなくプレーンテキストのラベル出力を選びます。版にExported Label Styleがあれば、周波数範囲付きExtendedを選びます。既知の周波数ラベルを確認し、時刻・文字の行の直後にバックスラッシュ、タブ、低周波数、タブ、高周波数があることを確かめます。メニュー名は版で異なり、現在の画面は実行していません。
含まれるラベルトラックを確認します。現在のトラックマニュアルは特定トラックのメニューからの出力を説明し、現行の元コードの出力モデルもトラック選択を支持します。古い説明は全トラック結合です。古い回避策のためにトラックを削除しないでください。トラック帰属が必要なら別々に出力し、CSVの外でプロジェクト、トラック、版、日付を記録します。
周波数行がないことは0Hzではありません。標準形式で出力したか、範囲が保存されていない可能性があります。拡張形式の-1は境界未定義です。必要なら元ラベルを確認して再出力します。変換は欠落した範囲を推測したり、テキストにないトラック名を復元したりしません。
Python 3で対応するコピーを変換する
入力はタブで区切る非負の開始・終了秒数2個、任意のラベル文字、直後の周波数行最大1本です。小数点形式の数、有限の非負周波数か未定義の-1を支持します。負時刻ラベル、小数コンマ、空レコード、余分なタブ項目、将来の続行形式は対象外で、出力作成前に停止します。
Python 3のあるLinux Bash端末で自分のlabels.txtコピーのフォルダーに移動します。命令を半角の直線引用符とバックスラッシュを保持して1行でコピーしてください。入力名を保ち、新しい出力名を選びます。既存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"
7列の意味を変えずに読む
列はordinal、start_seconds、end_seconds、label、low_hz、high_hz、frequency_recordです。ordinalは入力順に1から始まり、トラック番号ではありません。presentは実際の続く周波数行を解析した意味、absentは周波数2セルが空です。明示された-1は元の文字のまま保ち、0や推測した境界にしません。
文字、重複レコード、入力順、元の数値文字列を保ちます。Decimalは境界検証だけに使い、浮動小数点の丸め、長さ計算、並べ替えや周波数推定はしません。CSV引用で文字中のコンマと二重引用符を扱います。出力を読み直して解析レコードと全フィールドを比較し、通過後だけ成功を表示します。
LibreOffice CalcでUTF-8、コンマ、半角の二重引用符の文字列区切りを選びます。全7列をテキストにし、区切り結合、空白除去、数式評価を無効にします。画面が省略されるならフィルター設定編集を有効にします。未変更CSVを残し、計算は別コピーを作って適切な小数のロケールを選んで行います。
対応を確認し部分的な結果を使わない
表示されたラベル数を予定した出力と比べ、物理行数とは比べません。周波数の続行は新しいラベルではありません。既知の点、範囲、片側境界未定義のラベルを確認します。範囲欠落の近くで後の周波数が別ラベルに付かないか確認してください。複数トラックをまとめた出力では帰属が既に消えていることがあり、CSVは復元しません。
正確な命令で23件の人工データ検証を実行し、点/範囲の対応、欠落と0、-1境界、長い数値文字列、Unicodeと句読点、重複した空ラベル、UTF-8 BOM/CRLFを確認しました。有効6ケースは再書き込みも拒否して出力不変、入力バイト不変を確認しました。Audacity/CalcやWindows/macOSでの命令は実行していません。
不正・孤立した周波数行、重複続行、逆の境界、非対応レコードは作成前に止まります。書き込みや読み直しが失敗した部分CSVは捨て、新しい名で再実行します。元のテキストを比較用に残します。表は出力済みの選択記録で、測定ピーク、振幅、種検出や音声出力完了ではありません。周波数範囲は保存した注釈で、新しいスペクトル測定ではありません。
