最近在 bwiki 为爱发电时,遇到的需求如下:大佬已经将角色语音解包出来,需要按照一定规则进行重命名,并将 wav 格式转换为 mp3 格式,方便统一上传到 bwiki。
新文件名格式为:角色名(即所在子文件夹名) + 语音类型名 + 配音语言(中配则默认不加)。
此前并没有学过 python,但还是现学并试着写了一下;需求比较简单,并没有做 IO 和异常处理,最终代码如下(涉及到解包文件,故改换文件信息):
# 警告:由于缺少异常处理,建议使用前先将语音文件夹备份
# 注意:使用前请将 ffmpeg 添加到系统环境变量中import os
import subprocess# 将 "typename" 放在最后以防止重复匹配
type_name_mapping = {"typename_1": "语音类型1","typename_2": "语音类型2","typename_3": "语音类型3","typename": "语音类型",
}def match_sub_str(file_name):for key in type_name_mapping:if "%" in file_name: # 跳过废弃的配音breakif key in file_name:if "ja" in file_name:return type_name_mapping[key] + "-ja" # 为日配统一增加后缀else:return type_name_mapping[key]return "废弃_" + file_name # 为废弃配音统一增加前缀def rename_wav_file(folder_path):for root, dirs, files in os.walk(folder_path):for file_name in files:for folder_name in os.path.relpath(root, folder_path).split(os.path.sep): # 获取子文件夹名name = os.path.splitext(file_name) # 分离文件名与扩展名old_file_path = root + os.sep + file_namenew_file_path = root + os.sep + folder_name + "-" + match_sub_str(name[0]) + name[1]os.rename(old_file_path, new_file_path)def delete_obsolete_file(folder_path):for root, dirs, files in os.walk(folder_path):for file_name in files:if "废弃_" in file_name: # 删除废弃配音os.remove(root + os.sep + file_name)def wav_to_mp3(folder_path):# 这里可以修改为任意 ffmpeg 命令str_mod = 'ffmpeg -threads 20 -i "{}" -f mp3 -ab 192k -y "{}"'for root, dirs, files in os.walk(folder_path):for file_name in files:input_file_path = os.path.join(root, file_name)if file_name[-4:] == ".wav":output_file_path = input_file_path.replace(".wav", ".mp3")str_cmd = str_mod.format(input_file_path, output_file_path)# 打印 ffmpeg 编码过程print(str_cmd)p = subprocess.Popen(str_cmd, shell=True, stdout=subprocess.PIPE)for line in iter(p.stdout.readline, b''):print(line.strip().decode('utf-8'))def delete_wav(folder_path):for root, dirs, files in os.walk(folder_path):for file_name in files:if file_name[-4:] == ".wav": # 删除所有 wav 格式音频文件os.remove(root + os.sep + file_name)if __name__ == '__main__':path = "请输入语音文件路径"rename_wav_file(path)delete_obsolete_file(path)wav_to_mp3(path)delete_wav(path)
算是简单记录一个小模板吧,以后如果有批量转换和重命名的场景也能直接套用。