| 
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。
 
 
 | 
 |