介绍
序:
大家好,在 reaper 中使用媒体浏览器的时候可以给媒体文件添加 id3 或者自定义的)标签。 我尝试了用 python 的 scipy 模组提取标签,感觉有点费劲,于是我就上网找,看到一个叫做 mutagen 的。 试了一下觉得挺方便的,于是和大家分享。
你会得到什么:
一个基础的脚本。 加以简单的魔改便可以植入你的工作流。
你需要的编程水平:
无
为什么:
植入在wav文件内部的标签好处就在于在预览时就可以进行方便的编辑,然后直接提交给其他软件使用例如音频中间件adx, Elias,Fmod, Wwise等。
用什么管理:
python和pandas。两者都是比较适合非程序员的。安装python后安装python包pandas,你可以在很短时间编写出一些基础功能。
步骤
第一步:
把该安装的包安装并加载进来
import sys
import mutagen as mtg
import os
import pandas as pd
import numpy as np
第二步:
在一个单独的wav文件上实验并做基础的数据清洗
输入媒体路径
just_one_wav_item='/Users/jiaweilu/Desktop/metadata_test/reaper_freeze_some_arbitary_name-01 render 001.wav'
one_item_unproccessed=mtg.File(just_one_wav_item)
通过pprint 来得到一个方便parse的字符串
formatted_one_wav_item=one_item_unproccessed.pprint()
使用split 切割功能来得到一个包含所有字符的list
everything_listed=formatted_one_wav_item.split()
把不要的干掉,1到11是描述波形文件的信息。当然如果你想留着也可以,需要打印出 formatted_one_wav_item
来单独看那些需要那些干掉
del everything_listed[:11]
用split把等号干掉并把 index 和 value 分出来,=就是 seperator
new_list=[]
for i in everything_listed:
j=i.split('=')
for k in j:
new_list.append(k)
由于comment中有俩= 需要特殊处理
del new_list[1:3]
自定义reaper的tag里也有俩=,特殊处理
del new_list[-3]
拆分成index和key两个列表,并重新打包(需要同时使用zip和set).这里需要注意的是,如果zip 再set的文件不同时,输出的列表的顺序是混乱的.需要重新sort
index_list=(new_list[::2])
key_list=(new_list[1::2])
final_list=zip(index_list,key_list)
final_list=sorted(set(final_list))
打印出来瞅瞅
print(final_list)
第三步:
把上述步骤做成一个函数
在上一步中,我们使用了很多python不同模组的函数。现在,我们要把这些函数都打包成一个函数。
这样输入(reaper里标签好的音频文件)进来,输出(一个方便被转化成‘熊猫数据框’的字典)出去。
python中简单的格式如下:
def 函数的名字(函数需要的变量,也就是输入):
对变量的操作
对变量的操作
对变量的操作
return (输出)
def proccess_single_wav(wav):
wav_unproccessed=mtg.File(wav)
formatted=wav_unproccessed.pprint()
listed=formatted.split()
del listed[:11]
data_list=[]
for i in listed:
j=i.split('=')
for k in j:
data_list.append(k)
del data_list[1:3]
del data_list[-3]
index_list=(data_list[::2])
key_list=(data_list[1::2])
final_list=zip(index_list,key_list)
final_list=sorted(set(final_list))
return final_list
第四步:
循环素材文件夹内的音频文件
输入文件目录,然后开始循环目录里面的每一个文件。 即把第三步中的结果根据文件的数量都打印一遍。
先来一个空的list
chunk=[]
adx_file_path='/Users/jiaweilu/Desktop/metadata_test/'
#循环文件夹里面的文件(如果你往里面丢除wav之外别的类型的文件的话,要在做处理。想要骚是有代价的)
for file in os.listdir(adx_file_path):
file_name=[('name',os.path.basename(adx_file_path+file))]
result=proccess_single_wav(adx_file_path+file)
all_data=file_name+result
chunk+=all_data
print(chunk)
再搞一个函数,输入上一步的总数据和要被等分的数目,输出小 chunk
def list_split(listA, n):
for x in range(0, len(listA), n):
every_chunk = listA[x: n+x]
if len(every_chunk) < n:
every_chunk = every_chunk + [None for y in range(n-len(every_chunk))]
yield every_chunk
new_chunk=list(list_split(chunk, 10))
第五步:
是熊是猫拉出来溜溜(初始化熊猫数据框)
df=pd.DataFrame(data=new_chunk,columns={'1', '2','3','4','5','6','7','8','9','0'})
熊猫好处在哪?
- 可以随意转成别的格式
- 通过pivot 表格可以转化成新的数据框或者阵列
- matplotlib 支持的漂亮的gui(秒杀excel,但还是没有reaper的各种theme好看)
- 强大的功能(join reshape merge)随意耍
- freeeeeeeeeeeeee
- 不干音频也可以转行data science
- 中国人不玩pandas 你像话么?
- 2010年的库, 不停的更新,活跃的社区(是不是越来越像reaper了?)
先把columns的名字改回来
df.rename(columns = {'1':'Name','3':'comment','4':'custom','0':'album','6':'bpm','7':'real_or_fake','8':'content','9':'description','5':'key','2':'author'}, inplace = True)
用ilok 哦不 是iloc 把index的内容取出来
df.iloc[0]
用iat来改变cell的值
df.iat[1,1] = 'new_value'
df
再改回来,注意是这里的二维[x,y] x 是rows(横)y是columns(竖)
先横再竖
先横再竖
先横再竖
先横再竖
df.iat[1,1] = df.iat[2,1]
df
可以循环每个row,或者 columns,或者两个一起
如果你不想让每个单元格都是一个tuple,那么可以循环整个列表并删除第一个元素(COMM,REAPER这些东西)
for rowIndex, row in df.iterrows(): #iterate over rows
for columnIndex, value in row.items():
new_value=list(value)
index_for_removal=0
new_value.pop(index_for_removal)
df.at[rowIndex,columnIndex]=new_value
数据框之间的对比
复制一份数据框
new_df=df.copy()
用iat来改变cell的值
new_df.iat[1,1] = [['new_value'],['another_value']]
用equals返回布尔值
df.equals(new_df)
compare返回具体df的区别
df.compare(new_df)
总之玩法太多。有兴趣的人可以上网去查https://pandas.pydata.org
鄙人非程序员,此举纯粹为了练手。我发现使用python的学习成本低,且可以做的事很多。希望大家指教。
第一部分完