Самый удобный почтовый клиент. Лучшие почтовые клиенты для ОС Windows

30.10.2019 Windows

) на реальном Hello World примере управления домашней техникой.
Почему именно домашней техникой? Да потому что благодаря такому примеру можно оценить ту скорость и точность , которой можно добиться при использовании полностью локального распознавания речи без серверов типа Google ASR или Яндекс SpeechKit .
К статье я также прилагаю все исходники программы и саму сборку под Android .

С чего вдруг?

Наткнувшись недавно на , я задал вопрос автору, почему для своей программы он захотел использовать именно серверное распознавание речи (по моему мнению, это было излишним и приводило к некоторым проблемам). На что получил встречный вопрос о том, не мог бы я поподробней описать применение альтернативных способов для проектов, где нет необходимости распознавать что угодно, а словарь состоит из конечного набора слов. Да еще и с примером практического применения…

Зачем нам что-то еще кроме Яндекса и Google?

В качестве того самого «практического применения» я выбрал тему голосового управления умным домом .
Почему именно такой пример? Потому что на нем можно увидеть те несколько преимуществ полностью локального распознавания речи перед распознаванием с использованием облачных решений. А именно:
  • Скорость - мы не зависим от серверов и поэтому не зависим от их доступности, пропускной способности и т.п. факторов
  • Точность - наш движок работает только с тем словарем, который интересует наше приложение, повышая тем самым качество распознавания
  • Стоимость - нам не придется платить за каждый запрос к серверу
  • Голосовая активация - как дополнительный бонус к первым пунктам - мы можем постоянно «слушать эфир», не тратя при этом свой трафик и не нагружая сервера

Примечание

Сразу оговорюсь, что эти преимущества можно считать преимуществами только для определенного класса проектов , где мы точно заранее знаем , каким словарем и какой грамматикой будет оперировать пользователь. То есть, когда нам не надо распознать произвольный текст (например, СМС сообщение, либо поисковый запрос). В обратном случае без облачного распознавания не обойтись.

Так Android же умеет распознавать речь без интернета!
Да-да… Только на JellyBean. И только с полуметра, не более. И это распознавание - это та же диктовка, только с использованием гораздо меньшей модели. Так что управлять ею и настраивать ее мы тоже не можем. И что она вернет нам в следующий раз - неизвестно. Хотя для СМС-ок в самый раз!

Что будем делать?

Будем реализовывать голосовой пульт управления домашней техникой, который будет работать точно и быстро, с нескольких метров и даже на дешевом тормозном хламе очень недорогих Android смартфонах, планшетах и часах.
Логика будет простой, но очень практичной. Активируем микрофон и произносим одно или несколько названий устройств. Приложение их распознает и включает-выключает их в зависимости от текущего состояния. Либо получает от них состояние и произносит его приятным женским голосом. Например, текущая температура в комнате.

Вариантов практического применения масса

Утром, не открывая глаз, хлопнули ладонью по экрану смартфона на тумбочке и командуем «Доброе утро!» - запускается скрипт, включается и жужжит кофеварка, раздается приятная музыка, раздвигаются шторы.
Повесим по дешевому (тысячи по 2, не более) смартфону в каждой комнате на стенке. Заходим домой после работы и командуем в пустоту «Умный дом! Свет, телевизор!» - что происходит дальше, думаю, говорить не надо.

Транскрипции



Грамматика описывает то, что может говорить пользователь . Для того, чтобы Pocketsphinx знал, как он это будет произносить, необходимо для каждого слова из грамматики написать, как оно звучит в соответствующей языковой модели. То есть транскрипцию каждого слова. Это называется словарь .

Транскрипции описываются с помощью специального синтаксиса. Например:
умный uu m n ay j дом d oo m

В принципе, ничего сложного. Двойная гласная в транскрипции обозначает ударение. Двойная согласная - мягкую согласную, за которой идет гласная. Все возможные комбинации для всех звуков русского языка .

Понятно, что заранее описать все транскрипции в нашем приложении мы не можем, потому что мы не знаем заранее тех названий, которые пользователь даст своим устройствам. Поэтому мы будем гененрировать «на лету» такие транскрипции по некоторым правилам русской фонетики. Для этого можно реализовать вот такой класс PhonMapper , который сможет получать на вход строчку и генерировать для нее правильную транскрипцию.

