Flutter, Дротик Разделите предложение размером от одного символа до 2 символов для пользовательского проекта flutter tts

#flutter #dart #split #text-to-speech

#flutter #dart #сплит #преобразование текста в речь

Вопрос:

Пример:

var предложение = (привет, я Боб.)

var результат = [‘он’, ‘эл’, ‘лл’, ‘ло’, », ‘й’, ‘он’, ‘эр’, ‘ре’, ‘,’, ‘ ‘, ‘ Я’, », ‘есмь’, », «бо», «об», «.»]

Я нашел здесь рабочий пример, хотя он написан на Javascript, и я действительно не знаю, как использовать его для Dart, и не уверен, как будет вести себя после добавления пробелов и знаков препинания. Знаки препинания и пробелы мне всегда нужны сами по себе, а не в сочетании с буквами, они мне тоже нужны, так как я буду использовать их для добавления пауз между словами и предложениями.

Спасибо

     var a = 12345678;
    a= a.toString();
    var arr=[];
    for (var i =0; i<a.length-1; i  ) {
     arr.push(Number(a[i] '' a[i 1]));
    }
    
    console.log(arr); 

Ответ №1:

Вы могли бы использовать регулярные выражения для разделения предложения. Например:

 void main() {
  var exp = RegExp('([A-Za-z]{1,2}|[,!.?s ])');
  var str = "hello there, I am Bob.";
  var matches = exp.allMatches(str);

  for (var m in matches) {
    print(m.group(0));
  }
}
 

Это поиск букв (от А до Я или от а до я) в группах по 1 или 2, или одиночных знаков препинания (,!.?) s представляет пробел.

Выполнение вышеизложенного приведет к:

 he
ll
o
 
th
er
e
,
 
I
 
am
 
Bo
b
.

 

Комментарии:

1. Спасибо, хотя мне это нужно так [var result = [‘он’, ‘эл’, ‘лл’, ‘ло’, », ‘й’, ‘он’, ‘эр’, ‘ре’, ‘,’, ‘ ‘, ‘ Я»,’ ‘, ‘am’, ‘ ‘, ‘bo’, ‘ob’, ‘.’]. Проверю, смогу ли я понять, как принять ваш код, если это возможно

2. Да, вместо того, чтобы печатать его, как у меня в моем примере, вы можете поместить результат в список. Это должно дать вам результат, который вы ищете.

Ответ №2:

Другой подход

 void main() {
    var a = "1234!5678";
    a = a.toString();
    var arr = [];
    for (var i = 0; i < a.length - 1; i  ) {

        if (a[i   1] == '!') {
            continue;
        }
        if (a[i] == '!') {
            arr.add(a[i]);
            continue;
        }
        arr.add(a[i]   ''   a[i   1]);

    }

    print(arr);
}
 

Я не очень разбираюсь в dart, но я написал этот простой алгоритм на dartpad, и он работает

Комментарии:

1. Спасибо, это написано в правильном коде dart или вы просто написали вариацию на JavaScript-коде? Поскольку он не работает в DartPad?

2. О, извините, мой плохой, да, это работает, спасибо, хотя все еще есть проблема, что он группирует пробелы и знаки препинания буквами, он всегда должен разделять пробелы и знаки препинания отдельно на своем собственном примере = «как я?, результат = [‘ho’,’ow’,»,’I’,’am’,’?’] . Пытаюсь понять, смогу ли я туда добраться, но это выглядит действительно многообещающе

Ответ №3:

Если у кого-то возникла такая же проблема, вот как я ее решил

 void main(String string) {
var test = "I Hello there I am Bob 23!";

List<String> nameArray = test.split('');

for (int curIndex = 0; curIndex < nameArray.length; curIndex  ) {

if (curIndex >= 1 amp;amp; nameArray[curIndex].contains(new RegExp(r'[a-zA-Z]')) amp;amp; nameArray[curIndex-1].contains(new RegExp(r'[a-zA-Z]'))) {
      print(nameArray[curIndex-1]   nameArray[curIndex]); // checks if current curIndex and previous curIndex are letters, if so returns previous and curent letters joined
    } else {
if  (curIndex >= 1 amp;amp; nameArray[curIndex].contains(new RegExp(r'[a-zA-Z]')) amp;amp; nameArray[curIndex 1].contains(new RegExp(r'[a-zA-Z]'))) {
      null; // checks if curIndex and next curIndex are letters, if so returns null
  }else{
    print(nameArray[curIndex]);
  }

}
}
}
 

Который возвращает

 I

He
el
ll
lo
 
th
he
er
re
 
I
 
am
 
Bo
ob
 
2
3
!