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)
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) )
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)
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)
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)))
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)
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)