Голосовая активация

Это возможность движка распознавания речи все время «слушать эфир» с целью реакции на заранее заданную фразу (или фразы). При этом все другие звуки и речь будут отбрасываться. Это не то же самое, что описать грамматику и просто включить микрофон. Приводить здесь теорию этой задачи и механику того, как это работает, я не буду. Скажу лишь только, что недавно программисты, работающие над Pocketsphinx, реализовали такую функцию, и теперь она доступна «из коробки» в API.

Одно стоит упомянуть обязательно. Для активационной фразы нужно не только указать транскрипцию, но и подобрать подходящее значение порога чувствительности . Слишком маленькое значение приведет к множеству ложных срабатываний (это когда вы не говорили активационную фразу, а система ее распознает). А слишком высокое - к невосприимчивости. Поэтому данная настройка имеет особую важность. Примерный диапазон значений - от 1e-1 до 1e-40 в зависимости от активационной фразы .

Активация по датчику приближения

Эта задача специфична именно для нашего проекта и напрямую к распознаванию не имеет отношения. Код можно увидеть прямо в главной активности .
Она реализует SensorEventListener и в момент приближения (значение сенсора меньше максимального) включает таймер, проверяя после некоторой задержки, перекрыт ли до сих пор датчик. Это сделано для исключения ложных срабатываний.
Когда датчик снова не перекрыт, мы останавливаем распознавание, получая результат (см описание далее).

Запускаем распознование

Pocketsphinx предоставляет удобный API для конфигурирования и запуска процесса распознавания. Это классы SppechRecognizer и SpeechRecognizerSetup .
Вот как выглядит конфигурация и запуск распознавания:

PhonMapper phonMapper = new PhonMapper(getAssets().open("dict/ru/hotwords")); Grammar grammar = new Grammar(names, phonMapper); grammar.addWords(hotword); DataFiles dataFiles = new DataFiles(getPackageName(), "ru"); File hmmDir = new File(dataFiles.getHmm()); File dict = new File(dataFiles.getDict()); File jsgf = new File(dataFiles.getJsgf()); copyAssets(hmmDir); saveFile(jsgf, grammar.getJsgf()); saveFile(dict, grammar.getDict()); mRecognizer = SpeechRecognizerSetup.defaultSetup() .setAcousticModel(hmmDir) .setDictionary(dict) .setBoolean("-remove_noise", false) .setKeywordThreshold(1e-7f) .getRecognizer(); mRecognizer.addKeyphraseSearch(KWS_SEARCH, hotword); mRecognizer.addGrammarSearch(COMMAND_SEARCH, jsgf);

Здесь мы сперва копируем все необходимые файлы на диск (Pocketpshinx требует наличия на диске аккустической модели, грамматики и словаря с транскрипциями). Затем конфигурируется сам движок распознавания. Указываются пути к файлам модели и словаря, а также некоторые параметры (порог чувствительности для активационной фразы). Далее конфигурируется путь к файлу с грамматикой, а также активационная фраза.

Как видно из этого кода, один движок конфигурируется сразу и для грамматики, и для распознавания активационной фразы. Зачем так делается? Для того, чтобы мы могли быстро переключаться между тем, что в данный момент нужно распознавать. Вот как выглядит запуск процесса распознавания активационной фразы:

MRecognizer.startListening(KWS_SEARCH);
А вот так - распозанвание речи по заданной грамматике:

MRecognizer.startListening(COMMAND_SEARCH, 3000);
Второй аргумент (необязательный) - количество миллисекунд, после которого распознавание будет автоматически завершаться, если никто ничего не говорит.
Как видите, можно использовать только один движок для решения обеих задач.

Как получить результат распознавания

Чтобы получить результат распознавания, нужно также указать слушателя событий, имплементирующего интерфейс RecognitionListener .
У него есть несколько методов, которые вызываются pocketsphinx-ом при наступлении одного из событий:
  • onBeginningOfSpeech - движок услышал какой-то звук, может быть это речь (а может быть и нет)
  • onEndOfSpeech - звук закончился
  • onPartialResult - есть промежуточные результаты распознавания. Для активационной фразы это значит, что она сработала. Аргумент Hypothesis
  • onResult - конечный результат распознавания. Этот метод будет вызыван после вызова метода stop у SpeechRecognizer . Аргумент Hypothesis содержит данные о распознавании (строка и score)

