【问题标题】:Synthesize phoneme pairs on OSX在 OSX 上合成音素对
【发布时间】:2014-07-07 16:51:53
【问题描述】:

我需要创建 144 个音素对的波形文件,例如“Da Di Du, Beh Bi Burr, ...”

具体来说,我需要每个人都保持一个恒定的音高,这样我就可以对它们进行音高转换来制作音符(如果我能输入音高值会更好!)。

我真的不想录制我试图唱歌的 144 个 .WAV 文件。

我可以使用 OSX 的内置语音合成 API 来做到这一点吗?

如果没有,有没有其他方法可以做到?

编辑:我不需要任何特定的质量等级。重要的是每个话语都是可区分的并且音调正确。

编辑:我将尝试在下面解决这个问题,如果我得到满意的结果,我会将其分解为答案。

Speech Synthesis Programming Guide 似乎应有尽有,它谈到使用轮廓控制音高here,以及输入语音输入here

但是,要弄清楚整个 API 并编写一个 OS X 项目来完成它,需要做很多工作。所以我对命令行选项或使用现有的合成器很感兴趣。

CRGreen 的回答用户参数“说”我在manpage 中找不到记录:

刚刚在这里找到了一个例子:http://hints.macworld.com/article.php?story=20120204172337402

编辑:音素https://apple.stackexchange.com/questions/53858/in-terminal-how-to-get-say-to-say-things-right-ie-using-custom-phonetics

