- 3D工具
- MikuMikuDance
- 绘画工具
- Flash
- 音乐工具
- Audacity
- 所属类型
- 調教
  

0
9
0
UID: 111156
权限: 40
属性: 宇宙人 发帖: 201
(1精)
积分: 540
章鱼: 3
大葱: 14
茄子: 2688
注册:2012/8/18
存在感:476
|
本帖最后由 Zleepwalking 于 2013/12/8 12:30 编辑
昨天学了下Praat的一些高级功能,比如Praat Script Language。Praat真是相当牛逼啊……自带了一堆世界上最先进的算法,再加上PSL简直逆天。我都觉得CVDBToolChain里的WSplit和Wpp白写了……
今天花半个多小时用PSL写出一个可以把录音里无声部分设成静音的脚本,相当成功:
- analysis_timestep = 0.01
- analysis_threshold = 50
- analysis_hold = 0.15
- analysis_preserve = 0.1
- obj_wave = selected()
- do("To Intensity...", 100, 0, 1)
- obj_intensity = selected()
- intensityLength = do("Get end time") - 0.1
- writeInfoLine("Length: ", intensityLength)
- count = 0
- onset = 0
- onsetTime = 0
- duration = 0
- for i from 5 to intensityLength / analysis_timestep
- time = i * analysis_timestep
- instIntensity = do("Get value at time...", time, "Cubic")
- if instIntensity < analysis_threshold
- if onset == 0
- onset = 1
- onsetTime = time
- endif
- duration += analysis_timestep
- endif
- if onset == 1 and instIntensity > analysis_threshold
- onset = 0
- if duration > analysis_hold
- selectObject(obj_wave)
- do("Set part to zero...", onsetTime, time - analysis_preserve, "at nearest zero crossing")
- selectObject(obj_intensity)
- appendInfoLine(onsetTime, " -> ", time)
- count += 1
- endif
- duration = 0
- endif
- endfor
- appendInfoLine(count, " in all.")
复制代码
长达半个小时的包含640多个音节的wav,花了十秒就搞定了。虽说这个效率相比WSplit还差了几倍(毕竟是个解释器嘛),但是质量可以完爆WSplit……
虽然没碰过UTAU不过我可以感觉到Praat用来做UTAU音源会特别管用,假如当初11区有人用PSL撸个UTAU工具链,估计现在就不会有这么一坨杂七杂八的音源制作工具了,而且做音源会变成极为轻松的事情。
昨天还写了个对选中的采样批量校正基频并延长两遍的PSL脚本:
- n = numberOfSelected("Sound")
- for i from 1 to n
- soundList[i] = selected("Sound", i)
- endfor
- for i from 1 to n
- wave = soundList[i]
- selectObject(wave)
- do("To Manipulation...", 0.01, 75, 800)
- waveMani = selected()
- do("Extract pitch tier")
- avgF0 = do("Get mean (curve)...", 0, 0)
- length = do("Get end time")
- writeInfoLine("F0:", avgF0, " Len: ", length)
- do("Remove points between...", 0, length)
- do("Add point...", 0, avgF0)
- wavePitch = selected()
- selectObject(waveMani, wavePitch)
- do("Replace pitch tier")
- removeObject(wavePitch)
- do("Create DurationTier...", "LongerTier", 0, length)
- do("Add point...", 0, 2.0)
- waveDur = selected()
- selectObject(waveMani, waveDur)
- do("Replace duration tier")
- removeObject(waveDur)
- selectObject(waveMani)
- do("Get resynthesis (overlap-add)")
- removeObject(waveMani)
- endfor
复制代码
最后我表示很喜欢Praat的实用主义风格:从表面上看它就是个灰灰的窗口上面一坨灰色的按钮和文本框,你甚至第一眼看到还以为是gtk的按钮编程示例……当你了解它后才发现它的功能如此强大,让那些花花绿绿甚至依赖DirectX的动辄数百MB的效果器黯然失色。
Think in Praat.
*Praat的默认编译选项是-O1 -g1,我拿-O3重新编译了一遍效率提高了好多,暂没发现bug。
|
|