Реализуя тем или иным способом методы onPartialResult и onResult, можно изменять логику распознавания и получать окончательный результат. Вот как это сделано в случае с нашим приложением:

@Override public void onEndOfSpeech() { Log.d(TAG, "onEndOfSpeech"); if (mRecognizer.getSearchName().equals(COMMAND_SEARCH)) { mRecognizer.stop(); } } @Override public void onPartialResult(Hypothesis hypothesis) { if (hypothesis == null) return; String text = hypothesis.getHypstr(); if (KWS_SEARCH.equals(mRecognizer.getSearchName())) { startRecognition(); } else { Log.d(TAG, text); } } @Override public void onResult(Hypothesis hypothesis) { mMicView.setBackgroundResource(R.drawable.background_big_mic); mHandler.removeCallbacks(mStopRecognitionCallback); String text = hypothesis != null ? hypothesis.getHypstr() : null; Log.d(TAG, "onResult " + text); if (COMMAND_SEARCH.equals(mRecognizer.getSearchName())) { if (text != null) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); process(text); } mRecognizer.startListening(KWS_SEARCH); } }

Когда мы получаем событие onEndOfSpeech, и если при этом мы распознаем команду для выполнения, то необходимо остановить распознавание, после чего сразу будет вызван onResult.
В onResult нужно проверить, что только что было распознано. Если это команда, то нужно запустить ее на выполнение и переключить движок на распознавание активационной фразы.
В onPartialResult нас интересует только распознавание активационной фразы. Если мы его обнаруживаем, то сразу запускаем процесс распознавания команды. Вот как он выглядит:

Private synchronized void startRecognition() { if (mRecognizer == null || COMMAND_SEARCH.equals(mRecognizer.getSearchName())) return; mRecognizer.cancel(); new ToneGenerator(AudioManager.STREAM_MUSIC, ToneGenerator.MAX_VOLUME).startTone(ToneGenerator.TONE_CDMA_PIP, 200); post(400, new Runnable() { @Override public void run() { mMicView.setBackgroundResource(R.drawable.background_big_mic_green); mRecognizer.startListening(COMMAND_SEARCH, 3000); Log.d(TAG, "Listen commands"); post(4000, mStopRecognitionCallback); } }); }
Здесь мы сперва играем небольшой сигнал для оповещения пользователя, что мы его услышали и готовы к его команде. На это время микрофон долже быть выключен. Поэтому мы запускаем распознавание после небольшого таймаута (чуть больше, чем длительность сигнала, чтобы не услышать его эха). Также запускается поток, который остановит распознавание принудительно, если пользователь говорит слишком долго. В данном случае это 3 секунды.

Как превратить распознанную строку в команды

Ну тут все уже специфично для конкретного приложения. В случае с нагим примером, мы просто вытаскиваем из строчки названия устройств, ищем по ним нужное устройство и либо меняем его состояние с помощью HTTP запроса на контроллер умного дома, либо сообщаем его текущее состояние (как в случае с термостатом). Эту логику можно увидеть в классе Controller .

Как синтезировать речь

Синтез речи - это операция, обратная распознаванию. Здесь наоборот - нужно превратить строку текста в речь, чтобы ее услышал пользователь.
В случае с термостатом мы должны заставить наше Android устройство произнести текущую температуру. С помощью API TextToSpeech это сделать довольно просто (спасибо гуглу за прекрасный женский TTS для русского языка):

Private void speak(String text) { synchronized (mSpeechQueue) { mRecognizer.stop(); mSpeechQueue.add(text); HashMap params = new HashMap(2); params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UUID.randomUUID().toString()); params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC)); params.put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, "true"); mTextToSpeech.speak(text, TextToSpeech.QUEUE_ADD, params); } }

Скажу наверное банальность, но перед процессом синтеза нужно обязательно отключить распознавание . На некоторых устройствах (например, все самсунги) вообще невозсожно одновременно и слушать микрофон, и что-то синтезировать.
Окончание синтеза речи (то есть окончание процесса говорения текста синтезатором) можно отследить в слушателе:

Private final TextToSpeech.OnUtteranceCompletedListener mUtteranceCompletedListener = new TextToSpeech.OnUtteranceCompletedListener() { @Override public void onUtteranceCompleted(String utteranceId) { synchronized (mSpeechQueue) { mSpeechQueue.poll(); if (mSpeechQueue.isEmpty()) { mRecognizer.startListening(KWS_SEARCH); } } } };

