音声スターター・切り分けにキャラクターの名前を挿入する


はじめに

!!!!!!以下のプログラムの実行はすべて自己責任で行ってください!!!!!!
!!!!!!ファイルの破損などについての責任は取れません!!!!!!
!!!!!!また、バックアップを行っておくことを推奨します!!!!!!


やりたかったこと

動機

音MADのような動画を作る場合、たくさんの音声や映像ファイルが必要になると思います。そして、音声スターターがあるとセリフ等で検索できて非常に便利ですよね?最近ではWhisperやUVCなどの機械学習と、Google Colabを活用して、音声切り分けの自動作成も手軽に行えるようになりました。

(参考)
https://e-tum.hatenablog.com/entry/2022/12/11/163000

ところが、そうして作成した多数のファイル名を1つずつ変更していくのは大変ですよね?
例えばファイルの先頭にキャラクターの名前を挿入したり、余分な文字列を削除したり・・・

そこで、ファイル名をまとめて変更できるプログラムを(ほぼ自分用に)作ったので情報共有します!

もっと楽にやる方法あるよ(笑)って方は、ぜひ教えてください!!!!!!

環境

  • VisualStudioCode

  • Python 3.11.1

  • Windows 11

結果

(冒頭GIF)

概要

1.音声の切り分け

E-tumさんのブログで書かれているやり方で音声を切り分けます。

アカギの2話

大体こんな感じですね。
文字起こしの精度はまだ完ぺきとは言えませんが、すごすぎる!

2.ファイル名修正&キャラクター毎にフォルダ分け

ここが一番きつい。ファイル名を修正しながら、キャラクターごとにファルダ分けしていきます。
(声質からフォルダ分けできるものがあるみたいですが試してません)

こっちはアカギ25話

3.ファイル名にキャラクター名を入れる

ここからが本題です。以下のプログラムが作ったものになります。
プログラムに関しては初学者未満なので、色々甘い部分が多いと思いますが、大目に見てください・・・

!!!!!!以下のプログラムの実行はすべて自己責任で行ってください!!!!!!
!!!!!!また、バックアップを行っておくことを推奨します!!!!!!

  • ディレクトリ構成

