Exemplo n.º 1
0
    def run_on_tier(self, tier, tier_y=None):
        """Apply filters on a tier.

        :param tier: (sppasTier) tier to be filtered
        :param tier_y: (sppasTier) required
        :return: (sppasTier)

        """
        if tier_y is None:
            return None

        logging.info("Apply sppasFilter() on tier: {:s}".format(
            tier.get_name()))
        sfilter = sppasTierFilters(tier)

        logging.debug("Data in RelationFilterProcess: {:s}".format(self.data))
        ann_set = sfilter.rel(
            tier_y, *(self.data[0]), **{
                self.data[1][i][0]: self.data[1][i][1]
                for i in range(len(self.data[1]))
            })

        # convert the annotations set into a tier
        filtered_tier = ann_set.to_tier(name=self.tier_name,
                                        annot_value=self.annot_format)

        return filtered_tier
Exemplo n.º 2
0
    def run_on_tier(self, tier, tier_y=None):
        """Apply filters on a tier.

        :param tier: (sppasTier) tier to be filtered
        :param tier_y: (sppasTier) ignored
        :return: (sppasTier)

        """
        logging.info("Apply sppasFilter() on tier: {:s}".format(
            tier.get_name()))
        sfilter = sppasTierFilters(tier)
        ann_sets = list()

        for d in self.data:

            if len(d[2]) >= 1:
                d2 = sppasTierFilters.cast_data(tier, d[0], d[2][0])

                # a little bit of doc:
                #   - getattr() returns the value of the named attributed of object:
                #     it returns f.tag if called like getattr(f, "tag")
                #   - func(**{'x': '3'}) is equivalent to func(x='3')
                #
                logging.info(" >>> filter.{:s}({:s}={!s:s})".format(
                    d[0], d[1], d2))

                ann_set = getattr(sfilter, d[0])(**{d[1]: d2})
                for i in range(1, len(d[2])):
                    d2 = sppasTierFilters.cast_data(tier, d[0], d[2][i])
                    logging.info(" >>>    | filter.{:s}({:s}={!s:s})".format(
                        d[0], d[1], d2))
                    ann_set = ann_set | getattr(sfilter, d[0])(**{d[1]: d2})
            else:
                return None
            ann_sets.append(ann_set)

        # no annotation is matching
        if len(ann_sets) == 0:
            return None

        # Merge results (apply '&' or '|' on the resulting data sets)
        ann_set = ann_sets[0]
        if self.match_all:
            for i in range(1, len(ann_sets)):
                ann_set = ann_set & ann_sets[i]
                if len(ann_set) == 0:
                    return None
        else:
            for i in range(1, len(ann_sets)):
                ann_set = ann_set | ann_sets[i]

        # convert the annotations set into a tier
        filtered_tier = ann_set.to_tier(name=self.tier_name,
                                        annot_value=self.annot_format)

        return filtered_tier
from sppas.src.analysis import sppasTierFilters
from sppas.src.utils.makeunicode import u
from .ex15_annotations_label_filter import get_tier

# ----------------------------------------------------------------------------
# Variables
# ----------------------------------------------------------------------------

filename = 'F_F_B003-P9-merge.TextGrid'

# ----------------------------------------------------------------------------
# Main
# ----------------------------------------------------------------------------

tier = get_tier(filename, "TokensAlign")
f = sppasTierFilters(tier)

# get tokens, except silences
annset_not_sil = f.tag(not_exact=u("#"))
tier_tokens = annset_not_sil.to_tier('Tokens')

# get silences
annset_sil = f.tag(exact=u("#"))
tier_silences = annset_sil.to_tier('Silences')

# tokens just followed by a silence
fr = sppasTierFilters(tier_tokens)
ann_set = fr.rel(tier_silences, 'meets')

for ann in ann_set:
    print(' - {}'.format(ann))
Exemplo n.º 4
0
# ----------------------------------------------------------------------------
# Variables
# ----------------------------------------------------------------------------

filename = 'F_F_B003-P9-merge.TextGrid'
tier_name = "PhonAlign"
output_filename = filename.replace('.TextGrid', '.csv')
verbose = True

# ----------------------------------------------------------------------------
# Main
# ----------------------------------------------------------------------------

if __name__ == '__main__':

    tier = get_tier(filename, tier_name, verbose)
    f = sppasTierFilters(tier)

    # Apply a filter: Extract phonemes 'a' or 'e' during more than 100ms
    # ------------------------------------------------------------------
    phon_set = f.dur(gt=0.1) & (f.tag(exact=u("e")) | f.tag(exact=u("a")))

    if verbose:
        print("{:s} has the following {:d} 'e' or 'a' during more than 100ms:"
              "".format(tier.get_name(), len(phon_set)))

        for ann in phon_set:
            print(' - {}: {}'.format(ann.get_location().get_best(),
                                     phon_set.get_value(ann)))