В нем мы просто проверяем, нет ли еще чего-то в очереди на синтез, и включаем распозанвание активационной фразы, если ничего больше нет.

И это все?

Да! Как видите, быстро и качественно распознать речь прямо на устройстве совсем несложно, благодаря наличию таких замечательных проектов, как Pocketsphinx. Он предоставляет очень удобный API, который можно использовать в решении задач, связанных с распознаванием голосовых команд.

В данном примере мы прикрутили распознавание к вполне кокрентной задаче - голосовому управлению устройствами умного дома . За счет локального распознавания мы добились очень высокой скорости работы и минимизировали ошибки.
Понятно, что тот же код можно использовать и для других задач, связанных с голосом. Это не обязательно должен быть именно умный дом. Добавить метки

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

Большинство ныне существующих программ для перевода голоса в текст имеют платный характер, предъявляя ряд требований к микрофону (в случае, когда программа предназначена для компьютера). Крайне не рекомендуется работать с микрофоном, встроенным в веб-камеру, а также размещённым в корпусе стандартного ноутбука (качество распознавания речи с таких устройств находится на довольно низком уровне). Кроме того, довольно важно иметь тихую окружающую обстановку, без лишних шумов, способных напрямую повлиять на уровень распознавания вашей речи.

При этом большинство таких программ способны не только трансформировать речь в текст на экране компьютера, но и использовать голосовые команды для управления вашим компьютером (запуск программ и их закрытие, приём и отправление электронной почты, открытие и закрытие сайтов и так далее).

Программа преобразования речи в текст

Перейдём к непосредственному описанию программ, способных помочь в переводе речи в текст.

Программа «Laitis»

Бесплатная русскоязычная программа для распознавания голоса «Laitis » обладает хорошим качеством понимания речи, и, по мнению её создателей, способна практически полностью заменить пользователю привычную клавиатуру. Программа хорошо работает и с голосовыми командами, позволяя с их помощью выполнять множество действий по управлению компьютером.

Для своей работы программа требует обязательного наличия на ПК скоростного интернета (в работе программы используются сетевые сервисы распознавания голоса от «Google» и «Yandex»). Возможности программы позволяют, также, управлять с помощью голосовых команд и вашим браузером, для чего необходима установка на веб-навигатор специального расширения от «Laitis» (Chrome, Mozilla, Opera).

«Dragon Professional» — расшифровка аудиозаписей в текст

На момент написания данного материала цифровой англоязычный продукт « Dragon Professional Individual » является одним из мировых лидеров по качеству распознаваемых текстов. Программа понимает семь языков (с русским пока работает лишь мобильное приложение «Dragon Anywhere» на и ), обладает высоким качеством распознавания голоса, умеет выполнять ряд голосовых команд. При этом данный продукт имеет исключительно платный характер (цена за основную программу составляет 300 долларов США, а за «домашнюю» версия продукта «Dragon Home » покупателю придётся выложить 75 американских долларов).

Для своей работы данный продукт от «Nuance Communications» требует создания своего профиля, который призван адаптировать возможности программы под специфику вашего голоса. Кроме непосредственной диктовки текста, вы можете обучить программу выполнять ряд команд, тем самым делая своё взаимодействие с компьютером ещё более конгруэнтным и удобным.

«RealSpeaker» — сверхточный распознаватель речи

Программа для трансформации голоса в текст «RealSpeaker » кроме стандартных для программ такого рода функций, позволяет задействовать возможности веб-камеры вашего ПК. Теперь программа не только считывает аудио составляющую звука, но и фиксирует движение уголков губ говорящего, тем самым более корректно распознавая выговариваемые им слова.


«RealSpeaker» считывает не только аудио, но и визуальную составляющую процесса речи

Приложение поддерживает более десяти языков (в том числе и русский), позволяет распознавать речь с учётом акцентов и диалектов, позволяет транскрибировать аудио и видео, даёт доступ к облаку и многое другое. Программа условно бесплатна, за платную версию придётся заплатить вполне реальные деньги.

«Voco» — программа быстро переведёт голос в текстовый документ