rename_program
├─main.py
├─delete_rename.py
└─insert_rename.py
  • main.py  (全然mainじゃない

import os
import glob

# フォルダパスか否かをチェック
def path_input(prompt):
    while True:
        i = input(prompt)
        # フォルダパスが存在したらwhileを抜ける
        if os.path.isdir(i):
            break
        print("そのフォルダは存在しません")
    return i

folder_path = path_input("フォルダパス:")
# フォルダ内のファイルのリストを作成
file_paths = glob.glob(folder_path + '/*')
# リストの濃度が0ならもう一度入力を求める
if len(file_paths) == 0:
    print("そのフォルダにはファイルがありません")
    path_input("フォルダパス:")
print(str(len(file_paths)) + "個のファイルが見つかりました")
# ファイル名の長さの上限
min_length = 255
# 最も短いファイル名の長さを取得
for f in file_paths:
    # 拡張子を除いたファイル名
    without_ext = os.path.splitext(os.path.basename(f))[0]
    # ファイル名の長さ
    length = len(without_ext)
    # 比較して短い方の数値を代入
    if min_length > length:
        min_length = length

print("ファイル名の長さの最小値は" + str(min_length) + "です")


  • insert_rename.py

import re
import os

print("ファイル名の任意の位置に任意の文字列を挿入します")

import main

# int型かつ main.min_length 未満をチェック
def int_input_insert(prompt):
    figure = input(prompt)
    # 数値以外をはじく
    if not figure.isdigit():
        print(f"{figure}は整数である必要があります")
        return int_input_insert(prompt)
    number = int(figure)
    if number > main.min_length:
        print(f"{number}は" + str(main.min_length) + "以下である必要があります")
        return int_input_insert(prompt)
    return number

insert_number = int_input_insert("挿入番号:")

insert_text = input("挿入テキスト:")

# ファイル名に使用できない文字は置換
# '[]'内が正規表現、|で分割、\で宣言
insert_text = re.sub(r'[\\|/|:|?|.|"|<|>|\|]', '-', insert_text)
print(insert_text + "を挿入します")

# ファイル名のみを抽出
for before_name in main.file_paths:
    # スライスで分割
    first = os.path.basename(before_name)[:insert_number]
    after = os.path.basename(before_name)[insert_number:]
    # パスを連結
    inserted_path = os.path.join(main.folder_path, first + insert_text + after)
    try:
        os.rename(before_name, inserted_path)
    except FileExistsError as e:
        print("Error: {0}".format(e))

print("完了しました")
  • delete_rename.py

ついでに、規定量deleteするものも作成

import os

print("ファイル名を任意の文字数削除します")

import main

def int_input_delete(prompt):
    figure = input(prompt)
    figure_list = figure.split()
    # リスト内の濃度が2か否かチェック
    if len(figure_list) != 2:
        print("数値は2つである必要があります")
        return int_input_delete(prompt)
    # 整数か否かチェック
    for element in figure_list:
        # 数値かどうかチェック
        if not element.isdigit():
            print(f"整数である必要があります")
            return int_input_delete(prompt)
        # 整数型にする
        regular_element = int(element)
        # min_lengthより短いかチェック
        if regular_element >= main.min_length:
            print(f"{regular_element}は" + str(main.min_length) + "以下である必要があります")
            return int_input_delete(prompt)
        # 要素が整数型のリストにする
        regular_list.append(regular_element)
    # リスト内を昇順に並べ替え
    sorted_list = sorted(regular_list)

    return sorted_list

regular_list = []

delete_number_list = int_input_delete("2つの数値をスペースで区切って入力してください:")

print(delete_number_list)

for before_name in main.file_paths:
    # ファイル名のみを抽出し、スライスで分割
    first = os.path.basename(before_name)[:delete_number_list[0]]
    after = os.path.basename(before_name)[delete_number_list[1]:]

    # パスを連結
    deleted_path = os.path.join(main.folder_path, first + after)
    try:
        os.rename(before_name, deleted_path)
    except FileExistsError as e:
        print("Error: {0}".format(e))

print("完了しました")


アカギの25話

できた!

使い方

挿入したい場合は insert_rename.py を、削除したい場合は delete_rename.py を回すことで動作します。

1.pythonを導入

こちらのページからダウンロードできます。導入方法は調べれば山ほど出てくるのでここでは割愛します。
上のコードはバージョン3じゃないと動きません。(多分)

2.プログラムがある階層に移動し、起動


コマンドプロンプトを開き、「プログラムがおいてある」階層に移動します。

cd C:\Users\togexys\rename_program

次に、insert_rename.py を起動したい場合、以下のように打ち込みます。

python insert_rename.py

3.フォルダパスを指定

「ファイル名を編集したいファイルがあるフォルダのパス」を入力します。パスはエクスプローラーの上の部分からからコピーできます。

4.文字数を入力


画像のように、5を指定する場合、以下のようなファイルに対しては、〇印の場所から挿入されます。

1234.txt
abcdefg.txt
あかさたなはまや.txt

5.挿入したい文字列を入力

ここはそのままですね。Enterを押すと、リネームが実行されます。
ファイル名に使用できない文字は、「-」に置換されます。

挿入したい場合は insert_rename.py を、削除したい場合は delete_rename.py を回すことで動作します。

!!!!!!このプログラムの実行はすべて自己責任で行ってください!!!!!!
!!!!!!バックアップを行っておくことを推奨します!!!!!!

終わりに

これを使えばファイルの整理がややし易くなるのではないでしょうか?

説明不足な点や、バグ報告、よりよいやり方等がありましたら、是非とも教えてください。

!!!!!!このプログラムの実行はすべて自己責任で行ってください!!!!!!
!!!!!!バックアップを行っておくことを推奨します!!!!!!


この記事が気に入ったらサポートをしてみませんか?