Словарь для Android

Идея

Купил себе HTC Legend. Читал статьи на английском. Но так как знаю его не очень хорошо, то понадобился словарик. Желательно с произношением слов (что бы слова лучше запоминались) и с возможность выделить часто употребляемые слова (что бы не изучать все слова, а только самые распростанённые). Такого не нашёл (может плохо искал) и решил написать свой. Плюс изучаю программирование под Android, так что написание своей программы было для меня ещё плюсом в изучении языка.

Структура программы

Программа состоит из 2-х частей:
1. Сама программа для Android. Она показывает слова, производит поиск слов по словарю, произносит слова.
2. Вспомогательные программы для создания словарей. Анализирует текст с выделением часто употребляемых слов, скачивает с google translater перевод слова, заполняет базу.
image

Программа для Android

Расскажу про общую структуру.

В программе есть 4 окна:
1. Со списком слов.
image

2. С настройками фильтрации по частоте употребления и количеству слов. В дальнейшем это окно уберу за ненадобностью.
image

3. С выбором БД для словаря.
image

4. С выводом подробной информации о слове.
image

Детально код описывать не буду. Расскажу только про проблемы, которые возникли при воспроизведении mp3 из массива байт. Забыл добавить, что звук у меня хранится в самой БД, т.е. приложение не требует подключения к сети. Это сделано для того, что бы экономить трафик и для того что бы можно было брать звук не только из google translator, но и из других источников.

Android не позволяет воспроизводить mp3 из массива байт, только из сети или из файла. Только wav формат можно воспроизвести из массива байт. Есть 3 решения проблемы — сохранять mp3 во временную папку, преобразовывать в wav или воспроизводить со своего аудио сервера. Первый способ не подходит из за того, что создаётся много временных файлов. Второй способ не понравился из за того, что, во-первых, пришлось бы конвертировать множество mp3 (~2500) и во-вторых это привело бы к увеличению их размера.

Поэтому был написан простой сервер, который отдавал поток mp3 по запросу:

public class AudioServer extends Thread {

private DataBaseHelper myDbHelper;

public AudioServer(DataBaseHelper myDbHelper) {
 this.myDbHelper = myDbHelper;
 }

public void run() {
 ServerSocket ss;
 try {
 ss = new ServerSocket(6129);
 } catch (IOException e1) {
 Log.e("AudioServer", "CreateServer " + e1.getMessage());
 return;
 }
 while (true) {
 Socket theConnection;
 try {
 theConnection = ss.accept();
 } catch (IOException e1) {
 Log.e("AudioServer", "CreateConnection " + e1.getMessage());
 return;
 }
 String method;

try {
 PrintStream os = new PrintStream(theConnection.getOutputStream());
 DataInputStream is = new DataInputStream(theConnection.getInputStream());
 String get = is.readLine();
 StringTokenizer st = new StringTokenizer(get);
 method = st.nextToken();

if (method.equals("GET")) {
 String word = st.nextToken().replace("/", "");

while ((get = is.readLine()) != null) {
 if (get.trim().equals(""))
 break;
 }
 Log.i("AudioServer", "Word " + word);
 byte[] audio = myDbHelper.getAudio(word);
 if (audio != null)
 Log.i("AudioServer", "LenghtAudio " + audio.length);
 else
 Log.i("AudioServer", "Audio data not fouded");

os.print("HTTP/1.0 200 OK\r\n");
 Date now = new Date();
 os.print("Date: " + now + "\r\n");
 os.print("Server: english_server\r\n");
 if (audio != null)
 os.print("Content-length: " + audio.length + "\r\n");
 else
 os.print("Content-length: 0\r\n");
 os.print("Content-type: audio/x-mp3\r\n\r\n");

// send the file
 if (audio != null)
 os.write(audio);
 os.close();
 }
 } catch (IOException e) {
 Log.e("AudioServer", "SendData " + e.getMessage());
 }

try {
 theConnection.close();
 } catch (IOException e) {
 Log.e("AudioServer", "ConnectionClose " + e.getMessage());
 }
 }
 }

}


Заключение

Программа работает, но есть несколько ошибок и нелогичностей в поведении, которые нужно исправить.
Скачать можно в code.google.com/p/android-voice-dictionary/
По ссылке apk и два словаря. Один с произношением, но в нём 2500 слов. Во втором слов больше, но произношения нет.


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.