Auto-CS 2.2

https://sourceforge.net/projects/autocs/

Module sppas.src.annotations.CuedSpeech.whenhand.transition

Class WhenTransitionPredictorAttina

Description

Predict hand transition moments with (Attina, 2005) method.

Virginie Attina Dubesset (2005) La langue française parlée complétée (LPC) : production et perception. PhD Thesis of INPG Grenoble, France. Page 117, page 136 and page 148 https://tel.archives-ouvertes.fr/file/index/docid/384080/filename/these_attina.pdf

See page 112 (Experiment 1, no shape change, position changes, CV syllables):

  • The average key duration is 399.5ms
  • M1A1: mean duration is 239 ms (std is 87ms) => 60%
  • A1M2: mean duration is 37 ms (std is 76ms) => 9%

See page 113 (Experiment 1, no shape change, position changes, V syllables):

  • The average key duration is 383.6ms
  • M1A1: mean duration is 183 ms (std is 79ms) => 47%
  • A1M2: mean duration is 84 ms (std is 64ms) => 22%

Both results are summarized in the scheme page 117.

See page 118 (Experiment 2, shape changes, position doesn't), results page 123-124:

  • The average CV key duration is 275ms
  • D1A1: mean duration is 124 ms (std is 34ms)
  • A1D2: mean duration is 46 ms (std is 35ms)

See page 119 (Experiment 2, both shape/position change), results page 124-

  • The average CV key duration is 316.3ms
  • D1A1: mean duration is 171 ms (std is 48ms) => 54%
  • A1D2: mean duration is -3 ms (std is 45ms) => 0%
  • M1A1: mean duration is 205 ms (std is 54.5ms) => 65%
  • A1M2: mean duration is 33 ms (std is 50ms) => 10%

Both results are summarized in the scheme page 128.

A general synchronization scheme is proposed page 136 with percentages instead of durations; and extended to 3 more speakers page 148.

The percentages implemented in this class are related to an average key duration of 399.5ms (Experiment 1).

Constructor

__init__

Instantiate (Attina, 2005) hand transition moment's predictor.

View Source
def __init__(self):
    """Instantiate (Attina, 2005) hand transition moment's predictor.

    """
    super(WhenTransitionPredictorAttina, self).__init__()
    self._description = MSG_DESCRIPTION_ATTINA
    self.set_static_duration(0.4)

Public functions

predict_position

Predict [M1,M2] the moments when the hand is moving.

To predict M2: - if CV key: both page 136 and page 117, M2 is 10% later than A1. - if -V key: page 117, M2 is 21% later than A1. - if C- key: no information. CV key case is used.

To predict M1: - if CV key: page 136 M1 is 62-65% of A1A3, but page 117, M1 is 60% of A1A3 - if -V key: page 117, M1 is 46% of A1A3 - if C- key: no information. CV key case is used.

Parameters
  • isnilshape: (bool) True is the key is of the form "-V", i.e. no consonant
Returns
  • tuple(m1: float, m2: float)
View Source
def predict_position(self, is_nil_shape: bool=False, **kwargs) -> tuple:
    """Predict [M1,M2] the moments when the hand is moving.

        To predict M2:
            - if CV key: both page 136 and page 117, M2 is 10% later than A1.
            - if -V key: page 117, M2 is 21% later than A1.
            - if C- key: no information. CV key case is used.

        To predict M1:
            - if CV key: page 136 M1 is 62-65% of A1A3, but page 117, M1 is 60% of A1A3
            - if -V key: page 117, M1 is 46% of A1A3
            - if C- key: no information. CV key case is used.

        :param is_nil_shape: (bool) True is the key is of the form "-V", i.e. no consonant
        :return: tuple(m1: float, m2: float)

        """
    a3a1 = self.get_a1a3_avg_duration()
    if is_nil_shape is False:
        a1m2 = a3a1 * 0.1
        m1a1 = a3a1 * 0.62
    else:
        a1m2 = a3a1 * 0.21
        m1a1 = a3a1 * 0.46
    m1 = max(0.0, self.a1 - m1a1)
    m2 = self.a1 + a1m2
    return (m1, m2)

predict_shape

Predict [D1,D2] the moments when fingers are changing.

D1 and D2 are predicted from the key duration only. Following the model proposed page 136:

  • D2 is right before A1 (1%).
  • Estimating D1D2 interval, which is 55% of A3A1, gives D1 position related to D2.
Returns
  • (d1: float, d2: float)
Parameters
  • isnilshape
View Source
def predict_shape(self, is_nil_shape: bool=False, **kwargs) -> tuple:
    """Predict [D1,D2] the moments when fingers are changing.

        D1 and D2 are predicted from the key duration only. Following the
        model proposed page 136:

        - D2 is right before A1 (1%).
        - Estimating D1D2 interval, which is 55% of A3A1, gives D1 position
          related to D2.

        :return: (d1: float, d2: float)

        """
    a3a1 = self.get_a1a3_avg_duration()
    if is_nil_shape is False:
        d2d1 = a3a1 * 0.54
    else:
        d2d1 = a3a1 * 0.36
    d1 = max(0.0, self.a1 - d2d1)
    d2 = self.a1
    return (d1, d2)