コード例 #1
0
    def test_AlignmentIo_readLines(self, its=50):
        for it in range(its):
            numLevels = randint(1, 4)
            alignment = gen_alignment(numLevels=numLevels)
            framePeriod = gen_framePeriod()
            alignmentIo = alio.AlignmentIo(framePeriod)

            alignmentLines = alignmentIo.writeLines(alignment)
            alignmentAgain = alignmentIo.readLines(alignmentLines)
            self.assertEqual(alignmentAgain, alignment)
コード例 #2
0
    def test_AlignmentIo_writeLines_1_level(self, its=50):
        for it in range(its):
            framePeriod = gen_framePeriod()
            alignment = gen_alignment()
            simpleAlignmentIo = alio.SimpleAlignmentIo(framePeriod)
            alignmentIo = alio.AlignmentIo(framePeriod)

            self.assertEqual(
                simpleAlignmentIo.writeLines(alignment),
                alignmentIo.writeLines(alignment)
            )
コード例 #3
0
    def test_AlignmentIo_writeLines_nested(self, its=50):
        for it in range(its):
            numLevels = randint(2, 4)
            alignment = gen_alignment(numLevels=numLevels)
            framePeriod = gen_framePeriod()
            alignmentIo = alio.AlignmentIo(framePeriod)

            alignmentLines = alignmentIo.writeLines(alignment)

            alignmentLinesAgain = []
            for startTime, endTime, label, subAlignment in alignment:
                subAlignmentLines = alignmentIo.writeLines(subAlignment)
                alignmentLinesAgain.append(subAlignmentLines[0] + ' ' + label)
                alignmentLinesAgain.extend(subAlignmentLines[1:])

            self.assertEqual(alignmentLinesAgain, alignmentLines)
コード例 #4
0
def main(argv):
    parser = argparse.ArgumentParser(description=__doc__.split('\n')[0])
    parser.add_argument('--alignment_suffix',
                        dest='alignmentSuffix',
                        metavar='ALIGNSUFFIX',
                        default='lab',
                        help='suffix for alignment files')
    parser.add_argument(dest='labelMapFile',
                        metavar='LABELMAP',
                        help=('file specifying label mapping'
                              ' (two columns separated by whitespace)'))
    parser.add_argument(dest='alignmentDirIn',
                        metavar='ALIGNDIRIN',
                        help='directory to read input alignments from')
    parser.add_argument(
        dest='uttIdsFile',
        metavar='UTTIDSFILE',
        help=('file containing a list of utterance ids'
              ' (e.g. one line might be "cmu_us_arctic_slt_a0001")'))
    parser.add_argument(dest='alignmentDirOut',
                        metavar='ALIGNDIROUT',
                        help='directory to write output alignments to')
    args = parser.parse_args(argv[1:])

    uttIds = [line.strip() for line in open(args.uttIdsFile)]

    alignmentIo = alio.AlignmentIo(framePeriod=1e-7)

    labelMapDict = readLabelMapFile(args.labelMapFile)
    print '(read label map with %s entries)' % len(labelMapDict)

    print '(writing output to directory %s)' % args.alignmentDirOut
    for uttId in uttIds:
        alignmentFileIn = os.path.join(args.alignmentDirIn,
                                       '%s.%s' % (uttId, args.alignmentSuffix))
        alignmentFileOut = os.path.join(
            args.alignmentDirOut, '%s.%s' % (uttId, args.alignmentSuffix))

        alignment = alignmentIo.readFile(alignmentFileIn)
        alignmentNew = mapAlignment(labelMapDict, alignment)
        alignmentIo.writeFile(alignmentFileOut, alignmentNew)
