Решение задач распознавания на Flutter

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

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 _faces = [];

Инициализируем переменные в initState методе

@override
  void initState() {
    super.initState();
    _picker = ImagePicker();
    _faceDetector = FaceDetector(
      options: FaceDetectorOptions(),
    );
  }

Закрываем детектор в dispose методе

  @override
  void dispose() {
    _faceDetector.close();
    super.dispose();
  }

Метод для получения и обработки изображения

  Future _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 _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 _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 _startListening() async {

Очищаем текст при начале обработки

    setState(() {
      _recognizedText = '';
    });
    await _speechToText.listen(
      pauseFor: const Duration(seconds: 2),
      listenOptions: SpeechListenOptions(
        listenMode: ListenMode.dictation,
      ),
      onResult: _onSpeechResult,
    );
  }

Метод для остановки обработки речи в текст

  Future _stopListening() async {
    await _speechToText.stop();
    setState(() {});
  }

Метод для преобразования речи в текст

  void _onSpeechResult(
    SpeechRecognitionResult result,
  ) {
    setState(() {
      _recognizedText = result.recognizedWords;
    });
  }

Полученный текст можно вывести виджетом Text, передав туда _recognizedText.

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

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

© Habrahabr.ru