Ещё один преобразователь голоса в текст – это платный цифровой продукт «Voco », цена «домашней» версии которого ныне составляет около 1700 рублей. Более продвинутые и дорогие варианты данной программы – «Voco.Professional» и «Voco.Enterprise» имеют ряд дополнительных возможностей, одной из которых является распознавание речи из имеющихся у пользователя аудиозаписей.

Среди особенностей «Voco» отмечу возможность дополнения словарного запаса программы (ныне словарный запас программы включает более 85 тысяч слов), а также её автономную работу от сети, позволяющую не зависеть от вашего подключения к Интернету.


Среди плюсов «Voco» — высокая обучаемость программы

Приложение включается довольно просто — достаточно дважды нажать на клавишу «Ctrl».Приложение абсолютно бесплатно, поддерживает несколько десятков языков, среди которых и русский.

Заключение

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

Почтовые программы для компьютера позволяют более гибко пользоваться электронной корреспонденцией. Фильтры, правила, ярлыки и многое другое, а главное – доступ оффлайн, к тому, что было загружено ранее.

1. Mozilla Thunderbird

Проверенный временем многофункциональный инструмент от компании Mozilla.

Поддержка любого количества аккаунтов

Расширяемость за счет плагинов

Ограниченные возможности календаря

Как и браузер Firefox, почтовый клиент от Mozilla работает со сторонними плагинами, что позволяет существенно расширить возможности приложения. Помимо чтения и отправки писем, Thunderbird даже без плагинов позволяет читать RSS каналы.

Настройка почты довольна проста. В большинстве случаев вам достаточно вспомнить адрес электронной почты и пароль. Всё остальное программа настроит сама.

Бесплатный онлайн-курс "Удобный Gmail" Серия наглядных видео инструкций заметно упростит и ускорит повседневную работу с электронной почтой. Научившись раз, пользуйтесь каждый день!

2. eM Client

Главный конкурент Thunderbird на рынке бесплатных почтовых клиентов. Основной плюс – простая миграция с других почтовых программ и умный переводчик.

Инструменты миграции

Встроенный чат

Продуманный дизайн

Поддерживает только два аккаунта

История eM Client насчитывает уже 10 лет, и многие считает, что это лучший почтовый клиент для Windows.

eM Client позволяет легко и быстро перенести свои сообщения с Gmail, Exchange, iCloud и Outlook.com, имеет встроенный поиск, календарь и адресную книгу. Встроенный чат поддерживает работу со сторонними мессенджерами, вроде Jabber или Google Chat.

Из дополнительных возможностей – встроенный переводчик, отложенная отправка сообщений и шифрование. Если у вас всего два почтовых аккаунта, то eM Client – отличный выбор.

3. Mailbird Lite

Симпатичный email-клиент с широкими социальными возможностями

Интеграция социальных сервисов

Очень простая установка

Поддерживает только один аккаунт

Mailbird Lite – это не просто почтовый клиент. Это целая платформа для коммуникаций. Она позволяет расширять возможности приложения для ведения расписаний, чатов, синхронизации файлов и командной работы.

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

При настройке не нужно заморачиваться с адресами почтовых сервисов, достаточно помнить логин и пароль от своего ящика. К почте можно добавить свой Facebook аккаунт, WhatsApp, Календарь Google, бесплатный менеджер задач Moo.do и приложение Asana для тимворкинга.

4. Claws Mail

Минималистичный и интуитивно понятный клиент.

Скорость работы

Интуитивный дизайн

Простота настройки

Небольшой набор плагинов

Минимальное требование к ресурсам позволяет использовать почтовый клиент Claws Mail даже на старых компьютерах. Работать он будет всё равно быстро.

Приложение позволяет импортировать свои настройки из других клиентов, вроде MS Outlook или Thunderbird. Поэтому если один из них вас не устраивает, переехать на более простое решение будет недолго.

Благодаря плагинам можно дополнительно установить календарь, подписку на RSS и кое-что еще.

5. Opera Mail

Open Source проект от команды, занимающейся браузером Opera.

Любое количество аккаунтов

Настраиваемая система тегов

Непростая настройка

Данное решение позволяет создавать шаблонные письма, что особенно актуально для бизнеса. Удобные фильтры сообщений и сортировка. Обилие ручных настроек.

Есть возможность для чтения RSS лент, что избавляет от необходимости использовать для этих целей браузер.