示例#1
0
def produce_speech(sentence,
                   output_path="",
                   playback=True,
                   by_sentence=False,
                   sentence_number='1'):
    try:
        return_message = ""
        if not os.path.exists(temp_dir):
            os.mkdir(temp_dir)
        filename = "temp" + sentence_number + ".wav"
        temp_filename = os.path.join(temp_dir, filename)

        doc = ScoreDraft.Document()
        doc.setTempo(120)

        sn = 24  #Short note
        ln = 48  #Long note

        singer = ScoreDraft.Yami_UTAU()
        ScoreDraft.UtauDraftSetLyricConverter(
            singer, VCCVEnglishConverter.VCCVEnglishConverter)
        singer.tune('CZMode')

        sequence = []
        for word in sentence:
            subsequence = ()
            for syllable in word:
                if syllable[0] == 'rest':
                    if len(subsequence) != 0:
                        sequence.append(subsequence)
                        subsequence = ()
                    if syllable[1] == -3:  #Long pause
                        sequence.append(BL(ln))
                    elif syllable[1] == -2:  #Short pause
                        sequence.append(BL(sn))
                elif syllable[0] != '':
                    if syllable[1] == 0:  #Unstressed syllable
                        subsequence += (syllable[0], mi(5, sn))
                    elif syllable[1] == 2:  #Secondary stressed syllable
                        subsequence += (syllable[0], fa(5, sn))
                    elif syllable[1] == 1:  #Primary stressed syllable
                        subsequence += (syllable[0], so(5, sn))
            if len(subsequence) != 0:
                sequence.append(subsequence)

        doc.sing(sequence, singer)
        doc.mixDown(temp_filename)
        rendered_filename = temp_filename

        if output_path != "":
            try:
                if not "." in os.path.basename(
                        output_path) or os.path.basename(
                            output_path).startswith("."):
                    if not os.path.exists(os.path.abspath(output_path)):
                        os.mkdir(os.path.abspath(output_path))
                    filename = 'sentence' + sentence_number + '-on-{}.wav'.format(
                        str(datetime.now()).replace(':', '-'))
                    output_filename = os.path.join(output_path, filename)
                else:
                    if not os.path.exists(os.path.dirname(output_path)):
                        os.mkdir(os.path.dirname(output_path))
                    output_filename = output_path
                    if not output_path.endswith(".wav"):
                        output_filename += sentence_number * by_sentence + ".wav"
                shutil.copy(temp_filename, output_filename)
                rendered_filename = output_filename
                return_message += "----Rendered .wav file is available at " + rendered_filename + "\n"
            except:
                pass
                return_message += "!!!-An error occured during saving rendered file at output path\n"

    except:
        return_message += "!!!-An error occured during rendering process\n"
    try:
        if playback:
            chunk = 1024
            file = wave.open(rendered_filename, "rb")
            player = pyaudio.PyAudio()
            stream = player.open(format=player.get_format_from_width(
                file.getsampwidth()),
                                 channels=file.getnchannels(),
                                 rate=file.getframerate(),
                                 output=True)

            data = file.readframes(chunk)
            while len(data) > 0:
                stream.write(data)
                data = file.readframes(chunk)

            stream.stop_stream()
            stream.close()

            player.terminate()
            #            playsound(rendered_filename)
            pass
    except:
        pass
    shutil.rmtree(temp_dir, ignore_errors=True)
    return return_message
示例#2
0
doc.setTempo(100)

#seq = [ ('la', do(5,48), 'la', do(5,48), 'la', so(5,48), 'la', so(5,48), 'la',la(5,48), 'la',la(5,48), 'la',so(5,96))]

#seq = [ ("g6d", mi(5,24), "bI", so(5,24), "zhO", so(5,12), la(5,36) )]
#seq += [ ("mi", mi(5,24), "gat", so(5,16), "t6", so(5,8), "gO", so(5,12), la(5,36))]
#seq += [ ("mi", so(5,36), "yO", mi(5,12), "mI", so(5,24), "O", re(5,72)), BL(48)]

#seq = [ ('sk0r', 36, 1.0, 0.7, 'dr@ft', 36, 1.0, 0.6)]

#seq = [ ('pI', 24, 2.0, 2.0, 'dhan', 24, 1.5, 1.0)]

seq = [("ma", mi(5, 24), "ma", re(5, 24), mi(5, 48)), BL(24)]
seq += [("do", mi(5, 24), "yO", so(5, 24), "ri", la(5, 24), "mem", mi(5, 12),
         re(5, 12), "b3", re(5, 72)),
        BL(24)]
seq += [("dhx", do(5, 12), re(5, 12), "Od", mi(5, 24), "str0l", so(5,
                                                                   24), "h@t",
         so(5, 72)),
        BL(24)]
seq += [("yO", mi(5, 12), ti(5, 36)),
        BL(12), ("gAv", la(5, 24), "t6", so(5, 12), "mE", mi(5, 96))]

# link to voicebank: https://docs.google.com/uc?id=0B8k4SxZamGmvbXc2NEExTG5rUnM&export=download
singer = ScoreDraft.Yami_UTAU()
singer.setLyricConverter(ScoreDraft.VCCVEnglishConverter)
singer.setCZMode()

doc.sing(seq, singer)
doc.mixDown('vccv.wav')
示例#3
0
#!/usr/bin/python3

import sys
sys.path += ['../']

import ScoreDraft
from ScoreDraftNotes import *
import VCCVEnglishConverter

doc = ScoreDraft.Document()
doc.setTempo(100)

seq = [('twin', do(5, 48), 'k9l', do(5, 48), 'twin', so(5, 48), 'k9l',
        so(5, 48), 'li', la(5, 48), 't9l', la(5, 48), 'sta', so(5, 96))]

Yami = ScoreDraft.Yami_UTAU()
ScoreDraft.UtauDraftSetLyricConverter(
    Yami, VCCVEnglishConverter.VCCVEnglishConverter)

doc.sing(seq, Yami)
doc.mixDown('vccv.wav')