convert method

String convert(
  1. String text
)

Convert Japanese text to Kokoro phonemes.

Implementation

String convert(String text) {
  if (text.trim().isEmpty) return '';

  final tokens = _mecab.parse(text);
  final buf = StringBuffer();

  for (var i = 0; i < tokens.length; i++) {
    final token = tokens[i];
    final surface = token.surface;

    // Check if it's punctuation.
    final punct = _mapPunctuation(surface);
    if (punct != null) {
      if (buf.isNotEmpty &&
          punct.isNotEmpty &&
          _isPunctStop(punct) &&
          !_endsWithSpace(buf)) {
        // No space before punctuation.
      } else if (punct.isNotEmpty &&
          _isPunctStart(punct) &&
          buf.isNotEmpty &&
          !_endsWithSpace(buf)) {
        buf.write(' ');
      }
      buf.write(punct);
      if (punct.isNotEmpty && _isPunctStop(punct)) buf.write(' ');
      continue;
    }

    // ASCII passthrough.
    if (_isAscii(surface)) {
      if (buf.isNotEmpty && !_endsWithSpace(buf)) buf.write(' ');
      buf.write(surface);
      continue;
    }

    // Get reading from MeCab.
    final reading = token.pronunciation.isNotEmpty
        ? token.pronunciation
        : token.reading;

    if (reading.isEmpty) continue;

    // Convert katakana reading to hiragana.
    final hira = _katakanaToHiragana(reading);

    // Convert hiragana to phonemes.
    final phonemes = _hiraganaToPhonemes(hira);
    if (phonemes.isEmpty) continue;

    // Add word boundary space.
    if (buf.isNotEmpty && !_endsWithSpace(buf) && !_endsWithPunct(buf)) {
      buf.write(' ');
    }
    buf.write(phonemes);
  }

  return buf.toString().replaceAll(RegExp(r'\s+'), ' ').trim();
}