コード例 #5
0
def main(rawArgs):
    parser = argparse.ArgumentParser(
        description=(
            'Computes the MCD metric for two sequences of mel cepstra.'
            ' Mel cepstral distortion (MCD) is a measure of the difference'
            ' between two sequences of mel cepstra.'
            ' This utility computes the MCD between two sequences of equal'
            ' length that are assumed to already be "aligned" in terms of'
            ' their timing.'
            ' Optionally certain segments (e.g. silence) can be omitted from'
            ' the calculation.'),
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument(
        '--ext',
        dest='ext',
        default='mgc',
        metavar='EXT',
        help=('file extension added to uttId to get file containing speech'
              ' parameters'))
    parser.add_argument('--param_order',
                        dest='paramOrder',
                        default=40,
                        type=int,
                        metavar='ORDER',
                        help='parameter order of the cepstral files')
    parser.add_argument('--remove_segments',
                        dest='removeSegments',
                        default=None,
                        metavar='LABELREGEX',
                        help='regex of segment labels to remove')
    parser.add_argument(
        '--alignment_dir',
        dest='alignmentDir',
        default=None,
        metavar='ALIGNMENTDIR',
        help=('directory containing phone-level alignment files (used for'
              ' segment removal)'))
    parser.add_argument(
        '--frame_period',
        dest='framePeriod',
        default=0.005,
        type=float,
        metavar='FRAMEPERIOD',
        help='frame period in seconds (used for segment removal)')
    parser.add_argument(dest='natDir',
                        metavar='NATDIR',
                        help='directory containing natural speech parameters')
    parser.add_argument(
        dest='synthDir',
        metavar='SYNTHDIR',
        help='directory containing synthetic speech parameters')
    parser.add_argument(dest='uttIds',
                        metavar='UTTID',
                        nargs='+',
                        help='utterance ids (ext will be appended to these)')
    args = parser.parse_args(rawArgs[1:])
    assert (args.removeSegments is None) == (args.alignmentDir is None)
    if args.removeSegments is not None:
        print(('NOTE: removing segments matching regex \'%s\' using alignments'
               ' in %s' % (args.removeSegments, args.alignmentDir)))
    reRemoveSegments = (None if args.removeSegments is None else re.compile(
        args.removeSegments))

    costFn = mt.logSpecDbDist

    alignmentIo = alio.AlignmentIo(args.framePeriod)
    getAlignment = DirReader(alignmentIo, args.alignmentDir, 'lab')

    vecSeqIo = vsio.VecSeqIo(args.paramOrder)
    getNatVecSeq = DirReader(vecSeqIo, args.natDir, args.ext)
    getSynthVecSeq = DirReader(vecSeqIo, args.synthDir, args.ext)

    costTot = 0.0
    framesTot = 0
    for uttId in args.uttIds:
        print(('processing', uttId))
        nat = getNatVecSeq(uttId)
        synth = getSynthVecSeq(uttId)
        # ignore 0th cepstral component
        nat = nat[:, 1:]
        synth = synth[:, 1:]

        assert len(nat) == len(synth)

        if reRemoveSegments is None:
            cost = sum([
                costFn(natFrame, synthFrame)
                for natFrame, synthFrame in zip(nat, synth)
            ])
            frames = len(nat)
        else:
            alignment = getAlignment(uttId)
            alignmentInclude = [(startTime, endTime,
                                 not reRemoveSegments.search(label))
                                for startTime, endTime, label, _ in alignment]
            includeFrames = list(util.expandAlignment(alignmentInclude))
            assert len(includeFrames) == len(nat)
            costs = [
                costFn(natFrame, synthFrame)
                for natFrame, synthFrame, includeFrame in zip(
                    nat, synth, includeFrames) if includeFrame
            ]
            cost = sum(costs)
            frames = len(costs)

        costTot += cost
        framesTot += frames

    print(('overall MCD = %f (%d frames)' % (costTot / framesTot, framesTot)))
コード例 #6
0
def main(argv):
    parser = argparse.ArgumentParser(description=__doc__.split('\n')[0])
    parser.add_argument('--alignment_suffix',
                        dest='alignmentSuffix',
                        metavar='ALIGNSUFFIX',
                        default='lab',
                        help='suffix for alignment files (e.g. "lab")')
    parser.add_argument(
        '--sublabel_pat',
        dest='subLabelStrEndPat',
        metavar='PAT',
        default='[%d]',
        help=('printf-style pattern which, when expanded by replacing %%d with'
              ' a sublabel index >= 2, specifies the last part of the sublabel'
              ' string used in the input alignment files'
              ' (e.g. "[%%d]")'))
    parser.add_argument(
        '--num_sublabels',
        dest='numSubLabels',
        metavar='NUMSUBLABELS',
        default=5,
        type=int,
        help=('number of sublabels (also sometimes known as "states") in input'
              ' alignments (e.g. "5")'))
    parser.add_argument(
        dest='quesFile',
        metavar='QUESFILE',
        help='HTK / HTS question file (e.g. "questions_qst001.hed")')
    parser.add_argument(dest='alignmentDirIn',
                        metavar='ALIGNDIRIN',
                        help='directory to read input alignments from')
    parser.add_argument(
        dest='uttIdsFile',
        metavar='UTTIDSFILE',
        help=('file containing a list of utterance ids'
              ' (e.g. one line might be "cmu_us_arctic_slt_a0001")'))
    parser.add_argument(dest='alignmentDirOut',
                        metavar='ALIGNDIROUT',
                        help='directory to write output alignments to')
    args = parser.parse_args(argv[1:])

    uttIds = [line.strip() for line in open(args.uttIdsFile)]

    subLabelStrEnds = [
        args.subLabelStrEndPat % (subLabelIndex + 2)
        for subLabelIndex in range(args.numSubLabels)
    ]

    alignmentIo = alio.AlignmentIo(framePeriod=1e-7)

    questions = qio.readQuesFileVerifying(args.quesFile)
    quesRes = [qio.getQuesRe(quesPats) for _, quesPats in questions]

    print '(writing output to directory %s)' % args.alignmentDirOut
    for uttId in uttIds:
        alignmentFileIn = os.path.join(args.alignmentDirIn,
                                       '%s.%s' % (uttId, args.alignmentSuffix))
        alignmentFileOut = os.path.join(
            args.alignmentDirOut, '%s.%s' % (uttId, args.alignmentSuffix))

        alignment = alignmentIo.readFile(alignmentFileIn)
        alignmentNew = mapAlignment(alignment, quesRes, subLabelStrEnds)
        alignmentIo.writeFile(alignmentFileOut, alignmentNew)
コード例 #7
0
def main(argv):
    parser = argparse.ArgumentParser(description=__doc__.split('\n')[0])
    parser.add_argument('--alignment_suffix',
                        dest='alignmentSuffix',
                        metavar='ALIGNSUFFIX',
                        default='lab',
                        help='suffix for alignment files (e.g. "lab")')
    parser.add_argument(
        '--sublabel_pat',
        dest='subLabelStrEndPat',
        metavar='PAT',
        default='[%d]',
        help=('printf-style pattern which, when expanded by replacing %%d with'
              ' a sublabel index >= 2, specifies the last part of the sublabel'
              ' string used in the input alignment files'
              ' (e.g. "[%%d]")'))
    parser.add_argument(
        '--stream_pat_pat',
        dest='streamSpecPat',
        metavar='PATPAT',
        default='{*}[%d].stream[1]',
        help=('printf-style pattern which, when expanded by replacing %%d with'
              ' a sublabel index >= 2, specifies the HTK macro pattern'
              ' identifying the desired tree for a given sublabel'
              ' (e.g. for HTS demo a value of "{*}[%%d].stream[1]" would use'
              ' trees from stream 1, which is the mgc stream)'))
    parser.add_argument(
        '--num_sublabels',
        dest='numSubLabels',
        metavar='NUMSUBLABELS',
        default=5,
        type=int,
        help=('number of sublabels (also sometimes known as "states") in input'
              ' alignments (e.g. "5")'))
    parser.add_argument(
        dest='treeFile',
        metavar='TREE',
        help='HTS demo-style decision tree file (e.g. "mgc.inf")')
    parser.add_argument(dest='alignmentDirIn',
                        metavar='ALIGNDIRIN',
                        help='directory to read input alignments from')
    parser.add_argument(
        dest='uttIdsFile',
        metavar='UTTIDSFILE',
        help=('file containing a list of utterance ids'
              ' (e.g. one line might be "cmu_us_arctic_slt_a0001")'))
    parser.add_argument(dest='alignmentDirOut',
                        metavar='ALIGNDIROUT',
                        help='directory to write output alignments to')
    args = parser.parse_args(argv[1:])

    uttIds = [line.strip() for line in open(args.uttIdsFile)]

    subLabelStrEnds = [
        args.subLabelStrEndPat % (subLabelIndex + 2)
        for subLabelIndex in range(args.numSubLabels)
    ]

    alignmentIo = alio.AlignmentIo(framePeriod=1e-7)

    def subLabelIndexToStreamSpec(subLabelIndex):
        return args.streamSpecPat % (subLabelIndex + 2)

    questions, streamSpecedTrees = tio.readTreeFileVerifying(args.treeFile)
    quesReDict = qio.getQuesReDict(questions)

    navTrees = []
    for subLabelIndex in range(args.numSubLabels):
        streamSpecDesired = subLabelIndexToStreamSpec(subLabelIndex)
        foundTrees = [
            tree for streamSpec, tree in streamSpecedTrees
            if streamSpec == streamSpecDesired
        ]
        assert len(foundTrees) == 1
        navTree = tio.NavBinaryTree(quesReDict, foundTrees[0])
        navTrees.append(navTree)

    numLeaves = sum([len(navTree.tree.leaves) for navTree in navTrees])
    print '(found %s leaves)' % numLeaves

    print '(writing output to directory %s)' % args.alignmentDirOut
    for uttId in uttIds:
        alignmentFileIn = os.path.join(args.alignmentDirIn,
                                       '%s.%s' % (uttId, args.alignmentSuffix))
        alignmentFileOut = os.path.join(
            args.alignmentDirOut, '%s.%s' % (uttId, args.alignmentSuffix))

        alignment = alignmentIo.readFile(alignmentFileIn)
        alignmentNew = mapAlignment(alignment, navTrees, subLabelStrEnds)
        alignmentIo.writeFile(alignmentFileOut, alignmentNew)