【问题讨论】:

    标签: macos speech-synthesis phoneme


    【解决方案1】:

    在 AppleScript 脚本编辑器中:

    set diphones to {"Dah", "Di", "Du", "Beh", "Bi", "Burr"} --etc.
    
    set targetFolder to ((choose folder) as text)
    
    repeat with p in diphones
        say p using "Vicki" pitch 55 modulation 0 saving to (targetFolder & p & ".aif")
    end repeat
    

    然后将文件转换为 WAV。

    “say”命令字典中还有一些其他选项可用。

    不过,我不认为它这么简单。语音合成器如何处理这些双音素可能很奇怪,甚至会根据您使用的声音而有所不同。您可能必须操纵很多声音才能成为您想要的方式。例如,Vicki 像“DEE”一样说“Di”,像“BYE”一样说“Bi”。真的很难让这些声音像双音素一样发出短小的“i”(如“big”)。甚至可能有必要让它说“大”(例如),然后在 Audacity 中编辑声音,切断结尾并在编辑版本的结尾处淡出,然后将其导出。我只是这样做了,它可以工作,但是是的,你需要做一些特殊情况的调整。如果您有开发者工具,还有一个名为“Repeat After Me”的应用程序,它允许您“调整”语音文本,但(令人惊讶的是)对于我刚才描述的情况,它没有帮助。 (不过,对于较大的块来说,它非常强大)。

    [edit] 所以,是的,上面的拼音输入版本可能是这样的:

    set diphones to {"dAO", "dIH", "dAX", "bEH", "bIH", "brr"} --etc., changed to be phonetic based on Apple's system
    
    set targetFolder to ((choose folder) as text)
    
    repeat with p in diphones
        say ("[[inpt PHON]]" & p & "[[inpt TEXT]]") using "Vicki" pitch 52 modulation 0 saving to (targetFolder & p & ".aif")
    end repeat
    

    [附录]

    几年前,Apple 的声音都是一样的,你可以调整任何声音来完美地演唱一首歌(我在一个晚上做了“星条旗”)。然后,出于某种原因,开发人员不仅改变了声音,还取消了一致性,使得某些声音的行为与其他声音完全不同。我对此并不高兴。 考虑以下几点:

    使用默认语音(“Alex”),以下话语(您会被鼓励找到)尽可能:

    say "[[inpt TUNE]] d {D 114; P 95.0:100} UW {D 227; P 95.0:100} 1IY {D 382; P 95.0:100} . {D 30} [[inpt TEXT]]" using "Alex"
    

    但是,如果您使用“大提琴”或“管风琴”,即使您使用这种 TUNE 模式,最后也会得到那种奇怪的提升。不要问我为什么。那么我是如何让这个工作的,至少对于“亚历克斯”?我使用了前面提到的“Repeat After Me”应用程序并简化了“调整过的”输出。我想你可以使用 TUNE 和 PHON 的一些变体来获得你想要的东西。但是你可能不得不远离“大提琴”和“管风琴”,因为它们对于制作单调的语调是有问题的(尽管它们对于某些双音素/三音素可能很好)。也许您必须同时使用两者,我知道这很烦人。我感觉到你的痛苦。

    还有一个变化。请注意以下“rate”标签强制使用更长话语的方式:

    say "[[rate - 66]] [[inpt TUNE]] d {D 114; P 95.0:100} UW {D 227; P 95.0:100} 1IY {D 382; P 95.0:100} . {D 30} [[inpt TEXT]]" using "Alex"
    

    [附录二]

    啊,但是看看这个。这平衡了“管风琴”;通过在最后一个音素之前强制进行音高调制(“pbas”)来消除结尾提升:

    say "[[rate - 66]] [[inpt TUNE]] d {D 114; P 95.0:100} UW {D 227; P 95.0:100} [[pbas - 5]] 1IY {D 382; P 95.0:100} . {D 30} [[inpt TEXT]]" using "Pipe Organ"
    

    他们让我们在这里工作太辛苦了:-)

    这是一个简化的版本,可以回到原来的版本,但将 pbas 保留在那里:

    say "[[inpt TUNE]] d UW [[pbas - 5]] 1IY [[inpt TEXT]]" using "Pipe Organ"
    

    【讨论】:

    • 不幸的是,这对我的目的没有好处,因为话语中的音调会发生变化,就像人类讲话一样。要是我能找到更原始的东西就好了……
    • 使用modulation 0 参数有助于消除音高变化。不确定您可以接受的公差是多少。请参阅编辑的代码。你需要多好的声音? espeak 是一个开源命令行程序,具有类似的功能(并输出 WAV),但声音很漂亮,比如说机器人。
    • 你在哪里找到这个? “说”的手册页没有提到它。是否可以在没有 AppleScript 的情况下从命令行进行单个测试?我已经编辑了问题。
    • @Pi,say 的 AppleScript 版本有更多选择。见applescript.wikia.com/wiki/Say(可以通过脚本编辑器访问字典)
    • 为什么你会这么反感打开脚本编辑器我不知道,但要在命令行中测试:osascript -e "say \"dah\" using \"Vicki\" pitch 55 modulation 0"(这是使用applescript,当然)
    【解决方案2】:

    我已经设法让它与以下脚本一起工作:

    -- to run, '/usr/bin/osascript genPhonemes'
    
    -- https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/SpeechSynthesisProgrammingGuide/Phonemes/Phonemes.html
    -- http://stackoverflow.com/questions/23742648/synthesize-phoneme-pairs-on-osx
    -- http://applescript.wikia.com/wiki/Say
    
    set Vowels to { "AA", "AY", "EH", "EY", "IY", "AO", "OY", "UW", "UWIY", "AX", "AXIY", "IH"}
    set Consonants to { "d", "b", "r", "N", "m", "v", "S", "z", "h", "l", "k", "t" }
    set NoteOffsets to { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -3, -2, -1 }
    set NoteNumbers to { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11" }
    
    set targetFolder to "OUT" -- ((choose folder) as text)
    
    repeat with i from 1 to 12
        set C to (item i of Consonants)
    
        set midinote to 60 - 12 + (item i of NoteOffsets)
    
        repeat with j from 1 to 12
            set V to (item j of Vowels)
    
            set filename to targetFolder  &  C & "_" & (item j of NoteNumbers) & ".aif"
    
            set utterance to "[[inpt PHON]]" & C & V      
    
            say utterance   using "Pipe Organ"   speaking rate 120   pitch midinote   modulation 0   saving to filename
        end repeat
    end repeat
    

    由于某种原因,元音对出现错误。第二个元音的音调越来越高。使用管风琴时,最后一个元音是纯四高音。

    例如dUWIY,听起来像“doo-ee”,最后的 ee 是完美的第四高。

    其他唯一合适的声音是大提琴,它也会破坏它,虽然间隔更小,可能是半音。

    有没有办法解决这个问题?

    【讨论】:

    • 消除结尾“提升”的最佳方法是在最后一个音素之前使用“pbas”音高调制。请参阅答案中的最后 2 个示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多