Festival 2.4:为什么有些声音不支持唱歌模式?
festival 2.4: why do some voices not work with singing mode?
voice_kal_diphone
和 voice_ral_diphone
在歌唱模式下正常工作(有声音输出,指定音符的音高是正确的)。
voice_cmu_us_ahw_cg
和其他CMU语音无法正常工作--有人声输出但音高没有根据指定的音符改变。
是否可以使用更高质量的 CMU 语音获得正确的输出?
工作(受音高影响)输出的命令行是:
text2wave -mode singing -eval "(voice_kal_diphone)" -o song.wav song.xml
非工作(音高不受影响)输出的命令行是:
text2wave -mode singing -eval "(voice_cmu_us_ahw_cg)" -o song.wav song.xml
这里是song.xml
:
<?xml version="1.0"?>
<!DOCTYPE SINGING PUBLIC "-//SINGING//DTD SINGING mark up//EN" "Singing.v0_1.dtd" []>
<SINGING BPM="60">
<PITCH NOTE="A4,C4,C4"><DURATION BEATS="0.3,0.3,0.3">nationwide</DURATION></PITCH>
<PITCH NOTE="C4"><DURATION BEATS="0.3">is</DURATION></PITCH>
<PITCH NOTE="D4"><DURATION BEATS="0.3">on</DURATION></PITCH>
<PITCH NOTE="F4"><DURATION BEATS="0.3">your</DURATION></PITCH>
<PITCH NOTE="F4"><DURATION BEATS="0.3">side</DURATION></PITCH>
</SINGING>
您可能还需要此补丁 singing-mode.scm
:
@@ -339,7 +339,9 @@
(defvar singing-max-short-vowel-length 0.11)
(define (singing_do_initial utt token)
- (if (equal? (item.name token) "")
+ (if (and
+ (not (equal? nil token))
+ (equal? (item.name token) ""))
(let ((restlen (car (item.feat token 'rest))))
(if singing-debug
(format t "restlen %l\n" restlen))
为了设置我的环境,我使用了 festvox fest_build script. You can also download voice_cmu_us_ahw_cg separately。
看来问题出在phone一代。
voice_kal_diphone
使用UniSyn
综合模型,而voice_cmu_us_ahw_cg
使用ClusterGen
模型。最后一个有自己的语调和持续时间模型(基于状态)而不是 phone intonation/duration:可能你注意到在生成的 'song'.
中持续时间也没有改变
singing-mode.scm
尝试提取每个音节并修改其频率。在 ClusterGen
模型波发生器的情况下,由于不同的模型,简单地忽略 Target
中设置的音节频率和持续时间。
因此我们有更好的语音质量(基于统计模型),但不能直接改变频率。
可以找到关于生成管道的非常好的描述 here。
voice_kal_diphone
和 voice_ral_diphone
在歌唱模式下正常工作(有声音输出,指定音符的音高是正确的)。
voice_cmu_us_ahw_cg
和其他CMU语音无法正常工作--有人声输出但音高没有根据指定的音符改变。
是否可以使用更高质量的 CMU 语音获得正确的输出?
工作(受音高影响)输出的命令行是:
text2wave -mode singing -eval "(voice_kal_diphone)" -o song.wav song.xml
非工作(音高不受影响)输出的命令行是:
text2wave -mode singing -eval "(voice_cmu_us_ahw_cg)" -o song.wav song.xml
这里是song.xml
:
<?xml version="1.0"?>
<!DOCTYPE SINGING PUBLIC "-//SINGING//DTD SINGING mark up//EN" "Singing.v0_1.dtd" []>
<SINGING BPM="60">
<PITCH NOTE="A4,C4,C4"><DURATION BEATS="0.3,0.3,0.3">nationwide</DURATION></PITCH>
<PITCH NOTE="C4"><DURATION BEATS="0.3">is</DURATION></PITCH>
<PITCH NOTE="D4"><DURATION BEATS="0.3">on</DURATION></PITCH>
<PITCH NOTE="F4"><DURATION BEATS="0.3">your</DURATION></PITCH>
<PITCH NOTE="F4"><DURATION BEATS="0.3">side</DURATION></PITCH>
</SINGING>
您可能还需要此补丁 singing-mode.scm
:
@@ -339,7 +339,9 @@
(defvar singing-max-short-vowel-length 0.11)
(define (singing_do_initial utt token)
- (if (equal? (item.name token) "")
+ (if (and
+ (not (equal? nil token))
+ (equal? (item.name token) ""))
(let ((restlen (car (item.feat token 'rest))))
(if singing-debug
(format t "restlen %l\n" restlen))
为了设置我的环境,我使用了 festvox fest_build script. You can also download voice_cmu_us_ahw_cg separately。
看来问题出在phone一代。
voice_kal_diphone
使用UniSyn
综合模型,而voice_cmu_us_ahw_cg
使用ClusterGen
模型。最后一个有自己的语调和持续时间模型(基于状态)而不是 phone intonation/duration:可能你注意到在生成的 'song'.
singing-mode.scm
尝试提取每个音节并修改其频率。在 ClusterGen
模型波发生器的情况下,由于不同的模型,简单地忽略 Target
中设置的音节频率和持续时间。
因此我们有更好的语音质量(基于统计模型),但不能直接改变频率。
可以找到关于生成管道的非常好的描述 here。