Распознавание на Flutter: Решения и примеры

Задачи распознавания изображений и звука имеют широкий спектр применений в различных приложениях. Используя Flutter, как мощный фреймворк для разработки кроссплатформенных мобильных приложений, вполне возможно реализовать функционал распознавания данных в несколько шагов.

В этой статье мы рассмотрим некоторые из задач распознавания, такие как распознавание лиц, текста и звука, и приведем фрагменты кода и рекомендуемые библиотеки для их реализации на Flutter.

Читать на Habr
Читать на Дзен

1. Распознавание лиц

Процесс распознавания лица в офисе на мобильном приложении
Распознавание лиц является широко используемой задачей в приложениях, связанных с идентификацией и безопасностью. Для реализации функций распознавания лиц на Flutter вы можете использовать библиотеку Google ML Kit Face Detection, которая предоставляет полезные инструменты для обнаружения и идентификации лиц на изображении. Пример кода для распознавания лиц:
Импортируем нужные библиотеки
import 'package:google_mlkit_face_detection/google_mlkit_face_detection.dart';
import 'package:image_picker/image_picker.dart';
Создаем переменные
late ImagePicker _picker;
  late FaceDetector _faceDetector;
  dynamic _image;
  Size? _imageSize;
  List<Face> _faces = [];
Инициализируем переменные в initState методе
@override
  void initState() {
    super.initState();
    _picker = ImagePicker();
    _faceDetector = FaceDetector(
      options: FaceDetectorOptions(),
    );
  }
Закрываем детектор в dispose методе
  @override
  void dispose() {
    _faceDetector.close();
    super.dispose();
  }
Метод для получения и обработки изображения
  Future<void> _getAndScanImage({final bool? isFromCamera}) async {
Чистим данные при выборе нового изображения
    setState(() {
      _image = null;
      _faces = [];
      _imageSize = null;
    });
Получаем файл из камеры или из галереи
   final imageXFile = await _picker.pickImage(
      source: isFromCamera != null && isFromCamera ? ImageSource.camera : ImageSource.gallery,
    );
Обрабатываем полученный файл
    if (imageXFile != null) {
      final inputImage = InputImage.fromFilePath(imageXFile.path);
      final facesList = await _faceDetector.processImage(inputImage);
      final imageAsBytes = await imageXFile.readAsBytes();
      final imageDecoded = await decodeImageFromList(imageAsBytes);
      setState(
        () {
          _faces = facesList;
          _image = imageDecoded;
          _imageSize = Size(
            imageDecoded.width.toDouble(),
            imageDecoded.height.toDouble(),
          );
        },
      );
    } 
  }
Виджет отображающий результат
 Expanded(
                          child: FittedBox(
                            child: SizedBox(
                              width: _imageSize!.width,
                              height: _imageSize!.height,
                              child: CustomPaint(
                                painter: FacePainter(
                                  faceList: _faces,
                                  imageFile: _image,
                                ),
                              ),
                            ),
                          ),
                        ),

2. Распознавание текста

Сканирование и распознавание текста через мобильное приложение
Распознавание текста является полезной функцией в задачах сканирования документов, оптического распознавания символов (OCR) и других подобных приложений. Вы можете использовать библиотеку Google ML Kit Text Recognition для распознавания текста на Flutter. Ниже приведен пример кода для распознавания текста:
Импортируем нужные библиотеки
import 'package:google_mlkit_text_recognition/google_mlkit_text_recognition.dart';
import 'package:image_picker/image_picker.dart';
Создаем переменные
  late TextRecognizer _recognizer;
  File? _imageFile;
  String _scanResults = '';
Инициализируем переменные в initState методе
@override
  void initState() {
    super.initState();
    _recognizer = TextRecognizer();
    );
  }
Закрываем рекогнайзер в dispose методе
  @override
  void dispose() {
    _recognizer.close();
    super.dispose();
  }
Метод для получения и обработки изображения
 Future<void> _getAndScanImage() async {
Очищаем данные при выборе нового изображения
    setState(() {
      _imageFile = null;
      _scanResults = '';
    });
    final XFile? pickedImage = await ImagePicker().pickImage(
        source: ImageSource.gallery,
    );
    if (pickedImage != null) {
      final File imageFile = File(pickedImage.path);
      setState(() {
        _imageFile = imageFile;
      });
      await _scanImage(imageFile);
    }
  }
Обрабатываем полученный файл
    Future<void> _scanImage(File imageFile) async {
    final results = await _recognizer.processImage(
      InputImage.fromFile(
        _imageFile!,
      ),
    );
    setState(() {
      _scanResults = results.text;
    });
  }
Полученный текст можно вывести виджетом Text, передав туда _scanResults. Так же можно отображать используемое изображение любым удобным способом, просто обернув всё в Column.

3. Распознавание звука

Распознавание слов с помощью приложения на телефоне в офисе
Распознавание звука имеет много возможностей применений, включая задачи распознавания речи и звукового анализа. Для реализации функций распознавания звука на Flutter вы можете использовать библиотеку speech_to_text, которая предоставляет инструменты для распознавания и транскрибирования речи в реальном времени. Ниже приведен пример кода для распознавания речи с использованием библиотеки speech_to_text:
Импортируем нужные библиотеки
import 'package:speech_to_text/speech_recognition_result.dart';
import 'package:speech_to_text/speech_to_text.dart';
Создаем переменные
  late SpeechToText _speechToText;
  String _recognizedText = '';
Инициализируем переменные в initState методе
@override
  void initState() {
    super.initState();
    _speechToText = SpeechToText();
    );
  }
 Закрываем рекогнайзер в dispose методе
  @override
  void dispose() {
    _speechToText.cancel();
    super.dispose();
  }
Метод для начала обработки речи в текст
  Future<void> _startListening() async {
Очищаем текст при начале обработки
    setState(() {
      _recognizedText = '';
    });
    await _speechToText.listen(
      pauseFor: const Duration(seconds: 2),
      listenOptions: SpeechListenOptions(
        listenMode: ListenMode.dictation,
      ),
      onResult: _onSpeechResult,
    );
  }
Метод для остановки обработки речи в текст
  Future<void> _stopListening() async {
    await _speechToText.stop();
    setState(() {});
  }
Метод для преобразования речи в текст
  void _onSpeechResult(
    SpeechRecognitionResult result,
  ) {
    setState(() {
      _recognizedText = result.recognizedWords;
    });
  }
Полученный текст можно вывести виджетом Text, передав туда _recognizedText.

Вариантов для использования данных технологий огромное количество, например, для отслеживания лица — это аутентификация по биометрии, различные маски для фото/видео, для распознавания текста — это перевод текста на другой язык, преобразование написанных от руки текстов в печатный текст, для распознавания звука — так же перевод с одного языка на другой, создание заметок, ввод текста голосом и др.