Audacityのラベルを書きだしたファイルをapplication/json+chapters形式のJSONファイルに変換するPythonスクリプトを作成して...

❓ Prompt

Audacityのラベルを書きだしたファイルをapplication/json+chapters形式のJSONファイルに変換するPythonスクリプトを作成してください。

💬 Answer

以下は、Audacityのラベルを書き出したファイルをcsv形式で保存し、そのファイルを読み込んでapplication/json+chapters形式のJSONファイルに変換するPythonスクリプトの例です。

import csv
import json

# csvファイルからラベルを読み込む
def read_labels_from_csv(csv_file):
    labels = []
    with open(csv_file, newline='', encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile, delimiter='\\t')
        for row in reader:
            if len(row) >= 3:
                label = {
                    "startTime": float(row[0]),
                    "endTime": float(row[1]),
                    "title": row[2]
                }
                labels.append(label)
    return labels

# JSONファイルに書き出す
def write_json_file(labels, json_file):
    chapters = []
    for label in labels:
        chapter = {
            "start_time": label["startTime"],
            "end_time": label["endTime"],
            "title": label["title"]
        }
        chapters.append(chapter)
    with open(json_file, "w") as outfile:
        json.dump({"chapters": chapters}, outfile, indent=2)

if __name__ == '__main__':
    csv_file = "labels.csv"
    json_file = "labels.json"
    labels = read_labels_from_csv(csv_file)
    write_json_file(labels, json_file)

このスクリプトは、Audacityのラベルをcsv形式で保存し、そのファイルをread_labels_from_csv()関数で読み込んで、labelsリストに格納します。次に、write_json_file()関数を使って、labelsリストをapplication/json+chapters形式のJSONファイルに変換します。json.dump()関数は、chaptersリストを{"chapters": chapters}のような形式でJSONファイルに書き出します。

他のラベルが定義されている範囲内にあるラベルは無視する処理を付け加えることはできますか?

❓ Prompt

他のラベルが定義されている範囲内にあるラベルは無視する処理を付け加えることはできますか?

💬 Answer

はい、他のラベルが定義されている範囲内にあるラベルを無視する処理を追加することができます。以下は、Audacityのラベルをcsv形式で保存し、そのファイルを読み込んでapplication/json+chapters形式のJSONファイルに変換するPythonスクリプトで、他のラベルが定義されている範囲内にあるラベルを無視する処理が追加されたものです。

import csv
import json

# csvファイルからラベルを読み込む
def read_labels_from_csv(csv_file):
    labels = []
    with open(csv_file, newline='', encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile, delimiter='\\t')
        for row in reader:
            if len(row) >= 3:
                label = {
                    "startTime": float(row[0]),
                    "endTime": float(row[1]),
                    "title": row[2]
                }
                # 他のラベルが定義されている範囲内にあるラベルを無視する
                if not any(label["startTime"] <= x["endTime"] and label["endTime"] >= x["startTime"] for x in labels):
                    labels.append(label)
    return labels

# JSONファイルに書き出す
def write_json_file(labels, json_file):
    chapters = []
    for label in labels:
        chapter = {
            "start_time": label["startTime"],
            "end_time": label["endTime"],
            "title": label["title"]
        }
        chapters.append(chapter)
    with open(json_file, "w") as outfile:
        json.dump({"chapters": chapters}, outfile, indent=2)

if __name__ == '__main__':
    csv_file = "labels.csv"
    json_file = "labels.json"
    labels = read_labels_from_csv(csv_file)
    write_json_file(labels, json_file)

このスクリプトでは、read_labels_from_csv()関数内に、他のラベルが定義されている範囲内にあるラベルを無視する処理が追加されています。この処理は、以下の式を使って実現されています。

label["startTime"] <= x["endTime"] and label["endTime"] >= x["startTime"]

この式は、現在処理しているラベルの開始時刻が他のラベルの終了時刻よりも小さく、かつ現在処理しているラベルの終了時刻が他のラベルの開始時刻よりも大きい場合に、他のラベルが定義されている範囲内にあると判定します。この場合、現在処理しているラベルはlabelsリストに追加されません。