Ответы пользователя по тегу Распознавание речи
  • Как вытащить дату из текста?

    @tatarrr95 Автор вопроса
    Написал функцию php, решающую мою задачу без нейросетей. Существуют варианты дат, которые невозможно распознать однозначно, тогда возвращается два варианта даты.

    function dateBirth($inputString){
                $inputString = str_replace(" январ", " 01", $inputString);
                $inputString = str_replace(" феврал", " 02", $inputString);
                $inputString = str_replace(" март", " 03", $inputString);
                $inputString = str_replace(" апрел", " 04", $inputString);
                $inputString = str_replace(" май", " 05", $inputString);
                $inputString = str_replace(" мая", " 05", $inputString);
                $inputString = str_replace(" мае", " 05", $inputString);
                $inputString = str_replace(" июн", " 06", $inputString);
                $inputString = str_replace(" июл", " 07", $inputString);
                $inputString = str_replace(" август", " 08", $inputString);
                $inputString = str_replace(" сентябр", " 09", $inputString);
                $inputString = str_replace(" октабр", " 10", $inputString);
                $inputString = str_replace(" ноябр", " 11", $inputString);
                $inputString = str_replace(" декабр", " 12", $inputString);
                $inputString = preg_replace('/\D/', '', $inputString);
                $year = "error";
                $daymonth = "";
                // Если длина строки больше 8 или меньше 4, вычислить дату не сможем
                if(strlen($inputString) < 4 || strlen($inputString) > 8){
                    return false;
                    
                }
                if(strlen($inputString) >= 6){ // если длина больше или равна 6, то год равен 4 числам
                    if(intval(substr($inputString, -4)) > 1920){ //4 последних числа должны быть больше 1920, иначе это не год
                        $year = substr($inputString, -4);
                        $daymonth = substr($inputString, 0, -4);
                    }
                    if(strlen($inputString) == 6){ //если прошлое не год, значит год состоит из двух чисел, но тогда длина все строки не может быть длинее 6
                        if(intval("19".substr($inputString, -2)) > 1920){ //Проверяем, больше ли эти два числа чем 1920
                            $year = "19".substr($inputString, -2);
                            $daymonth = substr($inputString, 0, -2);
                        }
                    }
                }
                else{
                    if(intval("19".substr($inputString, -2)) > 1920){ //Если длина меньше 6, значит год из двух числел
                        $year = "19".substr($inputString, -2); //проверяем, больше ли год чем 1920
                        $daymonth = substr($inputString, 0, -2);
                    }
                }
                // ищем день и месяц
                if($year != "error"){
                    if(strlen($daymonth) == 4 || strlen($daymonth) == 2){ //если деньмесяц состоит из 2 или 4 чисел. бьем строку пополам и получаем день + месяц
                        $day = substr($daymonth, 0, -strlen($daymonth)/2);
                        $month = substr($daymonth, -strlen($daymonth)/2);
                    }
                    // Если деньмесяц состоит из 3 чисел, то сложно
                    if(strlen($daymonth) == 3){
                        // Если первый 0, то день полюбому состоит из двух цифр
                        if(substr($daymonth, 0, 1) == "0"){ 
                            $day = substr($daymonth, 0, 2);
                            $month = substr($daymonth, -1);
                        }
                        // Если по середине 0, 1, 2 , то поулучается вилка, возвращаем сразу 2 вариианта
                        else if(substr($daymonth, 1, 1) == "0" || substr($daymonth, 1, 1) == "1" || substr($daymonth, 1, 1) == "2"){
                            $day = [substr($daymonth, 0, 1), substr($daymonth, 0, 2)]; //массив двух варантов дней
                            $month = [substr($daymonth, 1, 2), substr($daymonth, 2, 1)]; //массив двух вариантов месяцев
                            // проверяем, корректные ли дни и месяцы в массиве. Если нет, то превращаем массивы в немассивы без некорректных данных. Чтобы этим способом не проверить немассив, проверяем, массив ли это
                            if((intval($day[0]) > 31 || intval($month[0]) > 12 || intval($day[0]) == 0 || intval($month[0]) == 0) && is_array($day) && is_array($month)){
                                $day = $day[1];
                                $month = $month[1];
                            }
                            if((intval($day[1]) > 31 || intval($month[1]) > 12 || intval($day[1]) == 0 || intval($month[1]) == 0) && is_array($day) && is_array($month)){
                                $day = $day[0];
                                $month = $month[0];
                            }
                        }
                        // Если по середине 3
                        else if(substr($daymonth, 1, 1) == "3" && (substr($daymonth, 2, 1) == "1" || substr($daymonth, 2, 1) == "0")){
                            $day = [substr($daymonth, 0, 1), substr($daymonth, 0, 2)]; //массив двух варантов дней
                            $month = [substr($daymonth, 1, 2), substr($daymonth, 2, 1)]; //массив двух вариантов месяцев
                            // проверяем, корректные ли дни и месяцы в массиве. Если нет, то превращаем массивы в немассивы без некорректных данных. Чтобы этим способом не проверить немассив, проверяем, массив ли это
                            if((intval($day[0]) > 31 || intval($month[0]) > 12 || intval($day[0]) == 0 || intval($month[0]) == 0) && is_array($day) && is_array($month)){
                                $day = $day[1];
                                $month = $month[1];
                            }
                            if((intval($day[1]) > 31 || intval($month[1]) > 12 || intval($day[1]) == 0 || intval($month[1]) == 0) && is_array($day) && is_array($month)){
                                $day = $day[0];
                                $month = $month[0];
                            }
                        }
                        // Теперь просто двигаем точку с одного места ну другое проверяя, меньше ли день 31 и месяц 12. Если попали то круть
                        else{
                            // проверяем корректность данных при передвижении
                            if(intval(substr($daymonth, 0, 2)) <= 31 && intval(substr($daymonth, 0, 2)) != 0){
                                $day = substr($daymonth, 0, 2);
                                $month = substr($daymonth, -1);
                            }
                            // проверяем корректность данных при передвижении
                            else if(intval(substr($daymonth, 1, 2)) <= 12 && intval(substr($daymonth, 1, 2)) != 0 ){
                                $day = substr($daymonth, 0, 1);
                                $month = substr($daymonth, 1, 2);
                            }
                            else{
                                $day = "error";
                                $month = "error";
                            }
                        }
    
                    }
                }
                $dataBorn = "";
                $format = 'd.m.Y';
                // Если в итоге у нас вернулось 2 варианта даты, работаем с ним
                if(is_array($day) && is_array($month)){
                    $dataBorn = [$day[0].".".$month[0].".".$year , $day[1].".".$month[1].".".$year];
                    $date = [];
                    // пробуем законвертить дату и добавиить в массив, если не получается, значит хуевая дата
                    try{
                        array_push($date, date_create_from_format($format, $dataBorn[0])->format('d.m.Y'));
                        // дополнительно проверяем на ошибки дату Например при конвертациии раньше 31.02.2016 выдавал не ошибку а 02.03.2016
                        if(DateTime::getLastErrors()['warning_count'] > 0) {
                            $date = "error";
                        }
                    }
                    catch (Error $e) {
                        $date = "error";
                    }
                    // пробуем законвертить дату и добавиить в массив, если не получается, значит хуевая дата
                    try{
                        array_push($date, date_create_from_format($format, $dataBorn[1])->format('d.m.Y'));
                        // дополнительно проверяем на ошибки дату Например при конвертациии раньше 31.02.2016 выдавал не ошибку а 02.03.2016
                        if(DateTime::getLastErrors()['warning_count'] > 0) {
                            $date = "error";
                        }
                    }
                    catch (Error $e) {
                        $date = "error";
                    }
                    // Проверяем, остался ли массив после предыдущих манипуляций, и если в нем всего одно значение, переделываем массив в строку
                    if(is_array($date) && count($date) < 2){
                        $date = $date[0];
                    }
                    return $date;
                }
                // Если вернулась всего одна дата
                else{
                    // Проверяем на корректность день месяц
                    if(intval($day) > 31 || intval($month) > 12 || intval($day) == 0 || intval($month) == 0){
                        $day = "error";
                        $month = "error";
                    }
                    $dataBorn = $day.".".$month.".".$year;
                    // Продуем законвертииться в дату, если не получиилось, хуевая дата
                    try {
                        $date = date_create_from_format($format, $dataBorn)->format('d.m.Y');
                        // дополнительно проверяем на ошибки дату Например при конвертациии раньше 31.02.2016 выдавал не ошибку а 02.03.2016
                        if(DateTime::getLastErrors()['warning_count'] > 0) {
                            $date = "error";
                        }
                    } 
                    catch (Error $e) {
                        $date = "error";
                    }
                    return $date;
                }
            }


    Использовать как
    dateBirth("текст текст текст 29.6.95 текст")
    Ответ написан
    Комментировать
  • Как распознать речь резделяя голоса в одноканальном аудио?

    @tatarrr95 Автор вопроса
    Google speech смог, называется это diarization, прилагаю ссылку на пример, авось кому поможет.
    https://cloud.google.com/speech-to-text/docs/multi...
    Ответ написан
    Комментировать