Смекни!
smekni.com

Разработка алгоритмов чтения данных с экрана (стр. 2 из 2)

ЦИКЛ (“Читать очередной символ с экрана в буфер”) *

* “Преобразовать содержимое буфера в новый формат” * “Произнести строку”;

‘Клавиша ENTER’ ® Переместить курсор на первую строку словарной статьи” *

* ПОКА НЕ ‘Прочитаны все символы’

ЦИКЛ (“Читать очередной символ с экрана в буфер”) *

* “Преобразовать содержимое буфера в новый формат” * “Произнести строку” *

* ПОКА НЕ ‘Нажата клавиша ESC’

ЦИКЛ (“Ждать нажатия клавиши” *

Выбор (

‘Клавиша ­’ ® “Получить координаты курсора” *

* ПОКА НЕ ‘Прочитаны все символы’

ЦИКЛ (“Читать очередной символ с экрана в буфер”) *

* “Преобразовать содержимое буфера в новый формат” * “Произнести строку”;

‘Клавиша ¯’ ® “Получить координаты курсора” *

* ПОКА НЕ ‘Прочитаны все символы’

ЦИКЛ (“Читать очередной символ с экрана в буфер”) *

* “Преобразовать содержимое буфера в новый формат” * “Произнести строку”;

‘Клавиша ENTER’ ® Переместить курсор на первую строку словарной статьи” *

* ПОКА НЕ ‘Прочитаны все символы’

ЦИКЛ (“Читать символ с экрана в буфер”) *

* “Преобразовать содержимое буфера в новый формат” * “Произнести строку” *

* ПОКА НЕ ‘Нажата клавиша ESC’

ЦИКЛ (“Ждать нажатия клавиши” *

* Выбор (

‘Клавиша ­’ ® “Получить координаты курсора” *

* ПОКА НЕ ‘Прочитаны все символы’

ЦИКЛ (“Читать очередной символ с экрана в буфер”) *

* “Преобразовать содержимое буфера в новый формат” * “Произнести строку”;

‘Клавиша ¯’ ® “Получить координаты курсора” *

* ПОКА НЕ ‘Прочитаны все символы’

ЦИКЛ (“Читать очередной символ с экрана в буфер”) *

* “Преобразовать содержимое буфера в новый формат” * “Произнести

строку”; ))))));

Глава 3

Реализация и апробация программы

Результаты экспериментов

Программа-ридер была одновременно реализована на двух языках программирования – языке Pascal и языке Ассемблера. Такое решение обосновано тем, что реализация программы-ридера на языке Pascal не требует больших усилий в силу его гибкости. Кроме того, легкость программирования на этом языке существенно облегчит дальнейшее изменение алгоритма чтения данных с экрана для адаптации программы-ридера к работе в новой среде. С другой стороны, язык Ассемблера как никакой другой язык подходит для решения системных задач, что актуально при создании резидентных программ, работающих с прерываниями и с учетом соглашений операционной среды. Теоретически, язык Ассемблера при грамотной реализации программы поможет избежать проблем, которые могут иметь место при написании подобных программ с использованием языков высокого уровня.

На этапе разработки программы было проведено множество экспериментов и других действий, направленных на выяснение внутренних принципов работы программы-словаря и способов интеграции резидентной программы-ридера непосредственно со словарями. Установлено, что программа-словарь состоит из двух резидентных программ. Первая программа полностью написана на языке Ассемблера. Перехватив нажатия горячих клавиш, вызывающих словари, программа активизировала вторую резидентную программу, которая управляла просмотром статей в словарях. Вторая программа комплекса была написана на языке Pascal. Такое замысловатое взаимодействие несколько затруднило на первых этапах реализацию программы-ридера. После многочисленных попыток и проб было принято решение написать резидентную программу-ридер, алгоритм и принцип функционирования которой описан выше. Было также выяснено, что лишь определенный порядок загрузки программ (программы-словаря, программы синтеза речи, резидентной программы-ридера) обеспечивает должное функционирование комплекса программ в целом.

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

Еще одна проблема, которая возникла в процессе реализации screen-reader’a – это неспособность использованного синтезатора речи на приемлемом уровне качества воспроизводить текст на английском языке. Такая проблема решаема только за счет применения альтернативного синтезатора речи, который предоставляет такие возможности. Можно использовать два независимых синтезатора речи, один для произношение слов на русском языке, другой синтезатор – для произношения речи на английском языке. Однако такой подход накладывает новые ограничения на ресурсы компьютера.

Заключение

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

Приложение 1.

Листинг исходного текста программы-ридера

{$M $800,0,0}

program test;

uses Crt, Dos;

var

Reg,OldReg,load : registers;

flag:boolean;

OldInt09:pointer;

Old09 : procedure;

KurX,KurY: integer;

OldX,OldY: integer;

aaa:array[1..2] of word absolute OldInt09;

S: string[80];

q : string;

x0,y0 ,

x1,y1 ,

x2,y2,j : integer;

var fl1:byte;

type

TScr = array[1..25*80, 1..2] of char;

TaScr = ^TScr;

var

Scr0 : TASCR;

var

SlovYes : boolean;

SlInByte : byte;

SlX,SlY,SlX0,SlY0 : integer;

Sl0Key : boolean;

procedure SText (Sent00 : string

var REG : registers;

L : integer;

begin

Sent00 := copy (Sent00, 1, 250);

REG.es:=Seg(Sent00);

REG.SI := Ofs(Sent00) +1;

L:=length(Sent00) +1;

REG.CX:=L;

Sent00 [Reg.CX]:=',';

reg.AX:=256;

Intr($80,REG);

end;

procedure New09; interrupt;

var i,l,r:integer;

begin

SlInByte:=0;

if Port[$60] >= $80

then begin

SlInByte:=Port[$60]-$80;

if (SlInByte=28)

then begin

sl0key:=true;

end

end;

if (SlInByte in [63,72,80]) and (SCR0^[410,1]='Й')

then

begin

if Sl0key

then

begin

SlX:=11{SlX0}; SlY:=7{SlY0};

gotoxy(slx,sly);

sl0key:=false;

end

else

begin

SlX:=WhereX;

SlY:=WhereY;

end;

l:=80*(sly-1)+SlX;

r:=l;

if (sly>0) and (sly<20)

then

begin

while (l > 80*(sly-1) ) and not(SCR0^[l,1] in ['°'..'Я']) do dec(l);

while (r < 80*sly) and not(SCR0^[r,1] in ['°'..'Я']) do inc(r);

dec(r);

while (r<l) and (SCR0^[r,1]=' ') do dec(r);

s:='';

for i:=l+1 to r

do s:=s+SCR0^[i,1];

stext(s);

SlX0:=SlX; SlY0:=SlY;

end;

end;

old09;

end;

begin (*************************)

GetIntVec($9,@Old09);

SetIntVec($9,Addr(New09));

SCR0:=ptr($b800,$0000);

KEEP(0);

end.