iVocaloid论坛

标题: 居然没人试过用Praat代替UTAU音源工具链么…… [打印本页]

作者: Zleepwalking    时间: 2013/12/8 12:19     标题: 居然没人试过用Praat代替UTAU音源工具链么……

本帖最后由 Zleepwalking 于 2013/12/8 12:30 编辑

昨天学了下Praat的一些高级功能,比如Praat Script Language。Praat真是相当牛逼啊……自带了一堆世界上最先进的算法,再加上PSL简直逆天。我都觉得CVDBToolChain里的WSplit和Wpp白写了……

今天花半个多小时用PSL写出一个可以把录音里无声部分设成静音的脚本,相当成功:
  1. analysis_timestep = 0.01
  2. analysis_threshold = 50
  3. analysis_hold = 0.15
  4. analysis_preserve = 0.1

  5. obj_wave = selected()
  6. do("To Intensity...", 100, 0, 1)
  7. obj_intensity = selected()

  8. intensityLength = do("Get end time") - 0.1
  9. writeInfoLine("Length: ", intensityLength)

  10. count = 0
  11. onset = 0
  12. onsetTime = 0
  13. duration = 0
  14. for i from 5 to intensityLength / analysis_timestep
  15.         time = i * analysis_timestep
  16.         instIntensity = do("Get value at time...", time, "Cubic")
  17.         if instIntensity < analysis_threshold
  18.                 if onset == 0
  19.                         onset = 1
  20.                         onsetTime = time
  21.                 endif
  22.                 duration += analysis_timestep
  23.         endif
  24.         if onset == 1 and instIntensity > analysis_threshold
  25.                 onset = 0
  26.                 if duration > analysis_hold
  27.                         selectObject(obj_wave)
  28.                         do("Set part to zero...", onsetTime, time - analysis_preserve, "at nearest zero crossing")
  29.                         selectObject(obj_intensity)
  30.                         appendInfoLine(onsetTime, " -> ", time)
  31.                         count += 1
  32.                 endif
  33.                 duration = 0
  34.         endif
  35. endfor
  36. appendInfoLine(count, " in all.")
复制代码

ctst.png
长达半个小时的包含640多个音节的wav,花了十秒就搞定了。虽说这个效率相比WSplit还差了几倍(毕竟是个解释器嘛),但是质量可以完爆WSplit……
虽然没碰过UTAU不过我可以感觉到Praat用来做UTAU音源会特别管用,假如当初11区有人用PSL撸个UTAU工具链,估计现在就不会有这么一坨杂七杂八的音源制作工具了,而且做音源会变成极为轻松的事情。

昨天还写了个对选中的采样批量校正基频并延长两遍的PSL脚本:
  1. n = numberOfSelected("Sound")

  2. for i from 1 to n
  3.         soundList[i] = selected("Sound", i)
  4. endfor

  5. for i from 1 to n
  6.         wave = soundList[i]
  7.         selectObject(wave)
  8.         do("To Manipulation...", 0.01, 75, 800)
  9.         waveMani = selected()

  10.         do("Extract pitch tier")
  11.         avgF0 = do("Get mean (curve)...", 0, 0)
  12.         length = do("Get end time")
  13.         writeInfoLine("F0:", avgF0, "   Len: ", length)
  14.         do("Remove points between...", 0, length)
  15.         do("Add point...", 0, avgF0)
  16.         wavePitch = selected()
  17.         selectObject(waveMani, wavePitch)
  18.         do("Replace pitch tier")
  19.         removeObject(wavePitch)

  20.         do("Create DurationTier...", "LongerTier", 0, length)
  21.         do("Add point...", 0, 2.0)
  22.         waveDur = selected()
  23.         selectObject(waveMani, waveDur)
  24.         do("Replace duration tier")
  25.         removeObject(waveDur)

  26.         selectObject(waveMani)
  27.         do("Get resynthesis (overlap-add)")
  28.         removeObject(waveMani)
  29. endfor
复制代码

最后我表示很喜欢Praat的实用主义风格:从表面上看它就是个灰灰的窗口上面一坨灰色的按钮和文本框,你甚至第一眼看到还以为是gtk的按钮编程示例……当你了解它后才发现它的功能如此强大,让那些花花绿绿甚至依赖DirectX的动辄数百MB的效果器黯然失色。

Think in Praat.

*Praat的默认编译选项是-O1 -g1,我拿-O3重新编译了一遍效率提高了好多,暂没发现bug。



图片附件: ctst.png (2013/12/8 12:13, 113.75 KB) / 下载次数 3
http://bbs.ivocaloid.com/forum.php?mod=attachment&aid=NzM3NDJ8NzhiODM2ZTJ8MTc0OTQ1MTY4MHwwfDA%3D


作者: lazydog    时间: 2013/12/13 18:53

有个坑叫做uppslink……
作者: lazydog    时间: 2013/12/13 19:16

另求praat玩法……英文无力……
作者: Zleepwalking    时间: 2013/12/13 23:36

lazydog 发表于 2013/12/13 18:53
有个坑叫做uppslink……

uppslink听说过。其实我倒不看好拿praat作合成引擎;做分析和某些预处理是极好的,因此适用于音源库构建。
【不过praat那个基頻检测有时过度灵敏了,to Manipulation会把非周期信号加桢。
其实这玩意多试试就学会了,我有写/翻译教程的打算,就是不知道有没有人会看。
作者: http404    时间: 2013/12/17 14:29

它自带的变调其实还是很科学的啊(除了一点就是延长是简单重复周期,只要稍加一个线性混合都会好很多)…………我感觉如果能把变调那一坨抠出来做成独立的就已经可以逆天了……【但是看代码半天没找到在哪儿【x
作者: Zleepwalking    时间: 2013/12/17 15:41

http404 发表于 2013/12/17 14:29
它自带的变调其实还是很科学的啊(除了一点就是延长是简单重复周期,只要稍加一个线性混合都会好很多)…… ...

fon里面Manipulation_to_Sound.c之类的貌似,以前打进去看过……
其实可以在c程序里#include "praat.h",直接调用praat的各种功能;或者写成praat script用命令行调用。你可以在praat的manual里看到用法。
作者: rgwan    时间: 2014/1/10 13:28

uppslink压缩包还设密码……




欢迎光临 iVocaloid论坛 (http://bbs.ivocaloid.com/) Powered by Discuz! X2