Словарь для Android
Идея
Купил себе HTC Legend. Читал статьи на английском. Но так как знаю его не очень хорошо, то понадобился словарик. Желательно с произношением слов (что бы слова лучше запоминались) и с возможность выделить часто употребляемые слова (что бы не изучать все слова, а только самые распростанённые). Такого не нашёл (может плохо искал) и решил написать свой. Плюс изучаю программирование под Android, так что написание своей программы было для меня ещё плюсом в изучении языка.Структура программы
Программа состоит из 2-х частей:1. Сама программа для Android. Она показывает слова, производит поиск слов по словарю, произносит слова.
2. Вспомогательные программы для создания словарей. Анализирует текст с выделением часто употребляемых слов, скачивает с google translater перевод слова, заполняет базу.
Программа для Android
Расскажу про общую структуру.В программе есть 4 окна:
1. Со списком слов.
2. С настройками фильтрации по частоте употребления и количеству слов. В дальнейшем это окно уберу за ненадобностью.
3. С выбором БД для словаря.
4. С выводом подробной информации о слове.
Детально код описывать не буду. Расскажу только про проблемы, которые возникли при воспроизведении 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 комментариев