Skip to content

Instantly share code, notes, and snippets.

@istallia
Last active August 24, 2021 12:41
Show Gist options
  • Save istallia/703df5dc9a3700db18f2b6e9ba1d5a32 to your computer and use it in GitHub Desktop.
Save istallia/703df5dc9a3700db18f2b6e9ba1d5a32 to your computer and use it in GitHub Desktop.
A.I.VOICEのexVOICEのファイル名をリネームするスクリプト(要Python3)

使い方

  1. Python3をインストールする(開発環境は3.8.2)
  2. pip(Pythonのパッケージマネージャ)でpdfplumberパッケージをインストールする
  3. 本スクリプトをexVOICE一覧のPDFと同じフォルダに配置する
  4. 本スクリプトを(ダブル)クリックで実行する、あるいはコマンドプロンプトやGit Bash等から(引数を付けて)実行する

注意点

これ1つで変換完了ではありません。株式会社AIのガバでいくつかのフォルダやファイル名が違うため、一部のファイル名はそのまま残ります。
でも全部手打ちするよりは楽なはず。

また、バッチファイルやCSVデータはキャラクターごと(一覧PDFごと)に生成するため、琴葉姉妹のexVOICEをリネームするには茜と葵で2回実行する必要があります。

【追記】
IMABARI ZINE氏がtabula-pyではなくpdfplumberを使った実装を教えてくださいました!このライブラリはJavaに依存しませんので、Python3環境さえあれば実行できるようになります。

【追記2】
琴葉姉妹については公式サイト上で2人のexVOICE一覧が1つに結合されたPDFが公開されていると教えていただいたのですが、わざわざ結合版を用いてリネームを行う理由が思い当たりませんでした。(琴葉姉妹のリネームが1回で終われば確かに便利なものの、それを実現するには琴葉姉妹専用の処理を追加する必要があり、実装の手間に対して益が薄い)
見出しがリストに混入する現象もあり確かにバグには違いないですが、実装の手間に対して益が薄い&本スクリプトの目的であるリネームおよびそれを実現するためのファイルの出力はできているため、結合済PDFはサポート外とします。
結合済PDFのほうで誤字が直されるとかそういうことがあればサポートするかもしれません。

更新履歴

2021-02-25 : 一部の(ファイルやフォルダ名に問題のない)ファイルの名前が置換されない問題を修正
2021-02-26 : 先駆者のバッチファイルに似たバッチファイルや、リネームツール用のCSVデータを生成できる機能を追加
2021-02-27 : PDFから表を抜き出すライブラリをtabula-pyからpdfplumberに変更。ついでに出力するバッチファイルがエラーを吐く問題を修正

import pandas as pd
import pdfplumber
import glob
import sys
import os
# from pprint import pprint
# IMABARI ZINE氏がpdfplumberによる実装を教えてくださいました
# tabula-pyと違いJavaに依存しません
# 標準ライブラリにないのは同じなので
# pip install pdfplumber
# でインストールしてお使いください
# https://qiita.com/barobaro/items/5b73704b4b7f6cbd99c9
#
# 普通に起動すればリネームスクリプトとして動作しますが、データとして
# 出すこともできます
# バッチファイルとして出すには
# rename-exVOICE.py bat
# csvとして出すには
# rename-exVOICE.py csv
# と、コマンドライン引数を付加して実行してください
# --- ファイルを読み込み
file_list = glob.glob('./exVOICE_*.pdf')
if len(file_list) < 1:
sys.exit(1)
file_name = file_list[0]
tables = []
with pdfplumber.open(file_name) as pdf:
for page in pdf.pages:
table = page.extract_table()
tables.extend(table)
voice_column = ['通しNo', 'フォルダ名', '音声No', 'セリフ']
df = pd.DataFrame(tables)
df.columns = voice_column
# --- 辞書形式に変換して結合
voices_table = []
dict_column = {}
for i, item in enumerate(df.columns.values):
dict_column[voice_column[i]] = item
voices_table = df.to_dict(orient='records')
voices_table.pop(0)
# --- セリフの一部記号を全角に置換
table_replace = {
'!' : '!',
'?' : '?',
'.' : '.',
',' : ',',
'<' : '<',
'>' : '>',
'*' : '*',
'/' : '/',
'\\' : '\',
':' : ':',
'~' : '〜',
'...' : '…'
}
if os.name == 'nt':
table_replace['~'] = '~'
for voice in voices_table:
voice['セリフ'] = voice['セリフ'].translate(table_replace)
# --- テーブルを元に処理を行う
if len(sys.argv) > 1:
if sys.argv[1] == 'bat':
# バッチファイルとして出力
bat_string = ''
for voice in voices_table:
bat_string += 'ren ".\\'+voice['フォルダ名']+'\\'+str(voice['音声No'])+'.wav" '
bat_string += '"'+str(voice['音声No'])+' '+voice['セリフ']+'.wav"\n'
with open('./rename.bat', mode='w', encoding='cp932') as f:
f.write(bat_string)
elif sys.argv[1] == 'csv':
# CSVとして出力
csv_string = ','.join(['通しNo', 'フォルダ名', '音声No', 'セリフ']) + '\n'
for voice in voices_table:
voice['通しNo'] = str(voice['通しNo'])
voice['音声No'] = str(voice['音声No'])
csv_string += ','.join(list(voice.values())) + '\n'
with open('./a_i_voice.csv', mode='w', encoding='utf-8') as f:
f.write(csv_string)
else:
# テーブルに従ってリネームを行う
for voice in voices_table:
try:
old_name = './'+voice['フォルダ名']+'/'+str(voice['音声No'])+'.wav'
new_name = './'+voice['フォルダ名']+'/'+str(voice['音声No'])+' '+voice['セリフ']+'.wav'
os.rename(old_name, new_name)
except:
pass
@so-c
Copy link

so-c commented Feb 24, 2021

tabula-pyがJavaも必要とするんですね。次のエラーで終了してしまいました。
Java(OpenJDK 15)をインストールしてPATH通したら動きました。
便利なスクリプトをありがとうございます!

FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "パス\葵\rename-exVOICE.py", line 18, in <module>
    dfs       = tabula.read_pdf(file_name, lattice=True, pages = 'all')
  File "パス\Python\Python39\lib\site-packages\tabula\io.py", line 322, in read_pdf
    output = _run(java_options, kwargs, path, encoding)
  File "パス\Python\Python39\lib\site-packages\tabula\io.py", line 91, in _run
    raise JavaNotFoundError(JAVA_NOT_FOUND_ERROR)
tabula.errors.JavaNotFoundError: `java` command is not found from this Python process.Please ensure Java is installed and PATH is set for `java`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment