Universidade Técnica de Lisboa
Instituto Superior Técnico
Agente
Interface
Perfil
Utilizador
Teclado Ecrã
ou Standard
Controlador
Sistema
Sintetizador
Fala
Processador
Texto
Preditor
Palavras
Léxico
Utilizador
Interlocutor
Concepção, Implementação e Teste de um Sistema de Apoio à
Comunicação Aumentativa e Alternativa para o Português Europeu
Luis Filipe Nobre Horta Baptista Garcia
(Licenciado)
Dissertação para a obtenção do Grau de Mestre em
Engenharia Electrotécnica e de Computadores
Orientador: Doutor Luís Miguel Veiga Vaz Caldas de Oliveira
Presidente: Doutora Isabel Maria Martins Trancoso
Vogais: Doutor Nuno Manuel de Carvalho Ferreira Guimarães
Doutor Luís Miguel Veiga Vaz Caldas de Oliveira
Doutor Joaquim Armando Pires Jorge
Lisboa
Março de 2003
Universidade Técnica de Lisboa
Instituto Superior Técnico
Agente
Interface
Perfil
Utilizador
Teclado Ecrã
ou Standard
Controlador
Sistema
Sintetizador
Fala
Processador
Texto
Preditor
Palavras
Léxico
Utilizador
Interlocutor
Concepção, Implementação e Teste de um Sistema de Apoio à
Comunicação Aumentativa e Alternativa para o Português Europeu
Luis Filipe Nobre Horta Baptista Garcia
(Licenciado)
Dissertação para a obtenção do Grau de Mestre em
Engenharia Electrotécnica e de Computadores
Orientador: Doutor Luís Miguel Veiga Vaz Caldas de Oliveira
Presidente: Doutora Isabel Maria Martins Trancoso
Vogais: Doutor Nuno Manuel de Carvalho Ferreira Guimarães
Doutor Luís Miguel Veiga Vaz Caldas de Oliveira
Doutor Joaquim Armando Pires Jorge
Lisboa
Março de 2003
Para os meus pais e avós,
os principais autores deste trabalho ...
Agradecimentos
Quero agradecer ao meu orientador, Professor Luís Caldas, pelos conhecimentos, disponibilidade,
confiança e entusiasmo que me transmitiu ao longo do desenvolvimento desta tese. Também quero
agradecer à Professora Isabel Trancoso a oportunidade, apoio e incentivo que manifestou relativamente à realização de um trabalho na área da comunicação alternativa.
Quero também agradecer ao Eng.º Luís Azevedo por me ter ajudado a dar os primeiros passos na área
das tecnologias de apoio. As trocas de ideias e bibliografia que me facultou foram imprescindíveis
para a realização desta tese.
Quero ainda agradecer ao Secretariado Nacional de Reabilitação e Integração de Pessoas com Deficiência (SNRIPD) que através do programa CITEIV possibilitou a aquisição do material necessário
para a realização desta tese.
Também estou extremamente grato à minha escola, a Escola Superior de Tecnologia e Gestão de Beja
(ESTIG), aos seus funcionários, docentes, e em particular ao Conselho Directivo e Área Departamental de Engenharia pelo apoio que sempre manifestaram em relação ao meu trabalho.
Quero também agradecer ao Centro de Paralisia Cerebral de Beja (CPCB), aos seus funcionários e
técnicos pelos conhecimentos transmitidos e apoio ao desenvolvimento desta tese. Também quero
agradecer aos pais, crianças, jovens e adultos que frequentam o CPCB pela motivação e confiança que
sempre manifestaram para comigo.
Finalmente quero agradecer aos meus pais, avós e amigos pelo constante apoio e compreensão. Um
agradecimento muito especial ao João e à Telma, com quem aproveitei ao máximo os poucos momentos de descanso.
i
ii
Resumo
Nesta tese descreve-se o desenvolvimento de um Sistema de Apoio à Comunicação Aumentativa e
Alternativa para o Português Europeu. Através deste sistema pretendemos apoiar pessoas com dificuldades de comunicação quer ao nível da escrita quer ao nível da fala.
Numa primeira parte da tese são apresentados e caracterizados os vários tipos de sistemas de comunicação aumentativa e alternativa, nomeadamente os sistemas baseados em símbolos gráficos e os sistemas baseados em símbolos do alfabeto. Em seguida é apresentado o sistema proposto e os seus componentes principais.
O sistema desenvolvido funciona no ambiente Ms Windows e apoia a escrita de mensagens em qualquer aplicação deste sistema operativo. O utilizador pode escolher a aplicação mais adequada às suas
necessidades de comunicação. Para tal foram desenvolvidas técnicas que possibilitam a interacção do
nosso sistema com qualquer outra aplicação.
As taxas de comunicação permitidas por estas formas alternativas são geralmente menores que as proporcionadas através dos métodos naturais. Outras dificuldades de ordem motora ou cognitiva também
influenciam negativamente esta taxa. Por isso o nosso sistema dispõe de duas técnicas que possibilitam a aceleração da escrita, a predição de palavras e a expansão de abreviaturas. A predição de palavras também foi desenvolvida para ser aplicada à aprendizagem da leitura e da escrita. O mecanismo
de predição de palavras incorporado no sistema utiliza fundamentalmente informação estatística sobre
a Língua Portuguesa. Para um apoio mais eficaz, o sistema adapta ao longo do tempo esta informação
estatística ao estilo de escrita do utilizador. Também é possível especificar a importância de cada factor presente no processo de predição de palavras.
Para pessoas incapacitadas de utilizar um teclado de computador o sistema dispõe de um teclado de
ecrã. Este componente apresenta uma matriz contendo os vários caracteres disponíveis para a composição de mensagens. A selecção destes elementos pode ser efectuada através de métodos de acesso
directo que utilizam por exemplo um dispositivo de ponteiro, ou métodos de acesso indirecto que recorrem apenas a um ou dois interruptores. Para o reforço da interacção com o utilizador foi incorporado no sistema um agente de interface e um sintetizador de fala. Os vários componentes da interface do
sistema podem ser adaptados às necessidades particulares de cada pessoa.
Foram ainda desenvolvidos alguns testes com o sistema. Estes testes foram realizados de uma forma
qualitativa com utilizadores reais e de uma forma quantitativa com um simulador introduzido no nosso
sistema. Nos testes com o simulador obtivemos com determinadas configurações do sistema taxas de
poupança de caracteres de 51%.
iii
Abstract
In this thesis an Augmentative and Alternative Communication Assistive System for European Portuguese was developed. Through this system, we intend to assist people with communication disabilities.
First we present the different types of augmentative and alternative communication systems, namely
the graphic-based systems and the alphabet-based systems.
The system we developed works on top of the Windows system and it can be used with any application of this operating system. The user can choose the application that best matches his communication
needs. Special techniques were developed to support the interaction between our system and other
applications.
The communication rate allowed by these alternative forms is low when compared with the rate supported by natural means. Other difficulties, such as motor or cognitive disabilities, will also make this
rate lower. In order to help these people, our system offers two rate enhancement techniques, word
prediction and abbreviation expansion. Word prediction was also developed to help teaching reading
and writing skills. Word prediction uses mainly Portuguese statistical information. For a better support, our system dynamically adjusts this statistical information to the user’s own way of writing. It is
also possible to specify the importance of each factor present in the word prediction process.
People with difficulties using a computer keyboard can use our system’s on-screen keyboard. This
component presents a matrix with the available characters for message composition. Each of these
items can be selected with direct access methods that use for instance a pointer device or indirect access methods that are controlled by one or two switches. With the aim of reinforcing the user’s interaction, our system includes an interface agent and a speech synthesizer. Each component of the system
can be configured to the specific needs of each user.
We also developed some tests with the system. These tests were carried out qualitatively with real
users and quantitatively with a simulator included in our system. These tests showed that our system
can save up to 51% of user typing effort.
iv
Palavras Chave
Sistemas de Comunicação Aumentativa e Alternativa
Acesso ao Computador
Aceleração da Taxa de Comunicação
Predição de Palavras
Expansão de Abreviaturas
Teclado de Ecrã
v
Key Words
Augmentative and Alternative Communication Systems
Computer Access
Communication Rate Enhacement
Word Prediction
Abbreviation Expansion
On-Screen Keyboard
vi
Índice
1. Introdução_____________________________________________________________________________ 1
1.1
Sistemas de Comunicação Aumentativa e Alternativa ___________________________________ 1
1.2
Objectivos _______________________________________________________________________ 3
1.3
Organização _____________________________________________________________________ 3
2. A Comunicação Alternativa _______________________________________________________________ 5
2.1
A Comunicação Humana___________________________________________________________ 5
2.2
A Pessoa com Dificuldades de Comunicação___________________________________________ 6
2.3
Sistemas de Comunicação Aumentativa e Alternativa ___________________________________ 7
2.4
Sistemas de Símbolos para a Comunicação Aumentativa Alternativa ______________________ 9
2.4.1
Sistemas de Comunicação por Objectos e por Imagens________________________________ 10
2.4.2
Sistemas de Comunicação por Símbolos Gráficos____________________________________ 10
2.4.3
Sistemas de Comunicação por Símbolos do Alfabeto _________________________________ 12
2.4.4
Sistemas de Comunicação por Linguagens Codificadas _______________________________ 12
2.5
Sistemas de Apoio à Comunicação Aumentativa e Alternativa ___________________________ 13
2.5.1
A Estrutura de um Sistema de Apoio à Comunicação Aumentativa e Alternativa ___________ 14
2.5.2
Conjunto de Selecção, Métodos de Selecção e Dispositivos de Controlo __________________ 16
2.5.3
Edição da Mensagem __________________________________________________________ 18
2.5.4
Aceleração da Escrita e Expansão de Vocabulário ___________________________________ 19
2.6
Sistemas de Apoio à Comunicação Aumentativa e Alternativa com Símbolos Gráficos _______ 21
2.7
Sistemas de Apoio à Comunicação Aumentativa e Alternativa com Símbolos do Alfabeto ____ 23
2.7.1
Estratégias para a Predição de Palavras ____________________________________________ 24
2.7.2
Léxicos_____________________________________________________________________ 26
2.7.3
Problemas dos Sistemas de Predição de Palavras ____________________________________ 27
2.7.4
Estratégias para a Expansão de Abreviaturas________________________________________ 29
2.8
Comparação entre os vários Sistemas de Apoio à Comunicação Aumentativa e Alternativa___ 30
3. Predição de Palavras____________________________________________________________________ 33
3.1
Algoritmo de Predição ____________________________________________________________ 34
3.1.1
Restrição das Palavras do Léxico_________________________________________________ 35
3.1.2
Classificação das Palavras Candidatas_____________________________________________ 37
3.2
Léxico _________________________________________________________________________ 41
3.3
Implementação __________________________________________________________________ 46
3.3.1
Armazenamento do Léxico _____________________________________________________ 46
3.3.2
Complexidade das Operações sobre o Léxico _______________________________________ 49
3.3.3
Implementação do Algoritmo de Predição__________________________________________ 52
3.3.4
Incorporação da Predição de Palavras no Sistema ____________________________________ 53
3.4
Expansão de Abreviaturas ________________________________________________________ 54
4. Interacção com a Aplicação Externa _______________________________________________________ 57
4.1
Interacção com uma Aplicação Externa através de uma Interface de Programação _________ 60
4.1.1
O Component Object Model ____________________________________________________ 60
4.1.2
O OLE Automation ___________________________________________________________ 63
4.1.3
O Microsoft Active Accessibility_________________________________________________ 65
4.2
Interacção com uma Aplicação Externa através da Interface do Utilizador ________________ 67
4.3
Implementação __________________________________________________________________ 70
4.3.1
Interacção com o Processador de Texto Microsoft Word ______________________________ 74
4.3.2
Interacção com um Processador de Texto Genérico __________________________________ 82
vii
5. Interacção com o Utilizador ______________________________________________________________ 89
5.1
A Interface do Utilizador__________________________________________________________ 91
5.2
Implementação do Teclado de Ecrã _________________________________________________ 93
5.2.1
Estrutura do Teclado de Ecrã ____________________________________________________ 94
5.2.2
Disposições de Teclado ________________________________________________________ 97
5.2.3
Adaptação do Teclado de Ecrã às Capacidades do Utilizador __________________________ 101
5.2.4
Selecção Directa com Dispositivo de Ponteiro _____________________________________ 103
5.2.5
Selecção Indirecta com Varrimento ______________________________________________ 107
5.3
Incorporação de um Sintetizador de Fala ___________________________________________ 112
5.4
Incorporação de um Agente de Interface____________________________________________ 115
6. Arquitectura do Sistema ________________________________________________________________ 119
6.1
Componentes do Sistema_________________________________________________________ 119
6.2
A Plataforma MFC de Suporte aos Componentes do Sistema___________________________ 122
6.3
Inicialização do Sistema _________________________________________________________ 125
6.4
Interacção entre os Componentes do Sistema ________________________________________ 127
7. Testes, Conclusões e Trabalho Futuro_____________________________________________________ 131
7.1
Testes Qualitativos do Sistema ____________________________________________________ 131
7.2
Testes Quantitativos do Sistema ___________________________________________________ 132
7.3
Conclusões e Trabalho Futuro ____________________________________________________ 138
Bibliografia ____________________________________________________________________________ 141
Apêndices _____________________________________________________________________________ 145
Apêndice A - Caracteres Existentes no Corpus______________________________________________ 147
Apêndice B - Script para a determinação do número de ocorrências de cada palavra no Corpus ___ 151
Apêndice C - Script para a determinação do número de ocorrências de cada bigrama de palavras no
Corpus______________________________________________________________________________ 153
Apêndice D - Script para a determinação do número de ocorrências de cada classe gramatical no
Corpus______________________________________________________________________________ 155
Apêndice E - Script para a determinação do número de ocorrências de cada par de classes gramaticais
no Corpus ___________________________________________________________________________ 157
Apêndice F - Lista com o número de palavras iniciadas por cada caracter ______________________ 159
Apêndice G - Lista das vinte palavras com maior número de palavras seguintes _________________ 161
Apêndice H - Questionários sobre o Preditor de Palavras ____________________________________ 163
Apêndice I - Manual do Eugénio. ________________________________________________________ 177
Anexos ________________________________________________________________________________ 203
Anexo A - Grelhas desenvolvidas no Centro de Paralisia Cerebral de Beja para o registo dos dados
obtidos no Processo de Aconselhamento de uma Tecnologia de Apoio. _________________________ 205
viii
Lista de Figuras
Figura 2-1 - O modelo simples para a comunicação humana. _______________________________________ 6
Figura 2-2 – SCAA com Ajuda que possibilita a conversação com o recurso ao olhar.____________________ 8
Figura 2-3 - SCAA com Ajuda electrónico. ______________________________________________________ 9
Figura 2-4 – Os símbolos que representam, respectivamente da esquerda para a direita, a palavra mãe nos
sistemas PIC, SPC e Bliss.__________________________________________________________________ 11
Figura 2-5 - O SACAA Dedicado Dubby destina-se essencialmente à conversação. _____________________ 13
Figura 2-6 - O SACAA Baseado em Computador Ezkeys.__________________________________________ 14
Figura 2-7 - Estrutura de um SACAA baseada em três elementos: Interface do Utilizador, Processador e Saída
do Sistema.______________________________________________________________________________ 15
Figura 2-8 - O mecanismo de varrimento. _____________________________________________________ 16
Figura 2-9 - Criança a utilizar o mecanismo de varrimento. _______________________________________ 16
Figura 2-10 - Manípulo com uma superfície de contacto larga. _____________________________________ 17
Figura 2-11 - Manípulo activado através do puxar de uma corda.___________________________________ 18
Figura 2-12 - PathFinder com o sistema de símbolos Unity 128. ____________________________________ 22
Figura 2-13 - Ferramenta do Comspec para a integração de componentes. ___________________________ 31
Figura 3-1 - Esquema genérico para um Preditor de Palavras. _____________________________________ 34
Figura 3-2 - Duas situações diferentes para o texto do utilizador. ___________________________________ 34
Figura 3-3 - As várias etapas do processo de predição de palavras__________________________________ 35
Figura 3-4 – Caixa de diálogo para configuração dos factores de restrição com objectivos educativos (em cima)
e os coeficientes dos factores de predição (em baixo). ____________________________________________ 36
Figura 3-5 - Estrutura de dados utilizada para o armazenamento do Léxico. __________________________ 47
Figura 3-6 - Interacção entre os vários objectos do sistema para a realização de uma Predição de Palavras. 54
Figura 3-7 - Caixa de diálogo para a definição das abreviaturas do utilizador. ________________________ 55
Figura 4-1 SACAA com composição de mensagens interna.________________________________________ 57
Figura 4-2 - SACAA com composição de mensagens externa. ______________________________________ 58
Figura 4-3 - SACAA com composição de mensagens mista. ________________________________________ 58
Figura 4-4 - Estrutura de uma Interface. ______________________________________________________ 61
Figura 4-5 - Manutenção de uma cópia do texto que o utilizador está a introduzir numa aplicação. ________ 69
Figura 4-6 – Mecanismo que possibilita a interacção do SACAA com qualquer processador de texto do sistema
e em especial com o Ms Word._______________________________________________________________ 72
Figura 4-7 - Sinalização do evento WM_TECLA_PRESSIONADA e acesso ao WOM através do OLE
Automation. _____________________________________________________________________________ 79
Figura 4-8 - Objecto CMicrosoftWord a enviar a mensagem WM_TECLA_PRESSIONADA ao objecto
Controlador do Sistema. ___________________________________________________________________ 82
Figura 4-9 - Funcionalidade que permite a colocação automática da lista das palavras preditas junto ao cursor
de texto. ________________________________________________________________________________ 87
Figura 4-10 - Funcionalidade que permite a colocação de uma previsão do que irá ser escrito junto ao cursor
de texto. ________________________________________________________________________________ 88
ix
Figura 5-1 - Utilizador a interagir com um SACAA.______________________________________________ 89
Figura 5-2 - Caixa de diálogo para a configuração das opções principais do sistema. ___________________ 91
Figura 5-3 - O teclado Intellikeys ____________________________________________________________ 93
Figura 5-4 - Estrutura do Teclado de Ecrã. ____________________________________________________ 94
Figura 5-5 - Matriz de Varrimento Linha-Coluna com a indicação da quantidade de passos necessários à
selecção de cada item. Em (1) são percorridas as várias linhas; em (2) os elementos da linha seleccionada. _ 99
Figura 5-6 - A disposição de teclas EaoisrVarrimentoSimples. _____________________________________ 99
Figura 5-7 - A disposição de teclas EaoisrVarrimentoDivisãoSimples. ______________________________ 100
Figura 5-8 - Teclado de Ecrã a executar o mecanismo de varrimento sobre os dois grupos da quinta linha. Em
(1) são percorridas as várias linhas; em (2) os grupos da linha seleccionada; em (3) os elementos do grupo
seleccionado. ___________________________________________________________________________ 102
Figura 5-9 - Interacção entre os objectos CProcessadorTexto, Controlador do Sistema e CTecladoEcra durante
o mecanismo de varrimento. _______________________________________________________________ 107
Figura 5-10 –Adaptação ao rato que permite a substituição dos botões esquerdo e direito por dois interruptores
externos._______________________________________________________________________________ 108
Figura 5-11 - O Agente de Interface a fazer magia para completar uma palavra. ______________________ 116
Figura 6-1 – Os objectos principais do sistema. ________________________________________________ 120
Figura 6-2 - Mensagens enviadas ao Controlador do Sistema que assinalam a ocorrência de eventos em
componentes do sistema. __________________________________________________________________ 121
Figura 6-3 - A incorporação dos objectos do sistema no modelo Documento-Vista da MFC. _____________ 122
Figura 6-4 - Caixa de diálogo para a aceitação do Perfil de Utilizador. _____________________________ 124
Figura 6-5 - Um conteúdo possível para o ficheiro de configuração do sistema. _______________________ 125
Figura 6-6 - Caixa de diálogo que permite a configuração das opções principais do sistema. ____________ 126
Figura 6-7 - Caixa de diálogo para a configuração das opções avançadas da predição. ________________ 127
Figura 6-8 - Envio da mensagem WM_TECLA_PRESSIONADA ao objecto CVistaSACAA. ______________ 128
Figura 7-1 - Caixa de diálogo do Simulador de Predição de Palavras. ______________________________ 133
Figura 7-2 - Percentagem de caracteres poupados ao longo do conjunto de simulações onde cada factor foi
introduzido de forma abrupta (100%). _______________________________________________________ 135
Figura 7-3 - Média dos caracteres necessários para a predição ao longo do conjunto de simulações onde cada
factor foi introduzido de forma abrupta (100%).________________________________________________ 135
Figura 7-4 - Percentagens de predições com sucesso ao longo do conjunto de simulações onde cada factor foi
introduzido de forma abrupta (100%). _______________________________________________________ 136
Figura 7-5 - Percentagem de caracteres poupados ao longo de simulações nas quais cada factor de predição foi
introduzido gradualmente (0%-100%). _______________________________________________________ 136
Figura 7-6 - Percentagem de caracteres poupados utilizando uma lista de 5 e 10 palavras utilizando o conjunto
de factores FP5._________________________________________________________________________ 137
Figura 7-7 - Percentagem de predições com sucesso utilizando uma lista de 5 e 10 palavras e o conjunto de
factores FP5. ___________________________________________________________________________ 137
Figura 7-8 - Posição média das palavras preditas utilizando uma lista com 5 e 10 palavras e o conjunto de
factores FP5. ___________________________________________________________________________ 137
x
Lista de Quadros
Quadro 2-1 As principais características de um SACAA. __________________________________________ 15
Quadro 3-1- Factores de Restrição no Processo de Predição. ______________________________________ 36
Quadro 3-2 - Factores de Classificação no Processo de Predição. __________________________________ 37
Quadro 3-3 - Etiquetas associadas a cada uma das classes gramaticais.______________________________ 44
Quadro 3-4 - Parte da definição do classe CDicionario que armazena o Léxico do sistema. ______________ 48
Quadro 3-5 - Definição parcial da classe CPalavra. _____________________________________________ 49
Quadro 3-6 - A função EfectuaPredicao. ______________________________________________________ 52
Quadro 4-1 - Definição parcial da classe abstracta CProcessadorTexto. _____________________________ 71
Quadro 4-2 - Acesso ao objecto que representa o processador de texto no sistema, através de um apontador. 73
Quadro 4-3 - Mensagens enviadas pelo objecto que representa o processador de texto no nosso sistema. ____ 74
Quadro 4-4 - Definição parcial da classe _Application, que possibilita o acesso ao objecto situado no topo da
hierarquia do WOM. ______________________________________________________________________ 75
Quadro 4-5 - Implementação de duas funções membro da classe _Application.. ________________________ 75
Quadro 4-6 - Implementação da função que estabelece a ligação ao Ms Word. ________________________ 76
Quadro 4-7 - Implementação da função EscreverTexto na classe derivada CMicrosoftWord. _____________ 77
Quadro 4-8 - Função da classe CMicrosoftWord que permite obter a parte uma frase que se situa à esquerda do
curso de texto. ___________________________________________________________________________ 78
Quadro 4-9 - Função do dll que inicializa os vários hooks. ________________________________________ 80
Quadro 4-10 - Rotina do dll que efectua o tratamento das mensagens WM_KEYDOWN e WM_KEYUP._____ 81
Quadro 4-11 - Tratamento da mensagem WM_TECLA_PRESSIONADA no interior da classe CMicrosoftWord.
_______________________________________________________________________________________ 82
Quadro 4-12 - Tratamento da mensagem WM_CHAR no interior do objecto CProcessadorTextoGenerico. __ 83
Quadro 4-13 - Função que permite a escrita de um caracter em qualquer aplicação externa. _____________ 85
Quadro 4-14 - Função que permite a escrita de um caracter simples numa aplicação externa. ____________ 86
Quadro 5-1 - Teclas para o acesso aos elementos do Conjunto de Selecçao que permitem apoiar a escrita.__ 92
Quadro 5-2 - Definições parciais das classes CTecladoEcra e CTecla. _______________________________ 95
Quadro 5-3 - As definições possíveis para a criação de elementos num teclado de ecrã.. _________________ 96
Quadro 5-4 - Parte de um ficheiro com a definição da estrutura de um teclado de ecrã.__________________ 96
Quadro 5-5 - As diferentes disposições para o teclado de ecrã que acompanham a instalação do sistema. ___ 98
Quadro 5-6 - Função responsável pelo desenho de um objecto CTecla no ecrã do computador. __________ 101
Quadro 5-7 - Rotina que evita a activação da aplicação ao ser efectuado um clique sobre uma das teclas do
Teclado de Ecrã. ________________________________________________________________________ 105
Quadro 5-8 - Função que detecta a entrada do ponteiro do rato sobre um tecla do teclado de ecrã. _______ 106
Quadro 5-9 - Função que reflecte no mecanismo de varrimento o facto de um interruptor ter sido colocado em
baixo. _________________________________________________________________________________ 111
Quadro 5-10 - Eventos assinalados pelo Teclado de Ecrã ao exterior. ______________________________ 112
Quadro 5-11 - Parte da definição da classe CSintetizadorFala.____________________________________ 113
Quadro 5-12 - A função Falar da classe CSintetizadorFala. ______________________________________ 115
xi
Quadro 5-13 - Parte da definição da classe CAgenteInterface. ____________________________________ 117
Quadro 5-14 - A função Inicializar da classe CAgenteInterface. ___________________________________ 118
Quadro 5-15 - A função MoverPersonagem da classe CAgenteInterface. ____________________________ 118
Quadro 6-1 - Definição parcial da classe CDocumentoSACAA.____________________________________ 123
Quadro 6-2 - Definição parcial da classe CVistaSACAA (Controlador do Sistema) ____________________ 124
Quadro 6-3 - Rotina de tratamento da mensagem WM_TECLA_PRESSIONADA.______________________ 128
Quadro 6-4 - A função que desencadeia uma predição de palavras. ________________________________ 129
Quadro 7-1 - Dimensões dos textos utilizados nas simulações de predição de palavras (obtidas com o comando
wc do unix). ____________________________________________________________________________ 134
Quadro 7-2 - Os diferentes conjuntos de Factores de Predição utilizados nas simulações. _______________ 134
xii
Lista de Abreviaturas
ASHA - American Speech-Language-Hearing Association
AT - Ajuda Técnica
AVC - Acidente Vascular Cerebral
CAA - Comunicação Aumentativa e Alternativa
COM – Component Object Model
IU – Interface do Utilizador
MSAA – Microsoft Active Accessibility
OLE – Object Linking and Embedding
RPC – Remote Procedure Call
SACAA – Sistema de Apoio à Comunicação Aumentativa e Alternativa
SCAA - Sistema de Comunicação Aumentativa e Alternativa
TA - Tecnologia de Apoio
TAC – Tecnologia de Apoio à Comunicação
WOM – Word Object Model
xiii
xiv
1. Introdução
1.1 Sistemas de Comunicação Aumentativa e Alternativa
As novas tecnologias invadiram o nosso quotidiano nas mais diversas áreas proporcionando a todos
uma melhor qualidade de vida. O impacte destas tecnologias pode ser ainda maior na vida de pessoas
que sofrem de determinadas incapacidades físicas, cognitivas, sensoriais ou de comunicação. Algumas
destas incapacidades dificultam ou impedem a realização de determinadas actividades do dia-a-dia,
como sejam a locomoção, orientação, comunicação, manipulação e educação. Por este motivo estas
pessoas podem necessitar de determinados apoios especiais para a realização destas actividades.
Em determinadas situações estes apoios podem ser prestados através de sistemas tecnológicos. Uma
cadeira eléctrica pode permitir a locomoção duma pessoa impossibilitada de andar, e um sintetizador
de fala pode permitir a participação de uma pessoa com dificuldades de comunicação num diálogo.
Através destes sistemas, estas pessoas podem assim ter uma vida mais independente e participativa.
Estes sistemas são geralmente denominados de Tecnologias de Apoio (TA’s) ou Ajudas Técnicas
(AT´s).
As pessoas com dificuldades de comunicação podem recorrer à Comunicação Aumentativa Alternativa (CAA). A CAA permite compensar, de uma forma temporária ou permanente, incapacidades de
comunicação por parte de pessoas com graves dificuldades de expressão. Uma correcta intervenção na
área da CAA deve identificar um sistema que satisfaça as necessidades comunicativas da pessoa e que
ao mesmo tempo esteja adequado às suas capacidades.
Entre as várias Tecnologias de Apoio à Comunicação (TAC´s) encontram-se os Preditores de Palavras.
A função principal destes sistemas consiste em acelerar a escrita. Por cada caracter escrito estes sistemas tentam adivinhar, ou predizer, a palavra que o utilizador está a escrever. Com base nos caracteres
já escritos e no texto anterior estes sistemas apresentam ao utilizador um conjunto de palavras prováveis. Estas palavras são geralmente apresentadas na forma de uma lista que por isso é denominada de
Lista de Palavras Preditas. Caso a palavra pretendida se encontre na lista o utilizador pode completar a
palavra sem a necessidade de escrever os restantes caracteres, poupando assim tempo de escrita. O
texto produzido com o apoio desta ferramenta também pode ser depois enviado para um sintetizador
que o transforma em fala. Por isso os preditores de palavras constituem uma ferramenta importante
quer para a comunicação escrita quer para a comunicação oral. Alguns estudos também indicam que
os preditores de palavras promovem a escrita de textos com menos erros e com uma melhor qualidade
global sendo por isso também indicados para a aprendizagem da leitura e escrita.
Os preditores de palavras actualmente existentes encontram-se essencialmente vocacionados para a
Língua Inglesa. Outros tipos de sistemas podem ser utilizados no contexto de uma outra língua, no
1
entanto, no caso dos sistemas para a comunicação alternativa esta transposição é muitas vezes problemática. Por exemplo, um sintetizador de fala inglês não pode ser facilmente adaptado para a síntese de
frases escritas em português. O mesmo sucede com os preditores de palavras. Estes sistemas possuem
internamente um modelo da língua que permite inferir um conjunto de palavras prováveis com base no
contexto de escrita do utilizador. As particularidades de cada língua dificultam a construção de modelos genéricos. Estes modelos acabam por possuir um certo grau de dependência relativamente à língua
para a qual foram desenvolvidos, o que dificulta a sua adaptação ao contexto de uma outra língua. Por
exemplo alguns sistemas de predição de palavras desenvolvidos para a Língua Inglesa não prevêem a
existência de palavras acentuadas. Esta restrição inviabiliza a sua utilização na Língua Portuguesa.
Mesmo os sistemas de comunicação alternativa mais sofisticados da actualidade ainda se encontram
muito aquém do que é necessário para uma completa satisfação das necessidades das pessoas com
dificuldades de comunicação. É necessário mais conhecimento ao nível da interacção pessoa-sistema,
aceleração da escrita e processamento de fala de modo a ser possível o desenvolvimento de sistemas
realmente efectivos.
Por estes motivos decidimos implementar um preditor de palavras para a Língua Portuguesa. Inicialmente o nosso principal objectivo consistia apenas no desenvolvimento de um sistema de predição de
palavras estatístico. Este sistema devia possuir um modelo de língua com informação estatística de
modo a permitir a introdução de vários factores probabilísticos no processo de predição, entre os quais
a probabilidade simples e a probabilidade condicional de uma palavra. Decidimos permitir também a
possibilidade de alterar a importância de cada um dos factores no processo de predição. Desta forma
podíamos estudar a influência de cada um destes factores na predição de palavras e assim optimizar a
sua participação neste processo. Este sistema deveria apoiar a escrita no processador de texto Ms
Word. Escolhemos este processador de texto por ser amplamente utilizado e por disponibilizar um
conjunto alargado de possibilidades de adaptação ao utilizador. O sistema também deveria interagir
com o Sintetizador de Fala português, o Dixi+, de modo a ser possível a transformação do texto escrito
em fala. Assim o sistema poderia ser utilizado quer para a escrita quer para a conversação. Para o
apoio da aprendizagem da escrita e da leitura decidimos introduzir também um agente de interface.
Este agente animado permite reforçar a interacção com os utilizadores mais novos.
O Preditor de Palavras, o Dixi+ e outras ferramentas independentes da língua poderiam assim formar
soluções adequadas a um conjunto alargado de pessoas. Nestas últimas ferramentas destacamos os
Teclados de Ecrã (On-Screen Keyboards). Estes teclados são utilizados por pessoas que não conseguem utilizar convenientemente o teclado tradicional de um computador devido a problemas de ordem
motora, cognitiva ou sensorial. Estes sistemas apresentam no ecrã do computador uma matriz com as
várias teclas disponíveis. O utilizador pode carregar numa destas teclas através de um dispositivo de
ponteiro, como o rato, ou então pode solicitar o varrimento automático das teclas para depois seleccionar aquela que pretende através da simples pressão de um interruptor.
2
Desenvolvemos um preditor de palavras com as características que referimos atrás, mas com o decorrer do tempo verificámos que a utilização de ferramentas de fontes distintas dificultava o desenvolvimento de sistemas de comunicação alternativa eficazes. Por exemplo, para a escrita, uma pessoa com
dificuldades motoras teria de controlar em simultâneo três ferramentas distintas e pouco integradas
entre si, o processador de texto, o teclado de ecrã e o preditor de palavras. Alargámos por isso os nossos objectivos iniciais e decidimos desenvolver um sistema mais geral, que por si próprio incorporasse
todos os componentes necessários ao desenvolvimento de diferentes soluções de CAA para o Português Europeu. Ao preditor de palavras estatístico acrescentámos um teclado de ecrã que permite agora
o acesso por parte de pessoas com dificuldades motoras. Desenvolvemos também um conjunto de
técnicas que permitem o apoio à escrita em qualquer aplicação do sistema operativo Windows. A escrita de mensagens pode agora ser efectuada noutras aplicações que não o Ms Word. Também introduzimos a possibilidade de utilização de qualquer sintetizador de fala compatível com a SAPI 4. O sintetizador português Dixi+ é compatível com esta interface e por isso continua a poder ser utilizado com
o nosso sistema. Todos os componentes podem ser configurados para uma adaptação às capacidades
de cada utilizador.
1.2 Objectivos
Esta tese apresenta o desenvolvimento de um Sistema de Apoio à Comunicação Aumentativa e Alternativa (SACAA) para o Português Europeu. Podemos identificar como objectivos principais desta tese
os seguintes:
•
Desenvolver um SACAA para o Português Europeu que possa ser utilizado desde já por um
alargado número de pessoas com dificuldades comunicativas.
•
Apresentar e implementar um conjunto de técnicas necessárias ao desenvolvimento de um
SACAA para o Português Europeu, nomeadamente ao nível da aceleração da escrita, comunicação com as aplicações do sistema e de interacção com o utilizador.
•
Desenvolver um SACAA dotado de uma estrutura que permita, no futuro, a introdução de novas técnicas mais sofisticadas, para uma resposta mais eficaz às necessidades e capacidades
dos seus utilizadores.
•
Avaliar a eficácia de determinadas funcionalidades do sistema implementado de modo a definir novos rumos para o futuro.
1.3 Organização
A organização dos vários capítulos desta tese reflecte o percurso efectuado no desenvolvimento deste
sistema. No Capítulo 2 apresentamos os principais conceitos associados à área da CAA. Entre estes
destacamos os SACAA baseados em computadores e discutimos as principais técnicas utilizadas no
3
seu desenvolvimento. No Capítulo 3 iniciamos a apresentação do nosso sistema. O primeiro componente apresentado é o Preditor de Palavras. Através deste componente o sistema acelera e melhora a
qualidade de escrita do utilizador. Neste capítulo é discutida em pormenor a técnica de Predição de
Palavras utilizada por este componente. No final do capítulo é ainda apresentada a técnica de Expansão de Abreviaturas introduzida no nosso sistema. No Capítulo 4 é apresentado o componente que
possibilita a interacção do sistema com as outras aplicações. Através desta interacção é possível apoiar
a escrita do utilizador em qualquer aplicação. No Capítulo 5 é abordada a interacção do sistema com
utilizador. Neste capítulo é apresentado o Teclado de Ecrã e outros componentes importantes na interacção com o utilizador como o Agente de Interface e o Sintetizador de Fala. O Capítulo 6 apresenta a
arquitectura do sistema. Neste capítulo é discutida a forma como os vários componentes interagem
entre si. Por fim, no Capítulo 7 são apresentados alguns testes ao sistema, as conclusões e apontadas
melhorias para o futuro.
4
2. A Comunicação Alternativa
2.1 A Comunicação Humana
A comunicação é uma actividade fundamental para o ser humano. Através desta actividade o homem
partilha desejos, necessidades, ideias e sentimentos com os outros. Existem muitas formas diferentes
através das quais as pessoas comunicam, como por exemplo a fala, a escrita ou os gestos. Apesar das
diferenças existentes, as várias formas de comunicação humana partilham um mecanismo comum que
tem como principal objectivo a transmissão de uma mensagem de uma pessoa para outra. O modelo
ilustrado na Figura 2-1 pode ser utilizado para uma descrição simples deste mecanismo.
Uma das formas de comunicação mais utilizadas pelas pessoas é o diálogo. O diálogo possibilita a
troca de mensagens entre duas pessoas que se encontram no mesmo espaço e tempo. Nos nossos dias o
diálogo também é possível entre duas pessoas situadas em espaços diferentes desde que seja utilizada
tecnologia adequada como por exemplo o telefone. Em cada momento um dos intervenientes é o emissor e o outro o receptor. O emissor é responsável pela formulação e envio da mensagem. O receptor é
responsável pela sua recepção e descodificação. Num diálogo os papeis de emissor e receptor invertem-se de modo a ser possível a troca de mensagens entre os intervenientes. A mensagem deve ser
formulada com o recurso a um código que ambos os intervenientes entendam como por exemplo a
Língua Portuguesa. Para que a mensagem seja transmitida do emissor ao receptor é utilizado um Canal. No caso de um diálogo face a face o canal utilizado é o ar. No caso de um diálogo ao telefone o
canal utilizado será a linha telefónica. Durante a transmissão de uma mensagem podem surgir situações que dificultem ou impeçam a sua recepção. Nestas circunstâncias dizemos que existe ruído no
processo de comunicação.
Em qualquer situação de comunicação humana as exigências ao nível das capacidades de emissão e
recepção de mensagens são bastante elevadas ainda que sejam efectuadas de uma forma automática
pelo homem. Para se exprimir a pessoa deve primeiro formular a mensagem. Esta operação é realizada
pela área da linguagem do cérebro situada no hemisfério esquerdo. De seguida a mensagem deve ser
enviada ao receptor. Para tal o homem recorre habitualmente à expressão oral (e.g. fala) ou à expressão gráfica (e.g. escrita). Dependendo da forma utilizada, o cérebro deve coordenar a articulação de
vários músculos do corpo por forma a traduzir a mensagem formulada num sinal que possa ser recebido pelo outro interveniente. Este sinal pode ser a fala, a escrita, ou outro. Neste processo a função do
emissor encontra-se momentaneamente concluída.
5
Figura 2-1 - O modelo simples para a comunicação humana.
Do lado do receptor deve ser efectuada a operação inversa. O sinal deve ser captado através de um dos
sentidos (e.g. audição para a fala, visão para a escrita), e depois de transformado numa forma adequada, enviado ao cérebro para o seu processamento. Finalmente, na área da linguagem deste órgão, é
atribuído um significado ao sinal recebido.
2.2 A Pessoa com Dificuldades de Comunicação
Certas incapacidades físicas ou cognitivas podem comprometer a realização de algumas operações
necessárias ao processo de comunicação, traduzindo-se assim em dificuldades de comunicação por
parte da pessoa afectada. As causas para as dificuldades de comunicação numa criança e num adulto
são diferentes. Numa criança as dificuldades de comunicação podem resultar de uma incapacidade
congénita (e.g. autismo, paralisia cerebral, incapacidade sensorial dual, síndromas genéticos, atraso
mental, incapacidades múltiplas, incapacidade na audição, Acidente Vascular Cerebral (AVC) durante
ou próximo do nascimento) ou então de um acidente ou doença que depois impossibilitou o desenvolvimento normal da comunicação. Num adulto as dificuldades de comunicação podem ser originadas
por um AVC, cancro que afecte o aparelho fonador, traumatismo craniano ou doença neurológica progressiva (e.g. doença de Parkinson, Esclerose Múltipla e Esclerose Amiotrófica Lateral) (Sevcik e
Romski, 1997).
Estas causas podem comprometer total ou parcialmente órgãos ou funções importantes no processo de
comunicação humano, entre os quais, a área do cérebro da linguagem, os sentidos e músculos intervenientes, e os canais de transferência de informação e coordenação entre o primeiro e os segundos. Dependendo dos elementos afectados assim serão sentidas determinadas dificuldades. Por exemplo um
adulto que sofra um AVC pode ficar com a área do cérebro relativa à linguagem afectada e por isso
com dificuldades na formulação e ou compreensão de frases ou palavras. As consequências de uma
lesão deste tipo são muito variadas e num todo denominadas de Afasia. Este termo é apenas utilizado
quando o indivíduo possuía plena capacidade de comunicação e por motivo de uma lesão ficou com
esta actividade afectada. Por outro lado uma criança com paralisia cerebral pode não ter a área da linguagem afectada mas apenas a área motora. Desta forma consegue compreender e formular perfeita-
6
mente uma mensagem mas encontra-se impossibilitada de a enviar ao seu interlocutor por não conseguir coordenar devidamente os músculos necessários para tal, como por exemplo as cordas vocais,
músculos faciais, a mão ou outros. Esta criança pode sofrer de Apraxia caso a dificuldade sentida seja
resultado de uma deficiente coordenação, por parte do cérebro, dos músculos necessários à exteriorização da mensagem (e.g. vocalização ou escrita de uma frase). Quando as dificuldades de comunicação são provocadas pelo mau funcionamento dos músculos intervenientes, por estes se encontrarem
fracos, lentos ou descoordenados entre si, então é utilizado o termo Disartria. Em muitas situações a
pessoa pode sofrer destes dois problemas.
Em alguns casos as dificuldades na comunicação surgem repentinamente, como por exemplo nas Afasias. Noutros casos vão aumentando ao longo do tempo, como sucede nas doenças neurológicas progressivas. Estas dificuldades também podem ser permanentes ou temporárias, desaparecendo após a
recuperação da pessoa afectada.
2.3 Sistemas de Comunicação Aumentativa e Alternativa
Caso a pessoa fique impossibilitada de comunicar ou não consiga satisfazer as suas necessidades comunicativas então a CAA poderá prestar algum apoio na realização desta actividade. A American
Speech-Language-Hearing Association (ASHA) define CAA como uma área de prática clínica que
tenta compensar, de uma forma temporária ou permanente, incapacidades de comunicação por parte de
pessoas com graves dificuldades de expressão (Sevcik e Romski, 1997). Segundo a ASHA a CAA
deve incorporar todo o discurso possível da pessoa, vocalizações, gestos assim como outras formas de
comunicação que recorram a elementos externos (e.g. utilização de uma tabela com letras e frases). A
CAA é assim na sua natureza multimodal pois permite a utilização de qualquer modo possível de comunicação. Muitas vezes é comum a atribuir a denominação de Sistema de Comunicação Aumentativa
e Alternativa (SCAA) ao dispositivo utilizado na CAA relegando para segundo plano outros elementos
extremamente importantes. A ASHA reforça a importância dos outros elementos considerando um
SCAA como um grupo integrado de quatro componentes: Símbolos, Ajudas (Tecnológicas ou não),
Técnicas, e/ou Estratégias (Sevcik e Romski, 1997).
O aconselhamento do SCAA adequado a uma determinada pessoa deve ser efectuado por uma equipa
multidisciplinar de técnicos especializados. Esta equipa deve ser formada de acordo com as dificuldades e necessidades sentidas pela pessoa afectada. A equipa pode ser composta pela pessoa, familiares,
terapeuta da fala, terapeuta ocupacional, fisioterapeuta, médico, engenheiro de reabilitação, professor,
assistente social e psicólogo.
Para o aconselhamento de um SCAA, Cook e Hussey (1995: 502) apontam as principais etapas. Numa
primeira fase deve ser efectuado o levantamento das necessidades da pessoa e em seguida avaliadas as
capacidades com importância no processo de comunicação, como sejam as capacidades sensoriais,
7
Figura 2-2 – SCAA com Ajuda que possibilita a
conversação com o recurso ao olhar.
cognitivas, comunicativas e físicas. Com base nas necessidades e capacidades da pessoa são então
seleccionados possíveis SCAA e efectuados testes comparativos entre estes. Nestes testes deve ser
obtida informação quantitativa e qualitativa sobre a utilização do sistema. Depois de encontrado o
SCAA mais adequado, os seus componentes são adquiridos, possivelmente com algum apoio financeiro, seguidamente montados e por fim iniciado o treino da pessoa com o sistema. Em qualquer fase do
processo pode ser necessária a repetição de etapas anteriores. Após a intervenção é recomendável um
acompanhamento regular para eventuais ajustes e manutenção do sistema. Por alteração das condições
iniciais e inflexibilidade do sistema pode mesmo verificar-se a inadequação da solução e ser necessário a repetição de todo o processo. Cordeiro (1994) e Ferreira et al. (1995) apresentam também métodos de aconselhamento de um SCAA semelhantes. No Anexo A apresentam-se várias grelhas desenvolvidas no Centro de Paralisia Cerebral de Beja para o registo dos dados obtidos neste processo.
Os SCAA’s encontram-se divididos em dois grandes grupos, os SCAA’s sem Ajuda e os SCAA´s com
Ajuda (Sevcik e Romski, 1997). No primeiro grupo incluem-se todas as formas não verbais de comunicação natural, como os gestos, expressões faciais e os vários sistemas de linguagem gestual. Estes
sistemas apenas podem ser utilizados por pessoas com uma boa funcionalidade manual e coordenação
motora de modo a permitir uma boa definição dos sinais gestuais. A aplicação destes sistemas resumese à conversação e apenas com pessoas conhecedoras do sistema.
Para outras pessoas a comunicação é apenas possível através de um SCAA com Ajuda. Neste tipo de
sistemas é utilizado algo externo ao corpo da pessoa como forma de apoio à comunicação. Este elemento externo pode ser algo relativamente simples como uma folha de papel contendo vários símbolos
(i.e. fotografias, desenhos, palavras, frases), na qual cada um destes representa um objecto, desejo ou
ideia. Para comunicar a pessoa aponta para um dos símbolos com a mão, olhar ou outra parte do corpo. A Figura 2-2 ilustra um sistema que possibilita a conversação face a face através da utilização do
olhar. Os SCAA com Ajuda também podem ser implementados com o recurso a dispositivos electró-
8
Figura 2-3 - SCAA com Ajuda electrónico.
nicos. Neste caso a selecção de um dos símbolos permite enviar ao interlocutor a mensagem associada
através de síntese de fala ou discurso digitalizado. A Figura 2-3 apresenta um sistema deste género.
Os SCAA com Ajuda podem ser utilizados quer na conversação quer na expressão gráfica (i.e. escrita,
matemática e desenho) (Cook e Hussey, 1995: 469). Os SCAA com Ajuda utilizados na conversação e
na escrita pretendem apoiar ou substituir a duas formas de comunicação mais utilizadas pelo homem, a
comunicação verbal falada e a comunicação verbal escrita. Por apresentarem muitas semelhanças entre
si encontram-se por vezes incorporados num mesmo sistema.
2.4 Sistemas de Símbolos para a Comunicação Aumentativa
Alternativa
Um SCAA deve utilizar um determinado sistema de símbolos. Ferreira et al. (1995) fornecem uma
classificação para os vários sistemas de símbolos disponíveis: (1) Sistemas de Comunicação com Objectos; (2) Sistemas de Comunicação com Imagens; (3) Sistemas de Comunicação com Símbolos Gráficos; (4) Sistemas de Comunicação com Símbolos do Alfabeto; (5) Sistemas de Comunicação com
Linguagens Codificadas.
Para representar um objecto ou ideia estes sistemas recorrem essencialmente a dois tipos de símbolos:
iconográficos ou arbitrários. Os símbolos iconográficos sugerem de alguma forma o objecto ou ideia
que representam. Quando representam um objecto concreto são denominados símbolos pictográficos,
quando representam um conceito abstracto, ou ideia, são denominados símbolos ideográficos. Para a
expressão de um conceito abstracto estes últimos símbolos recorrem muitas vezes à denominada segunda iconicidade de um objecto. Por exemplo para a representação do conceito quente pode ser utilizado um símbolo com uma caneca a fumegar. A primeira iconicidade deste símbolo seria naturalmente
a própria caneca, uma segunda iconicidade deste símbolo seria o conceito quente. Para um determina-
9
do símbolo podem existir várias segundas iconicidades. Neste caso o símbolo também poderia exprimir o conceito de fumo.
Há também símbolos que não sugerem de forma alguma o conceito que representam, sendo a sua
associação resultado de uma convenção social. Estes símbolos são denominados arbitrários. As várias
palavras de uma língua são um exemplo deste tipo de símbolos. Por vezes também são utilizados símbolos compostos simultaneamente por elementos iconográficos e arbitrários.
2.4.1 Sistemas de Comunicação por Objectos e por Imagens
Estes dois tipos de sistemas utilizam respectivamente objectos reais e imagens na comunicação. Este
sistemas são altamente pictóricos e por isso são utilizados por pessoas com grandes dificuldades
cognitivas e de comunicação ou então por crianças em fase de aprendizagem. As possibilidades de
expressão destes sistemas de comunicação são bastante limitadas. Os restantes sistemas apresentam
um maior número de possibilidades comunicativas.
2.4.2 Sistemas de Comunicação por Símbolos Gráficos
Nos Sistemas de Comunicação por Símbolos Gráficos, também denominados de Sistemas de Representação Gráfica, a pessoa dispõe de uma matriz formada por símbolos pertencentes a um Sistema de
Símbolos Gráficos. Para comunicar a pessoa aponta para um dos símbolos utilizando a mão, o olhar ou
outra parte do corpo. A maioria destes sistemas incorpora nos símbolos uma legenda para facilitar a
comunicação com interlocutores pouco familiarizados com esta forma de comunicação. A pessoa também pode seleccionar um símbolo utilizando um computador, ou outro dispositivo electrónico, equipado com uma forma de acesso adequada às capacidades da pessoa. Neste último caso, após a selecção
do símbolo, pode também ser ouvida uma gravação sonora com o seu significado, ou então sintetizada
para fala a etiqueta associada ao símbolo.
Existem vários Sistemas de Símbolos Gráficos sendo os mais divulgados o PIC (Pictogram Ideogram
Communication), o PCS (Picture Communication Symbols), em Português SPC (Símbolos Pictográficos para a Comunicação) e o BLISS. Ferreira et al. (1995) apresentam uma caracterização breve de
cada sistema e referem as suas principais vantagens e desvantagens.
O PIC, desenvolvido pelo terapeuta da fala, Subhas Maraj, em 1980, é constituído por cerca de 800
símbolos, dos quais apenas 400 se encontram traduzidos para o Português. As imagens são figuras
estilizadas, desenhadas a branco sobre fundo preto. Na parte superior do símbolo pode ser escrita a
legenda. Os vários símbolos encontram-se agrupados nos seguintes temas: pessoas, partes do corpo,
vestuários e utensílios, pessoas, casa, casa de banho, cozinha, comida e guloseimas. O PIC apresenta
10
Figura 2-4 – Os símbolos que representam, respectivamente da esquerda
para a direita, a palavra mãe nos sistemas PIC, SPC e Bliss.
como uma das principais vantagens o grande contraste existentes nos símbolos sendo por isso utilizado
com sucesso por parte de pessoas com dificuldades de percepção visual. Têm sido no entanto apontadas pelos técnicos da área algumas desvantagens: pouca flexibilidade na formação de novos significados, alguma dificuldade no seu desenho e elevado custo na sua reprodução (i.e. fotocópia ou impressão). O PIC possui essencialmente símbolos pictóricos.
O SPC, desenvolvido pela terapeuta da fala Roxana Mayer Johnson, em 1981, é constituído por 3200
símbolos e encontra-se totalmente traduzido para o Português. Os símbolos são formados por desenhos
simples, com traço preto sobre fundo branco e uma legenda na parte superior. Encontram-se divididos
em seis categorias gramaticais: pessoas, verbos, adjectivos, diversos (i.e. artigos, conjunções, preposições, cores, tempo, alfabeto, números e outra palavras abstractas) e sociais (i.e. palavras facilitadoras
da interacção social). A existência destas categorias gramaticais possibilita a criação de frases simples.
Ferreira et al. (1995) apontam como uma das vantagens principais deste sistema a sua flexibilidade
pois permite satisfazer um amplo espectro de necessidades comunicativas, desde as mais simples até
às mais sofisticadas. No entanto, como o contraste existente nos símbolos não é muito elevado pode
haver algumas dificuldades na sua diferenciação por parte de pessoas com dificuldades de percepção
visual. O SPC possui essencialmente símbolos pictográficos e ideográficos.
O sistema Bliss herdou o nome do seu criador, Charles Bliss, que sensibilizado com a incompreensão
entre os povos e os acontecimentos que culminaram na 2ª Grande Guerra Mundial, sentiu a necessidade de desenvolver uma linguagem universal, impulsionadora da comunicação entre os países e por isso
também da paz mundial. No que diz respeito a este último ponto, bem sabemos que Charles Bliss não
obteve os resultados pretendidos. Houve no entanto pessoas que adoptaram o sistema desenvolvido
como forma de comunicação com os outros. O sistema Bliss começou a ser utilizado por pessoas com
dificuldades de comunicação cerca de 1971. Possui cerca de 2500 símbolos formados através da composição, e/ou sequenciação, de símbolos mais elementares. Existem no sistema símbolos pictográficos,
ideográficos e arbitrários, que se encontram distribuídos pelas seguintes categorias: pessoas, acçõesverbos, substantivos, adjectivos e advérbios, artigos e proposições, sociais. Também existem algumas
regras para a criação de novos símbolos. A Figura 2-4 apresenta os símbolos relativos à palavra mãe
para os sistemas PIC, SPC e Bliss.
11
2.4.3 Sistemas de Comunicação por Símbolos do Alfabeto
Os Sistemas de Comunicação por Símbolos do Alfabeto pretendem apoiar a conversação e a escrita
recorrendo aos símbolos normalmente utilizados pelo homem nestas formas de comunicação, as letras.
Estes sistemas apresentam um modo de utilização muito semelhante aos anteriores. A pessoa dispõe
de uma matriz com as várias letras, que deve sucessivamente seleccionar de modo a construir as várias
palavras que por fim formam uma frase. Tal como nos sistemas anteriores podem ser utilizadas plataformas com mais ou menos tecnologia. Na construção da mensagem a pessoa pode simplesmente
apontar para as letras com a mão, o olhar, ou outra parte do corpo enquanto o interlocutor observa
atentamente. A mesma mensagem pode ser produzida num computador e em seguida transformada em
fala através de um sintetizador.
Para exprimir um conceito a pessoa deve seleccionar sucessivamente várias letras, formando assim
uma palavra. A palavra é um símbolo arbitrário, que não sugere de forma alguma aquilo que representa, ao invés do que sucede nos sistemas anteriores, nos quais a mensagem é composta essencialmente
por símbolos iconográficos que fornecem pistas claras sobre o conceito representado. Nos Sistemas de
Comunicação por Símbolos Gráficos basta uma selecção para a expressão de um conceito ao passo
que nestes sistemas é necessária a selecção de várias letras para a formação da palavra associada ao
mesmo. Desta forma é usual a introdução de palavras (e.g. sim e não) ou de frases (e.g. Quero lanchar.) de uso frequente na matriz de comunicação.
2.4.4 Sistemas de Comunicação por Linguagens Codificadas
Nestes sistemas as mensagens são formuladas utilizando símbolos que codificam as várias letras do
alfabeto ou mesmo palavras de uma língua. Como exemplos temos o Código Morse e o Braille. No
Código Morse cada palavra é representada através de uma sequência de dois símbolos distintos, um
ponto e um traço, um som curto e um som mais longo, um flash de luz curto e um flash de luz mais
longo. Como o Código Morse foi desenvolvido para ser um sistema de comunicação eficiente, as letras mais utilizadas apresentam uma codificação constituída por menos símbolos sendo assim reduzido
o esforço necessário na construção de cada mensagem. Sequenciando vários símbolos do código Morse através de um dispositivo apropriado a pessoa pode transmitir letras e assim palavras ao seu interlocutor.
O Braille é um sistema utilizado por invisuais e por isso as várias letras encontram-se codificadas de
uma forma perceptível ao tacto. A codificação de cada letra é efectuada com base numa célula constituída por seis ou oito pontos. O código de cada letra é formado através da marcação de determinados
pontos desta célula. Quando cada célula corresponde a um caracter, o Braille utilizado é indicado como de Grau 1. Quando no decurso do texto surgem palavras que se encontram codificadas através de
uma única célula ou através da contracção de um número reduzido de células então o Braille é indicado como de Grau 2 ou 3, dependendo do número de contracções utilizadas. Com o Braille Grau 1 é
12
Figura 2-5 - O SACAA Dedicado Dubby destina-se essencialmente à
conversação.
possível a leitura de 40 palavras por minuto ao passo que com o Braille Grau 3 a velocidade de leitura
pode atingir as 200 palavras por minuto.
O Código Morse é um sistema vocacionado para a conversação ao passo que o Braille é um sistema
essencialmente utilizado na escrita.
2.5 Sistemas de Apoio à Comunicação Aumentativa e
Alternativa
Como referimos anteriormente um SCAA com Ajuda recorre a algo externo ao corpo da pessoa como
forma de apoio à comunicação. Este elemento externo pode possuir vários graus de tecnologia. Pode
consistir apenas numa folha de papel com uma matriz de símbolos ou num sofisticado computador
com um sintetizador de fala. Passaremos a denominar estes dispositivos mais complexos e dotados de
um certo nível de tecnologia de Sistemas de Apoio à Comunicação Aumentativa e Alternativa (SACAA). Existem SACAA Dedicados, desenvolvidos apenas para esta função, e SACAA Baseados em
Computador, que para além do apoio à comunicação também podem ser utilizados noutras aplicações.
A Figura 2-5 ilustra um SACAA Dedicado e a Figura 2-6 um SACAA Baseado em Computador. Os
primeiros por se destinarem a um objectivo específico, incorporam apenas os recursos necessários,
permitindo assim a construção de sistemas de pequenas dimensões, portáteis, que acompanham a pessoa em qualquer situação. O desenvolvimento de sistemas deste tipo implica esforços na criação da
plataforma hardware assim como no software de apoio à comunicação. Os SACAA Dedicados têm
sido tradicionalmente utilizados no apoio à conversação. Os segundos, alojados em computadores de
uso geral, possuem mais recursos, permitem a implementação de mais funcionalidades, mas apresentam sempre dimensões maiores, o que os torna não portáteis. No entanto esta situação tem vindo a
alterar-se com o aparecimento de computadores de uso geral cada vez mais pequenos. Têm sido inclusivamente desenvolvidos sistemas de comunicação, baseados em computadores de bolso, com características muito idênticas, e em muitos casos superiores aos SACAA Dedicados. Estes sistemas apresentam também custos de produção inferiores pois utilizam uma plataforma de hardware e sofware de uso
13
Figura 2-6 - O SACAA Baseado em Computador Ezkeys.
geral sobre a qual apenas é necessário desenvolver certos componentes de software específicos de
apoio à comunicação.
2.5.1 A Estrutura de um Sistema de Apoio à Comunicação
Aumentativa e Alternativa
Um SACAA destina-se a apoiar a composição e transmissão de uma mensagem a um interlocutor.
Segundo Cook e Hussey (1995: 482) um SACAA é compostos por três elementos distintos: (1) Interface do Utilizador; (2) Processador; (3) Saída do Sistema. A Interface do Utilizador (IU) possibilita o
acesso da pessoa às várias funcionalidades do sistema. O Processador implementa as funcionalidades
que possibilitam a composição e transmissão de uma mensagem. Como resultado da operação do sistema é gerada uma Saída que desta forma transmite a mensagem ao interlocutor. A Figura 2-7 ilustra
uma estrutura composta por estes três elementos.
A pessoa interage com o sistema através da IU. É através desta interface que a pessoa acede às funcionalidades do sistema. Todo o feedback considerado necessário à construção da mensagem também é
enviado ao utilizador através deste componente. Podemos identificar na IU os seguintes elementos: o
Conjunto de Selecção (e.g. letras do alfabeto), o Método de Selecção (e.g. Selecção Directa com Teclado) e o Dispositivo de Controlo (e.g. teclado). O Conjunto de Selecção contém os vários elementos
da interface que o utilizador pode seleccionar, entre os quais os vários símbolos disponíveis para a
construção de uma mensagem. Também pode conter palavras ou mesmo frases completas. Para a selecção de elementos do Conjunto de Selecção a pessoa deve utilizar um Método de Selecção e um
Dispositivo de Controlo adequado às suas capacidades.
O Processador de um SACAA implementa as funcionalidades necessárias à composição e a transmissão de uma mensagem ao interlocutor. Para a composição de uma mensagem o Processador deve pos-
14
Figura 2-7 - Estrutura de um SACAA baseada em três elementos: Interface do
Utilizador, Processador e Saída do Sistema.
suir capacidades para a Edição da Mensagem. Através destas capacidades o utilizador pode acrescentar símbolos à mensagem, efectuar alterações ao seu conteúdo e proceder à sua formatação. Em certos
sistemas é impossível apresentar simultaneamente no Conjunto de Selecção todos os símbolos e vocabulário pretendido. São consideradas técnicas de Expansão de Vocabulário todos os métodos que de
uma forma ou de outra permitam o acesso a todos estes elementos. De modo a evitar a escrita de uma
mensagem, símbolo a símbolo, alguns Processadores também dispõe de técnicas que possibilitam a
Aceleração da Escrita. Estas técnicas de Aceleração da Escrita recorrem normalmente a um conjunto
de Conhecimentos sobre a Língua utilizada. Determinados métodos podem ser utilizados simultaneamente para a Expansão de Vocabulário e Aceleração da Escrita. A Saída do Sistema irá transmitir a
mensagem ao interlocutor. Tal poderá ser efectuado através de várias formas. Escrita em papel, escrita
num documento electrónico ou transformada em fala através de um sintetizador. O Processador deve
possibilitar ao utilizador um certo Controlo sobre a Saída transmitida ao interlocutor.
No Quadro 2-1 indicamos os principais elementos da IU e as principais funcionalidades do Processador de um SACAA.
Interface do Utilizador
Processador
Conjunto de Selecção
Método de Selecção
Dispositivo de Controlo
Edição da Mensagem
Expansão do Vocabulário
Aceleração da Escrita
Conhecimento sobre a Língua
Controlo sobre a Saída
Quadro 2-1 As principais características de um SACAA.
15
Figura 2-8 - O mecanismo de varrimento.
2.5.2 Conjunto de Selecção, Métodos de Selecção e Dispositivos de
Controlo
De uma forma geral o Conjunto de Selecção é constituído pelos vários elementos que o utilizador pode
seleccionar na IU. Através destes elementos o utilizador deve conseguir aceder aos vários símbolos
necessários para a construção de mensagens. O Conjunto de Selecção também deve possibilitar o
acesso a um conjunto de operações que permitam a manipulação da mensagem como por exemplo a
remoção de um símbolo. Quando a quantidade de símbolos e de operações não permite a sua apresentação simultânea ao utilizador então o sistema deve conseguir apresentar no Conjunto de Selecção
apenas os elementos necessários em cada momento. A quantidade de símbolos necessários depende
das necessidades do utilizador e do Sistema de Símbolos utilizado.
Para a construção de uma mensagem a pessoa deve seleccionar sucessivamente vários símbolos sejam
estes símbolos gráficos ou do alfabeto. Segundo Cook e Hussey (1995: 314) existem quatros métodos
diferentes para a selecção de um elemento num sistema: (1) Selecção Directa; (2) Selecção Indirecta;
(3) Varrimento Directo; (4) Selecção por Código. Com cada um destes métodos deve ser utilizado com
um Dispositivo de Controlo adequado. É através deste dispositivo físico que a pessoa controla o Método de Selecção.
O Método de Selecção Directa é o habitualmente utilizado pelas pessoas no dia-a-dia, e de uma forma
particular pelos utilizadores de computadores, quer pressionando directamente uma tecla ou seleccionando determinada opção de um menu através do movimento do rato e respectivo clique.
Figura 2-9 - Criança a utilizar o mecanismo de varrimento.
16
Figura 2-10 - Manípulo com uma superfície de contacto larga.
Quando por dificuldades motoras a pessoa não consegue apontar para um símbolo, utilizar o teclado,
ou deslocar o rato no ecrã por forma a seleccionar uma das opções disponíveis então deve ser utilizado
um método de Selecção Indirecta. O método de Selecção Indirecta mais utilizado é a Selecção por
Varrimento. Este método apresenta ainda algumas variantes sendo as principais: (1) Varrimento Regular; (2) Varrimento Inverso; (3) Varrimento Passo-a-Passo. Na primeira forma as várias opções disponíveis são automaticamente percorridas pelo sistema. Na Figura 2-8 ilustramos esta operação. No
momento que a opção pretendida é percorrida o utilizador deve pressionar um interruptor para efectuar
a sua selecção. No Varrimento Inverso as várias opções são percorridas enquanto o interruptor estiver
pressionado, ao ser solto é seleccionada a opção percorrida naquele momento. No Varrimento Passo-aPasso as várias opções não são percorridas de forma automática pelo sistema. A pessoa utiliza um
interruptor para percorrer os vários elementos, ao chegar ao elemento pretendido pressiona um segundo interruptor para efectuar a sua selecção. Na Figura 2-9 mostramos uma criança a utilizar o mecanismo de varrimento.
Existem também vários tipos de interruptores, cada qual accionado através de uma manipulação específica. Para a activação do interruptor a pessoa deve utilizar uma parte do corpo sobre qual detenha um
certo grau de controlo. Estes pontos de controlo são por ordem preferencial os dedos, mãos, braços,
pés e cabeça. Devido a encontrarem-se associados a uma manipulação específica os interruptores são
por isso muitas vezes denominados de manípulos. Há manípulos que são accionados através do pressionar de uma superfície, que entre outras características pode ser maior ou menor, exigir uma maior
ou menor força, mas também há outros manípulos, menos tradicionais como por exemplo aqueles que
são accionados através do puxar de uma corda que assim fecha mecanicamente o circuito ou o desnivelar de um paralelepípedo contendo mercúrio que assim une os dois pontos abertos do circuito. Na
Figura 2-10 e Figura 2-11 ilustram-se alguns destes interruptores.
A grande desvantagem do método de Selecção por Varrimento consiste na lentidão com que é seleccionada cada uma das opções, e a grande vantagem em requerer apenas um ou dois movimentos funcionais por parte da pessoa.
17
Figura 2-11 - Manípulo activado através do
puxar de uma corda.
Através do método de selecção por Varrimento Directo a pessoa pode seleccionar a direcção do varrimento ao invés deste ser efectuado de uma forma automática, ou sequencial, por parte do sistema. Este
método de selecção é mais rápido que o anterior mas também mais exigente em termos de funcionalidade motora pois a pessoa terá de possuir pelos menos quatro movimentos funcionais, um para cada
direcção, e um quinto para efectuar a selecção.
O último método de acesso referido consiste em seleccionar determinada opção através da introdução
de um código, como por exemplo a utilização de uma tecla de atalho num programa de computador.
Um código que também pode ser utilizado é o código Morse já referido anteriormente. Através deste e
utilizando apenas um interruptor é possível a introdução de qualquer dado ou código de controlo num
sistema. Este método tem a desvantagem de ser bastante exigente a nível cognitivo, nomeadamente no
que respeita à memória.
2.5.3 Edição da Mensagem
Utilizando um Método de selecção e um Dispositivo de Controlo adequado a pessoa pode seleccionar
símbolos do Conjunto de Selecção e assim compor a mensagem desejada. A composição da mensagem pode ser efectuada com a ajuda do interlocutor ou de uma forma autónoma. Por exemplo, uma
pessoa pode possuir uma matriz com vários símbolos BLISS e conseguir apontar para cada um destes
através do olhar. Para receber a mensagem o interlocutor deve observar atentamente os símbolos indicados. A mensagem é desta forma composta na memória do interlocutor. A Figura 2-2 ilustra esta
forma de comunicação. No caso da pessoa pretender utilizar este mesmo sistema para a escrita então
necessitaria de apoio para o registo dos símbolos. Uma forma bastante utilizada nas salas de aula consiste na colagem dos símbolos seleccionados numa folha de papel.
Esta forma de comunicação, ainda que apropriada em determinadas situações, não promove totalmente
a autonomia da pessoa pois impõe ao interlocutor um esforço suplementar no processo de comunicação. Para possibilitar uma maior independência na construção e envio de uma mensagem, os SACAA
possibilitam não só a selecção de cada um dos símbolos, mas também a composição da mensagem e o
18
seu envio ao interlocutor através de um meio adequado (e.g. síntese de fala, e-mail). Alguns destes
sistemas, para além de poderem ser utilizados na conversação, também podem ser utilizados na escrita.
Nos SACAA a composição da mensagem é efectuada num componente do sistema denominado de
editor de símbolos. Este componente assemelha-se a uma folha de papel, na qual podemos escrever e
apagar símbolos. Muitas vezes também são permitidas outras operações dependendo do grau de sofisticação do editor. Os SACAA Dedicados, por se destinarem essencialmente à conversação e utilizarem
apenas símbolos do alfabeto na construção das mensagens, possuem editores próprios, muito simples,
mas suficientes para a construção de frases que depois são enviadas a um sintetizador de fala interno.
Nesta situação encontra-se o SACAA ilustrado na Figura 2-5. Os SACAA Baseados em Computador,
também podem seguir a abordagem anterior, disponibilizando um editor próprio no qual é criada a
mensagem, ou então, por assentarem numa plataforma sobre a qual existem outras aplicações podem
permitir a composição da mensagem em editores existentes no sistema. Esta situação encontra-se ilustrada na Figura 2-6. Através desta última abordagem a mensagem é construída numa aplicação externa ao SCAA, podendo de seguida ser processada pelo programa de acordo com as necessidades do
utilizador. A pessoa pode utilizar um pequeno editor de texto (e.g. WordPad) se pretender apenas escrever frases que depois envia para o sintetizador de fala, mas também pode utilizar um processador
de texto sofisticado (e.g. Ms Word) que depois lhe permite formatar adequadamente o documento.
Pode ainda recorrer a um programa de gestão de correio electrónico (e.g. Outlook Express) para o
envio de mensagens via Internet.
2.5.4 Aceleração da Escrita e Expansão de Vocabulário
Para cada forma de comunicação são necessários determinados níveis de rapidez e precisão na construção e transmissão da mensagem. Na conversação a rapidez na formulação e envio da mensagem é
extremamente importante por forma a ser possível a manutenção do diálogo com a outra pessoa.
Blackstone (1990) refere valores obtidos em vários estudos que atestam esta importância. Um adulto
consegue comunicar oralmente a uma taxa de 125 a 180 palavras por minuto (ppm). Por outro lado a
taxa de escrita expressiva de um bom dactilógrafo ronda as 27 ppm. A discrepância destes valores
permite antecipar as dificuldades sentidas por uma pessoa que tenha de manter um diálogo através da
escrita de mensagens. Segundo Cook e Hussey (1995: 473) a situação ainda se torna mais complicada
para pessoas que escrevem apenas com um dedo. Nesta situação apenas é possível escrever entre 10 a
12 ppm. No caso de ser utilizado um método de acesso por varrimento estes valores podem baixar para
cerca de 3 a 5 ppm. Na conversação a precisão da mensagem não é um factor tão critico como a rapidez pois existe a possibilidade de correcção de erros no decurso do diálogo.
Na produção de documentos escritos a situação é diferente. Segundo Cook e Hussey (1995: 476) os
utilizadores de SACAA recorrem à escrita para a elaboração três tipos de documentos diferentes: documentos formais, correspondência e apontamentos. Na composição de documentos formais ou escrita
19
de correspondência a pessoa pode demorar mais ou menos tempo, pois não há elevados requerimentos
na rapidez da escrita, no entanto o conteúdo da mensagem deve ser o mais preciso possível. Outras
formas de escrita, como o tomar apontamentos numa sala de aula, são muito exigentes visto ser necessário, não só uma grande rapidez, mas também muita precisão na construção da mensagem. Blackstone (1990) aponta valores obtidos para a escrita manual em vários estudos. Alunos da primeira classe
conseguem escrever em média 2.4 ppm, alunos do segundo ciclo escrevem em média 10.4 ppm, os
adultos conseguem manter taxas de escrita entre 35-40 ppm. Estes valores já se encontram mais próximos das taxas de escrita permitidas por um SACAA pelo que o problema da velocidade neste caso
não é tão problemático como na conversação.
Como já referimos um SACAA pode ser utilizado em alternativa a estas formas de comunicação. No
entanto, também verificámos que os processos alternativos utilizados na construção das mensagens,
mais lentos que os processos naturais, e as dificuldades dos utilizadores destes sistemas, impedem que
sejam atingidos de uma forma geral, valores próximos dos valores padrão.
Assim têm vindo a ser desenvolvidas e implementadas técnicas nos SACAA de modo a aproximar as
Taxas de Comunicação proporcionadas por estes sistemas a valores próximos dos utilizados nas várias
formas de comunicação. Estas técnicas tentam aumentar a Taxa de Comunicação através de um aumento da Taxa de Escrita.
De uma forma geral, uma pessoa para escrever uma mensagem com M símbolos deve efectuar M selecções, uma por cada símbolo da mensagem. Recorrendo a diferentes estratégias, as técnicas para o
aumento da Taxa de Escrita permitem que a pessoa escreva a mesma mensagem, compostas por M
símbolos, efectuando apenas N selecções, com N<M. Quanto maior for a diferença entre M e N, maior
é a quantidade de símbolos que a pessoa evita escrever, havendo assim uma poupança nos caracteres
escritos e dessa forma um aumento potencial na Taxa de Comunicação.
Cook e Hussey (1995: 486) dividem estas técnicas essencialmente em dois grupos: (1) Técnicas de
Codificação; (2) Técnicas de Predição. Cada um destes grupos recorre a diferentes capacidades humanas.
As Técnicas de Codificação permitem atribuir um código, constituído por um reduzido número de
símbolos, a uma palavra ou frase. Estes códigos podem ser constituídos por símbolos numéricos, alfabéticos, alfanuméricos, ou mesmo símbolos gráficos. Segundo Bailey (1989: 483) existem essencialmente dois tipos de códigos, os arbitrários e os mnemónicos. Os códigos arbitrários podem ser bastante optimizados relativamente ao tamanho mas também são mais exigentes em termos da capacidade de
memória. Por este motivo não é possível a utilização de uma grande quantidade de códigos arbitrários.
Os códigos mnemónicos mantêm uma relação com aquilo que representam e por isso são mais fáceis
de memorizar. No entanto, devido a esta relação, não podem ser tão optimizados como os códigos
arbitrários. A quantidade de símbolos utilizados num código deve ser sempre menor que a quantidade
de símbolos existentes na mensagem associada. Depois de escrito, o código é expandido numa palavra
20
ou frase, havendo assim poupança no número de caracteres escritos. A expansão do código pode ser
efectuada automaticamente ou por ordem do utilizador.
As Técnicas de Predição, ao contrário das anteriores, não são tão exigentes ao nível das capacidades
de memória. Á medida que a pessoa escreve uma mensagem estes sistemas tentam adivinhar o que vai
ser escrito a seguir de modo a permitir poupar a escrita das restantes letras, palavras, frases ou símbolos gráficos. Por cada símbolo escrito estes sistemas apresentam um conjunto de hipóteses. Caso a
mensagem pretendida se encontre entre as várias propostas a pessoa pode concluir a sua escrita com
apenas uma selecção.
Como referimos anteriormente em certos sistemas é impossível apresentar simultaneamente no Conjunto de Selecção todos os símbolos e vocabulário pretendido. São consideradas técnicas de Expansão
de Vocabulário todos os métodos que permitam o acesso a estes elementos. Estas técnicas baseiam-se
normalmente na utilização de códigos ou níveis. Algumas das técnicas apontadas para a Aceleração da
Escrita também podem ser utilizadas para a Expansão de Vocabulário. A Expansão de Abreviaturas é
um exemplo. Cada abreviatura possibilita o acesso a uma palavra ou frase que não se encontra apresentada no Conjunto de Selecção. Outros sistemas utilizam níveis para a possibilitar o acesso do utilizador a este vocabulário. Em cada momento o Conjunto de Selecção apresenta um destes níveis.
2.6 Sistemas de Apoio à Comunicação Aumentativa e
Alternativa com Símbolos Gráficos
Nos SACAA com Símbolos Gráficos cada símbolo encontra-se associado a uma palavra. Estudos recentes realizados sobre frases comunicadas por adultos revelaram que as 100 palavras mais frequentes
cobriam cerca de 73% do total da amostra, indicando a existência de um núcleo de palavras, que acaba
por ser utilizado de uma forma sistemática na comunicação. Ainda assim o SACAA com Símbolos
Gráficos de um determinado utilizador poderá conter uma quantidade de símbolos assinalável de modo a satisfazer as necessidades básicas de comunicação. Dependendo das palavras que a pessoa pretender utilizar nas suas mensagens, poderá conter 100, 200, 300 ou mais símbolos. Para possibilitar o
acesso a este vasto conjunto de símbolos estes sistemas podem recorrer a técnicas de Expansão de
Vocabulário baseadas em níveis. Num primeiro nível a pessoa selecciona a categoria do símbolo e
numa segundo nível o símbolo pretendido. Por exemplo um SACAA com 100 símbolos poderá encontrar-se dividido em 10 categorias (e.g. alimentação, social e outras), contendo cada uma destas 10 símbolos. Neste caso apenas são utilizados dois níveis mas este valor poderá ser maior. Baker (1996), no
estudo destes sistemas, refere as dificuldades navegação e memória que sentiu ao utilizar um sistema
de comunicação de um indivíduo composto por cerca de 600 símbolos organizados por conteúdo, função e tópicos. Os problemas de navegação no sistema poderão ser agravados caso a pessoa necessite
de utilizar um acesso por varrimento.
21
Figura 2-12 - PathFinder com o sistema de símbolos Unity 128.
Para reduzir a quantidade de símbolos e por conseguinte a quantidade de níveis do sistema Baker desenvolveu uma técnica de codificação denominada Compactação Semântica. Com esta técnica cada
palavra encontra-se codificada através de uma sequência de dois ou três símbolos. Desta forma é obtida uma redução substancial no número de símbolos necessários. Em algumas situações é possível
apresentar no Conjunto de Selecção todos os símbolos do sistema em simultâneo. A Figura 2-12 ilustra uma destas situações. Os sistemas que utilizam esta técnica são designados de Sistemas de Múltiplos Significados (Multiple Meaning Systems), visto cada símbolo poder assumir um significado diferente, dependendo da sequência de símbolos na qual se encontra inserido. Os sistemas onde cada símbolo corresponde a uma única palavra são designados Sistemas de Significado Único (Single Meaning
Systems).
Existem vários sistemas que recorrem à Compactação Semântica para o apoio à comunicação, entre os
quais o Words Strategy TM, o Unity e o Language, Learning, and Living (LLL). Todos estes sistemas
possuem de raiz sequências de símbolos para um vasto número de palavras. Podem também ser introduzidas novas sequências pelo utilizador. O Words Strategy TM ao utilizar a sequência de uma caveira
seguida de uma zebra para representar a palavra pescoço, e o símbolo da medicina seguido da zebra
para representar a palavra garganta, está a criar redes semânticas diferentes para representar as diferentes partes externa e internas do corpo humano (Baker, 1994). Neste sistema foi escolhido o símbolo
da zebra por o ícone do símbolo representar bem o pescoço da zebra. A Caveira seguida de uma grande variedade de símbolos permite representar partes externas do corpo, o símbolo da medicina seguido
desses mesmos símbolos representa as correspondentes partes internas do corpo humano. Estes sistemas também permitem representar palavras com a mesma raiz morfológica com o recurso à associação
de símbolos especiais. Por exemplo, para representar a palavra lavar pode ser utilizada uma banheira
seguida de um símbolo com a palavra verbo, para representar a palavra lavado é utilizada a mesma
sequência seguida de um terceiro símbolo com o sufixo do. Para outras situações também podem ser
efectuadas sequências semelhantes.
22
Segundo Baker (1994) a Compactação Semântica permite um maior equilibro na relação entre o tamanho do Conjunto de Selecção e o comprimento das sequências de símbolos que representam uma palavra. O sistema LLL utiliza cerca de 100 ícones, em associações nunca superiores a quatro, para a representação de milhares de palavras e suas derivações morfológicas (Baker, 1994).
Uma das principais criticas a estes sistemas incide sobre a necessidade de memorização das várias
metáforas que conduzem à formação das várias sequências de símbolos. Baker (1996) defende a Compactação Semântica referindo que todos os Sistemas de Representação Gráfica recorrem extensivamente à utilização de metáforas nos seus símbolos. Os Sistemas de Significado Único conseguem
representar facilmente objectos concretos no entanto recorrem frequentemente a metáforas para a representação de conceitos mais abstractos. As metáforas permitem invocar as segundas iconicidades
dos símbolos. Segundo Baker os utilizadores destes sistemas também necessitam de recorrer extensivamente à memória pois as palavras nucleares da comunicação, por serem na sua maioria abstractas,
encontram-se normalmente representadas através de metáforas e não de uma forma directa. Como a
utilização das metáforas nestes sistemas é utilizada de uma forma had-oc, como último recurso, estas
tornam-se pouco eficazes. Baker refere que a Compactação Semântica assume a dificuldade na representação das palavras nucleares através de símbolos gráficos, por isso utiliza de uma forma sistemática
as metáforas na sua representação.
Como cada palavra é representada através de uma sequência predefinida, a sua construção pode ser
apoiada com o recurso a uma técnica denominada de Predição Icónica. Esta técnica apenas disponibiliza ao utilizador os símbolos que possam ser inseridos na sequência escrita até ao momento. No inicio
da construção de uma palavra, apenas são apresentados ao utilizador os primeiros símbolos das várias
sequências existentes, depois de seleccionado o primeiro símbolos e seguintes, o sistema continuará a
apresentar apenas símbolos que formem sequências possíveis no sistema.
Estes sistemas requerem no entanto um tempo de treino considerável, envolvendo muita prática e esforço. Muitas das vezes também não são bem aceites por pessoas sem quaisquer dificuldades cognitivas, ou pelos familiares, que preferem o recurso aos Sistemas de Comunicação Baseados no Alfabeto.
2.7 Sistemas de Apoio à Comunicação Aumentativa e
Alternativa com Símbolos do Alfabeto
Relativamente aos anteriores os sistemas que se baseiam no alfabeto necessitam de poucos símbolos
para a escrita das várias palavras de uma língua. Considerando as várias letras, algarismos e outros
caracteres, o total de símbolos pode rondar a quatro dezenas. Esta quantidade de símbolos pode ser
apresentada sem dificuldade no Conjunto de Selecção do sistema. No entanto a representação de uma
palavra nestes sistemas é em média maior que as representações utilizadas pelos sistemas anteriores.
Como referimos anteriormente os Sistemas de Múltiplo Significado conseguem representar uma pala-
23
vra através de uma sequência de dois ou três símbolos. Os Sistemas Baseados no Alfabeto podem
necessitar em média de cinco ou seis símbolos para representar uma palavra. Como tal nestes sistemas
é extremamente importante a utilização de técnicas que possibilitem a Aceleração da Escrita. Destas
técnicas as principais são a Predição de Palavras e a Expansão de Abreviaturas.
Os SACAA que efectuam Predição de Palavras são geralmente denominados Preditores de Palavras.
Por cada letra que o utilizador introduz estes sistemas propõem uma lista de palavras. A quantidade de
palavras apresentada varia de sistema para sistema, encontrando-se geralmente entre 1 e 15 palavras.
Em alguns casos este valor é fixo, noutros pode ser alterado. Estas palavras são apresentadas ao utilizador numa janela do programa. Caso a palavra pretendida se encontre entre as palavras preditas o
utilizador pode completar automaticamente a palavra, pressionando a tecla numérica ou de função
associada. Em algumas situações a palavra também pode ser seleccionada através de um clique do
rato. O utilizador evita assim a escrita dos restantes caracteres. Caso a palavra não se encontre na lista
o utilizador deve continuar a introduzir letras até esta aparecer na lista ou então até a palavra se encontrar completamente escrita. Estes sistemas permitem taxas de poupança de caracteres entre 20% e 50%
(Higginbotham et al., 1992).
2.7.1 Estratégias para a Predição de Palavras
Um Preditor de Palavras pode utilizar uma ou mais estratégias na selecção das palavras a propor. Higginbotham et al. (1992) referem as principais: (1) Letras Escritas; (2) Frequência de Palavras; (3) Recência de Palavras; (4) Associação de Palavras; (5) Gramática; (6) Tópicos.
A primeira destas estratégias é numa primeira fase utilizada por todos os preditores de palavras. Todos
estes apenas consideram como possíveis as palavras iniciadas pelas letras já escritas pelo utilizador.
As restantes estratégias são depois utilizadas na ordenação desta lista de palavras. As palavras julgadas
com mais importância para o utilizador ficarão situadas no topo da lista e serão apresentadas como
propostas do preditor de palavras. Recorrendo apenas às letras já escritas e utilizando uma ordenação
alfabética das palavras Tyvand e Demasco (1992), com um léxico de 15.000 palavras e uma janela de
predição de cinco palavras, reportam um taxa de poupança de caracteres de 33%.
A Frequência de Palavras é uma das estratégias mais utilizadas uma vez que proporciona taxas de
poupança de caracteres bastante elevadas. Esta estratégia atribui uma maior prioridade às palavras
mais frequentes numa dada Língua. Acrescentando este factor ao anterior Tyvand e Demasco (1992)
reportam uma Taxa de Poupança de Caracteres de 47% no estudo atrás referido.
A Recência de Palavras favorece as palavras utilizadas num passado próximo.
24
A Associação de Palavras atribui maior importância às palavras que aparecem com maior frequência a
seguir à palavra escrita anteriormente. De igual forma também pode ser considerada a frequência da
palavra com respeito às duas palavras anteriores.
Certos preditores de palavras também utilizam informação gramatical por forma a melhorar sua eficácia. Para tal, cada palavra deve encontrar-se associada a uma determinada etiqueta gramatical. Podem
no entanto ser utilizadas duas abordagens distintas: (1) Estratégia Gramatical com Regras; (2) Estratégia Gramatical com Estatística.
Através da primeira aproximação, a etiqueta gramatical da palavra anterior e as várias regras existentes no sistema são utilizadas na derivação de um conjunto de etiquetas gramaticais admissíveis para a
palavra que o utilizador está a escrever. As palavras com etiquetas gramaticais não pertencentes a este
conjunto são geralmente excluídas da lista de palavras possíveis pelo que este processo é considerando
por alguns como demasiado restritivo (Tyvand e Demasco, 1992).
A abordagem estatística é neste ponto mais flexível pois não há qualquer exclusão de palavras. Existindo informação sobre a frequência dos vários pares de etiquetas este método valoriza as palavras
cuja etiqueta gramatical segue com mais frequência em relação à etiqueta da palavra anterior. As palavra não valorizadas através deste factor mantém-se no entanto como candidatas às sugestões do preditor de palavras. O mesmo processo pode ser efectuado com o recurso a trios de etiquetas gramaticais.
Esta abordagem é semelhante à Associação de Palavras mas neste caso utilizando etiquetas gramaticais. No estudo desenvolvido por Tyvand e Demasco (1992) esta estratégia possibilitou um acréscimo
de 3%-5% na taxa de poupança de caracteres.
Certas palavras também podem ser agrupadas em tópicos através da atribuição de etiquetas apropriadas (e.g. estudos sociais, história, etc.). Desta forma, dependendo do tópico escolhido pelo utilizador
assim são valorizadas determinadas palavras.
Como estes sistemas podem recorrer a várias estratégias para a predição de palavras coloca-se o problema de como considerar as contribuições de cada um dos factores. A maioria dos autores propõe
uma combinação linear dos vários factores envolvidos na predição (Hutchens, 1995). Assim, através
da alteração dos vários coeficientes pode ser dada mais importância a uns e menos importância a outros. Determinados factores também podem ser eliminados da predição através da anulação do coeficiente correspondente.
Também já há algum tempo têm vindo a ser exploradas estratégias que envolvem a utilização de informação semântica e pragmática (Yang et al. 1990), no entanto sem grandes resultados práticos até ao
momento.
Lesher et al. (2002) referem dificuldades crescentes ao tentarem elevar a taxa de poupança de caracteres para valores acima dos 55%. Por forma a estabelecerem limites para a capacidade de predição des-
25
tes sistemas, desenvolveram alguns estudos. Com base em valores suportados pela Teoria da Comunicação de Shannon estimaram para a taxa de poupança de caracteres um valor máximo de 85% desde
que fosse explorada toda a predictibilidade da Língua Inglesa. Como referem estes autores tal sistema
não resultaria na prática pois implicaria um teclado composto por uma matriz de letras, sequências de
letras e palavras em constante mudança. Estas alterações até confundiriam o utilizador mais concentrado. Nesse mesmo estudo Lesher et al. utilizando os melhores preditores de palavras conhecidos até
à data, os humanos, obtiveram em algumas situações valores para a taxa de poupança de caracteres
acima dos 55%, em alguns casos até 70%, mostrando que ainda há novas estratégias a explorar nesta
área.
2.7.2 Léxicos
O Léxico também é um componente importante de um preditor de palavras devendo encontrar-se ajustado às estratégias utilizadas. O Léxico deve possuir um conjunto de conhecimentos sobre a língua
utilizada. Pode consistir apenas numa lista de palavras, conter também a frequência de cada palavra,
ou armazenar ainda as frequências dos vários pares ou trios de palavras numa dada língua. Para cada
palavra pode conter ainda variada informação gramatical como a categoria, pessoa ou número.
Os preditores de palavras podem utilizar um Léxico Fixo ou Adaptativo. No primeiro caso o Léxico
permanece inalterado ao longo das várias utilizações. Na segunda situação vai incorporando novas
palavras e ajustando vários factores, como a frequência das palavras, a recência, e frequência de pares
e trios de palavras a um utilizador em particular. Os sistemas com Léxico Fixo tornam-se por isso mais
previsíveis para o utilizador, pois para uma mesma situação propõem o mesmo conjunto de palavras,
apoiando assim o desenvolvimento de padrões motores e cognitivos na utilização do sistema (Cook e
Hussey, 1995: 495). Segundo Blackstone (1990) esta automaticidade é extremamente importante na
melhoria da performance de pessoas que utilizam estes sistemas.
Um estudo desenvolvido por Higginbotham (1992) revelou que o efeito da aquisição de novas palavras para o léxico não resultava sempre em aumentos significativos da taxa de poupança de caracteres.
Este autor refere que em léxicos com mais de 1.000 palavras a introdução de uma nova palavra contribui relativamente pouco para a taxa de poupança de caracteres. Este resultado encontra-se em sintonia
com a existência de um núcleo de palavras que acaba por ser utilizado sistematicamente na comunicação.
Alguns sistemas também possuem léxicos adaptados a vários grupos etários. O Wivik possui quatro
léxicos diferentes, um geral, vocacionado para adultos, com 4530 palavras, um elementar, destinado a
crianças entre os 2 e 8 anos, formado por 2040 palavras, um intermédio, para crianças dos 9 aos 12
anos e um outro para adultos e jovens a partir dos 13 anos, com 7533 palavras.
26
No estudo efectuado por Higginbotham (1992) também não foram notadas melhorias na taxa de poupança de caracteres através da utilização de léxicos específicos para um determinado grupo etário. No
entanto o autor refere que estes léxicos específicos podem beneficiar outros propósitos como por
exemplo a aprendizagem da leitura e da escrita.
As dimensões dos léxicos utilizados pelos vários sistemas também são muito variáveis. Alguns preditores de palavras possuem léxicos relativamente pequenos, formados por 5.000 palavras (e.g. Wivik),
outros utilizam léxicos com um elevado número de palavras, cerca de 100.000 (e.g. Aurora). Como
referimos anteriormente, para além de um certa quantidade de palavras no léxico, não são obtidos aumentos significativos no processo de predição. Os autores do preditor de palavras Aurora sustentam no
entanto a utilização de léxicos de maiores dimensões referindo que, sendo os custos computacionais
semelhantes nos dois casos, não há razão para não se apoiar a escrita de palavras menos utilizadas,
ainda que o apoio seja estatisticamente pouco expressivo.
2.7.3 Problemas dos Sistemas de Predição de Palavras
Estudos mais recentes têm no entanto revelado que a carga sensorial e cognitiva imposta ao utilizador,
na pesquisa da lista de palavras preditas, pode comprometer a aceleração da escrita. Num destes estudos, Venkatagiri (1994) utilizando tamanhos de 5, 10 e 15 palavras, para a lista de palavras preditas,
verificou que aumentando o tamanho desta lista aumentava também a taxa de poupança de caracteres,
pois as palavras eram propostas mais cedo ao utilizador. No entanto os valores obtidos para as taxas de
comunicação mantiveram-se aproximadamente iguais nas três situações. Com a lista de 15 palavras foi
obtida uma maior taxa de poupança de caracteres mas o tempo que o utilizador demorou a pesquisar as
palavras pretendidas na lista contrabalançou o tempo poupado na escrita dos caracteres, não havendo
por isso melhorias na taxa de comunicação. Estes resultados mostram o impacto que o tempo de pesquisa na lista de palavras preditas pode ter na performance do sistema. Estudos desenvolvidos por
Koester e Levine (1994, 1996) revelaram também este problema.
De modo a estudar a influência dos vários factores na predição de palavras, Koester e Levine (1995,
1997, 1998) desenvolveram alguns modelos matemáticos que permitem simular a performance de um
utilizador de um preditor de palavras. Na construção de um destes modelos Koester e Levine (1998),
incluíram características do utilizador (tempo de digitalização, tempo de pesquisa na lista de palavras
preditas), a estratégia utilizada na pesquisa da lista de palavras (pesquisar sempre, pesquisar após a
escrita de duas, três, ou quatro novas letras) e a configuração do sistema de predição de palavras (taxa
de poupança de caracteres). Para o modelo formulado obtiveram um erro de 9,2% quando comparado
com resultados reais. Efectuando simulações para vários perfis de utilizador, traduzidos através de
vários valores para os parâmetros de entrada do modelo, estes autores assinalaram as várias situações
nas quais a predição de palavras pode acelerar a escrita. Um dos resultados importantes deste estudo
indica que dependendo das características do utilizador assim deve ser utilizada uma determinada estratégia na pesquisa da lista de palavras preditas. Esta estratégia é importante para que sejam obtidos
27
benefícios com a utilização da predição de palavras. O modelo também indicou que quanto maior for a
taxa de poupança de caracteres maior é a possibilidade destes sistemas beneficiarem um determinado
utilizador. Para melhorar esta taxa este autores sugerem a predição por associação de palavras, a utilização de informação sintáctica e a possibilidade de manipulação do número de palavras preditas na
lista. Através deste modelo estes autores também verificaram que as variáveis com mais impacto na
performance do sistema são as características do utilizador (Tempo de Digitalização, Tempo de Pesquisa na Lista de Palavras Preditas) o que revela a importância da interacção com o utilizador nestes
sistemas.
Por forma a optimizar estes valores Koester e Levine (1998) efectuam várias sugestões quer ao nível
da intervenção clínica quer ao nível do desenho do sistema. Para uma melhoria do tempo de digitalização sugerem a escolha de um dispositivo de acesso ao computador adequado, um correcto posicionamento do teclado, um correcto posicionamento da pessoa de modo a esta permanecer estável durante a
escrita, o desenvolvimento de formatos de teclados mais eficientes, flexibilidade na localização das
teclas para completar as palavras, a adopção de estratégias para a consulta da lista de palavras preditas
e apoio a estas estratégias por parte do próprio sistema, por exemplo, mostrando e escondendo esta
lista nos momentos apropriados. Relativamente a este ponto Newell et al. (1992) referem a importância em minimizar o desvio do olhar entre os vários elementos que interagem com o utilizador, o teclado, o texto e a lista de palavras preditas. Para tal sugerem o posicionamento do ecrã junto do teclado e
a lista de palavras preditas junto do texto. Para utilizadores de teclados de ecrã com varrimento estes
autores propõem a integração da lista de palavras preditas no teclado de ecrã de modo a minimizar os
desvios do olhar entre os vários elementos.
Para a melhoria do tempo de pesquisa na lista, Koester e Levine (1998) sugerem processos que promovam a antecipação do seu conteúdo, como a utilização de léxicos fixos. Também sugerem métodos
que evitem a pesquisa linear da totalidade da lista, como a ordenação alfabética das palavras, ao invés
da ordenação por frequência, ou a codificação da lista com cores, tendo em consideração a classe de
cada palavra (e.g. azul para verbos, verde para nomes). Relativamente a este aspecto Newell et al.
(1992) refere a importância da utilização de listas com cinco palavras, por este números se situar no
intervalo de elementos que podem ser captados com um só olhar. Estes autores indicam ainda que uma
lista vertical fornece pistas claras sobre o tamanho de cada palavra facilitando assim a decisão sobre a
sua leitura ou não.
Newell et al. (1992) refere no entanto que a validade destes sistemas não pode ser julgada apenas com
base nas taxas de poupança de caracteres ou taxa de comunicação proporcionada, visto haver evidências significativas sobre a influência destes sistemas na qualidade do texto produzido. Vários estudos
indicam que em determinadas situações os preditores de palavras ajudam as pessoas a criar textos com
menos erros gramaticais (Tyvand e Demasco, 1992)(Morris et al., 1992), menos erros ortográficos e
com uma melhor qualidade global (Magnuson, 1995), promovendo assim também o processo de aprendizagem da leitura e escrita (Blackstone, 1990)(Higginbotham, 1992)(Klund e Novak, 2001). Para
28
além destes aspectos a maximização da eficiência motora pode reduzir a fadiga de alguns utilizadores
permitindo que estes trabalhem durante mais tempo e com mais conforto (Koester e Levine, 1996).
O tempo de treino necessário para uma familiarização com os preditores de palavras é geralmente
pequeno quando comparado com outros sistemas, mas variável de utilizador para utilizador. Newell et
al. (1992) referem que um bom aluno de uma escola secundária poderá aprender a utilizar o sistema no
espaço de uma a duas horas, ao passo que uma criança com pouca experiência em computadores, que
esteja a aprender a ler e escrever poderá demorar entre três a quatro semanas de treino intensivo (uma
hora por semana) seguida de um mês de apoio na sala de aula.
Em vários estudos realizados sobre Predição de Palavras os autores registaram uma constante melhoria
na performance dos utilizadores com o tempo de prática (Koester e Levine, 1994, 1996).
2.7.4 Estratégias para a Expansão de Abreviaturas
A Expansão de Abreviaturas é uma técnica de codificação utilizada para o aumento da taxa de comunicação. Nestes sistemas cada palavra ou frase possui uma abreviatura única. Estas abreviaturas podem encontrar-se predefinidas no sistema ou então podem ser definidas pelo próprio utilizador. Em
alguns casos são possíveis ambas as situações. Segundo Bailey (1989: 504) existem vária formas através das quais podem ser criadas abreviaturas para palavras. Através da Truncagem a abreviatura é
formada com base nas primeiras letras da palavra, desta forma a abreviatura da palavra comando poderia ser com. Através da Contracção a abreviatura é formada retirando-se da palavra todas a vogais.
Assim, para a palavra comando a abreviatura seria cmnd. Para a abreviatura de frases podem também
ser utilizadas as iniciais das várias palavras que a compõem (Cook e Hussey, 1995: 489), como por
exemplo BD para Bom Dia. Para apoiar este processo têm sido desenvolvidas ferramentas para criação
automática de abreviaturas (Stum, 1991). Para a diminuição do número de abreviaturas é frequente
abreviar apenas as palavras mais utilizadas, que por isso fazem, como já referimos, parte do Núcleo de
Palavras da Comunicação. Também é preferível não atribuir abreviaturas a palavras pequenas de modo
a ficarem disponíveis para palavras maiores.
Após a escrita da abreviatura esta é expandida na palavra ou frase correspondente, quer por iniciativa
do sistema quer por ordem expressa do utilizador. Na primeira situação o sistema evita que a pessoa
tenha de pressionar uma tecla adicional para a expansão da abreviatura, no entanto este método pode
provocar a ocorrência de expansões indesejadas, quando o inicio da palavra que o utilizador se encontra a escrever coincide com uma abreviatura existente no sistema. Nestas ocasiões diz-se que houve
uma colisão. O sistemas que expandem as abreviaturas por iniciativa própria resolvem este problema
disponibilizando ao utilizador uma tecla para desfazer as expansões não desejadas. Na segunda situação o utilizador necessita de pressionar uma tecla predefinida sempre que queira expandir uma abreviatura, não havendo assim, em relação à forma anterior, uma economia tão grande nas teclas pressionadas. No entanto apresenta a vantagem de colocar a decisão de expansão sob o controlo do utilizador.
29
A Expansão de Abreviaturas é apontado com um dos métodos que potencialmente permite uma maior
taxa de comunicação. No entanto requer do utilizador uma grande capacidade de memorização. Por
este motivo estes sistemas apresentam um tempo de treino elevado quando comparados com os preditores de palavras, pois numa primeira fase o utilizador necessita de memorizar as várias abreviaturas
predefinidas ou de introduzir as suas próprias abreviaturas no sistema. Durante o tempo de familiarização com o sistema, ou mesmo quando da sua utilização efectiva a pessoa pode apoiar-se numa lista
de abreviaturas, mas a consulta desta lista irá atrasar o processo de escrita.
Por forma a evitar a memorização de longas listas de abreviaturas têm sido desenvolvidos sistemas
que com base numa abreviatura escrita pelo utilizador tentam inferir a palavra ou frase correspondente
(Stum, 1992). Nestes sistemas não existe um esquema de abreviaturas fixo, o utilizador apenas necessita de escrever uma abreviatura aceitável para a palavra ou frase pretendida. A seguir o sistema deve
inferir esta palavra ou frase com base num conjunto de conhecimentos sobre a forma como as pessoas
constroem abreviaturas assim como no historial do utilizador. Estes sistemas apresentam o problema
de serem computacionalmente bastante exigentes (Stum, 1991) e de inferirem várias palavras ou frases
possíveis, entre as quais o utilizador deve escolher a pretendida. Estas duas situações podem atrasar o
processo de escrita.
2.8 Comparação entre os vários Sistemas de Apoio à
Comunicação Aumentativa e Alternativa
Num estudo comparativo entre vários SACAA, cada qual dotado de uma das técnicas apresentadas
(compactação semântica, predição de palavras e expansão de abreviaturas), Higginbothan (1992) obteve taxas de poupança de caracteres entre 31%-48%, tendo os preditores de palavras apresentado uma
maior eficiência. Contabilizando apenas as palavras existentes no léxico de cada sistema a compactação semântica apresentou as maiores taxas de poupança de caracteres, cerca de 60%. Segundo o autor
as diferenças encontradas nos vários sistemas devem-se a uma combinação do algoritmo de selecção e
léxico utilizado. Este estudo foi no entanto realizado com textos escritos e por isso os seus resultados
não podem ser generalizados para outra forma de comunicação, como por exemplo a conversação.
Por forma a possibilitar a obtenção de dados quantitativos sobre a utilização efectiva de SACAA´s
começaram recentemente a ser desenvolvidos sistemas de registo que monitorizam toda a actividade
do sistema. A análise dos dados obtidos permite então a avaliação e ajustamento do sistema quer por
parte de terapeutas, investigadores ou fabricantes. A primeira ferramenta desenvolvida com este propósito foi o sistema LAM. Inicialmente desenvolvido apenas para SACAA´s dedicados foi posteriormente proposto como sistema de registo para qualquer SACAA. O funcionamento do LAM é muito
simples. Este sistema, através da porta série do SACAA obtém o caracter gerado em cada momento,
efectuando de seguida o registo desse caracter assim como o tempo da sua ocorrência num ficheiro.
Lesher et al. (2000) indicam que o formato deste registo é limitado e pouco flexível tendo em consideração as necessidades da comunidade que estuda esta problemática e por isso propuseram o Formato
30
Figura 2-13 - Ferramenta do Comspec para a integração de componentes.
Universal para o Registo da CAA, com um conjunto de capacidades de registo bem mais extensas que
o LAM. Para assegurar a compatibilidade com o LAM, o formato de registo deste último é um
subconjunto do Formato Universal para o Registo da CAA. Lesher et al. (2000) também iniciaram o
desenvolvimento de uma ferramenta de apoio à análise dos dados recolhidos que denominaram de
ACQUA (Augmentative Communication Quantitative Analisys).
Para a melhoria da performance destes sistemas Higginbotham (1992) propõe o desenvolvimento de
sistemas híbridos que incorporem as melhores características proporcionadas por cada método. A título de exemplo refere que as palavras pertencentes ao vocabulário nuclear podem ser escritas com recurso a um método de codificação (e.g. Compactação Semântica e Expansão de Abreviaturas), e as
restantes palavras escritas com o recurso a um método de predição (e.g. Predição de Palavras). Seria
por isso desejável a existência de SCAA’s que disponibilizassem uma grande variedade de métodos e
técnicas de modo a ser possível a implementação do melhor sistema para uma determinada pessoa.
Para a construção de sistemas mais adequados às necessidades e capacidades de cada pessoa seria
importante a existência de componentes hardware e software que sendo compatíveis entre si possibilitassem a sua integração em diferentes soluções de CAA. Têm sido efectuados alguns esforços para o
desenvolvimento deste tipo de sistemas modulares. Um exemplo destes esforços é o Projecto Comspec. Este projecto levado a cabo por um conjunto de organizações europeias, desenvolveu uma arquitectura modular que possibilita a criação de diferentes SCAA´s. Esta arquitectura é composta por vários componentes e mecanismos de comunicação entre estes. Encontra-se desenvolvida sobre a tecnologia Java e possibilita a criação de novos componentes. O Comspec também fornece um conjunto de
ferramentas que permitem manipular de uma forma visual os vários componentes de um sistema. Esta
característica é importante porque possibilita uma maior participação dos técnicos de reabilitação no
desenvolvimento deste tipo de sistemas. A Figura 2-13 ilustra uma destas ferramentas. Estes sistemas
modulares estão agora a dar os primeiros passos. É necessária mais investigação sobre estes sistemas,
os seus componentes e sobre a forma como estes interagem entre si. Estes conhecimentos são importantes para a construção de melhores SCAA´s.
31
32
3. Predição de Palavras
A Predição de Palavras é uma técnica utilizada pelos SCAA’s para a aceleração da escrita. Os sistemas, ou componentes de um SCAA, que utilizam esta técnica são geralmente denominados Preditores
de Palavras. Do ponto de vista exterior o funcionamento destes sistemas é muito simples. Por cada
letra introduzida pelo utilizador estes sistemas propõem uma lista de palavras. Esta lista é normalmente designada de Lista de Palavras Preditas. Caso a palavra pretendida se encontre nesta lista o utilizador pode completar automaticamente a palavra, pressionando a respectiva tecla numérica ou tecla de
função. Esta selecção também pode ser efectuada através de um clique do rato. Com esta operação o
utilizador evita assim a escrita dos restantes caracteres. Caso a palavra não se encontre na lista o utilizador deve continuar a introduzir novas letras até esta aparecer na lista, ou então até estar completamente escrita.
Do ponto de vista interno estes sistemas são naturalmente mais complexos. A Figura 3-1 apresenta um
esquema genérico de um Preditor de Palavras. Neste esquema encontram-se representados os seus
principais componentes, o Léxico e o Algoritmo de Predição. A entrada do sistema consiste no Texto
escrito pelo utilizador e a sua saída a Lista de Palavras Preditas.
O Léxico pode ser considerado como uma lista de palavras com um conjunto de informação associada,
seja esta estatística, sintáctica, morfológica, semântica, ou outra. Para além do Léxico, alguns preditores de palavras também recorrem a uma outra fonte de conhecimentos, as Regras Sintácticas, que informam, ao nível sintáctico, as diferentes possibilidades de encadear palavras para formar uma frase.
O Algoritmo de Predição é o componente responsável pelo processamento da informação disponível
de modo a ser obtida a Lista de Palavras Preditas. Ao receber o Texto, o Algoritmo de Predição deve
recorrer às suas fontes de informação, o Léxico e em alguns caso às Regras Sintácticas, de modo a
inferir um conjunto de palavras, as Palavras Preditas, que depois serão apresentadas ao utilizador. Dependendo das abordagens utilizadas no desenvolvimento de cada um destes componentes assim são
obtidos diferentes mecanismos de predição de palavras. Neste capítulo iremos discutir as várias opções
tomadas no desenvolvimento do preditor de palavras do nosso SACAA.
No desenvolvimento do nosso preditor de palavras decidimos não utilizar um módulo de Regras Sintácticas. O desenvolvimento de um bom sistema de regras para a Língua Portuguesa, ou para qualquer
outra língua, é um processo complexo, demorado e que requer participação de especialistas da área.
Para além disso os benefícios proporcionados por estes sistemas de regras têm-se mostrado diminutos
quando comparados com os custos do seu desenvolvimento. Por outro lado a utilização de um sistema
de regras menos afinado poderia restringir demasiado o conjunto de palavras candidatas, impedindo
assim a proposta de determinadas palavras correctas ao utilizador.
33
Figura 3-1 - Esquema genérico para um Preditor de Palavras.
Adoptámos por isso uma abordagem estatística no processo de predição de palavras. Para além dos
conhecimentos estatísticos utilizados tradicionalmente na predição de palavras, como sejam a frequência de cada palavra, ou frequência de sequências de palavras também decidimos introduzir no Léxico
conhecimento sintáctico na forma estatística, mais especificamente a frequência de sequências de classes gramaticais. Como vantagem a abordagem estatística permite a obtenção da informação necessária
através do processamento automático de um Corpus de textos para a Língua Portuguesa. Por este motivo estes sistemas podem ser facilmente adaptados ao contexto de uma outra língua desde que se disponha de um conjunto de textos em quantidade suficiente para retirar a informação estatística necessária. O nosso sistema pode assim ser considerado um preditor de palavras estatístico ou probabilístico.
De seguida iremos abordar ao nível conceptual e de implementação o mecanismo de predição utilizado.
3.1 Algoritmo de Predição
A entrada do Algoritmo de Predição consiste no Texto escrito pelo utilizador até ao momento. Definimos este Texto como sendo uma sequência de I palavras, seguidas do Prefixo da palavra que o utilizador se encontra a escrever: pal1, pal2, ..., palI-1, palI, pref. Passamos a designar esta palavra palI como Palavra Anterior, simbolicamente pala. Assim esta mesma sequência de Texto pode ser representada por: pal1, pal2, ..., palI-1, pala, pref. Na Figura 3-2 apresenta-se a evolução da escrita de uma frase.
Na Figura 3-2 a) o utilizador está a escrever uma palavra. A Palavra Anterior é ‘esta’ e o Prefixo
‘fra’. Na Figura 3-2 b) o utilizador prepara-se para escrever uma nova palavra. Neste caso a Palavra
Figura 3-2 - Duas situações
diferentes para o texto do utilizador.
34
Figura 3-3 - As várias etapas do processo de predição de palavras
Anterior é igual a ’é’ e o Prefixo inexistente, ou vazio.
Com base no Texto escrito o Algoritmo de Predição deve encontrar um conjunto de Palavras Candidatas no Léxico, que depois irá classificar com o recurso a informação estatística retirada de textos escritos na Língua Portuguesa. No final serão obtidas as palavras melhor classificadas e apresentadas ao
utilizador como as Palavras Preditas. O Algoritmo de Predição que implementámos pode ser dividido
em três etapas distintas: (1) Restrição de Palavras do Léxico; (2) Classificação de Palavras Candidatas;
(3) Selecção das Palavras Preditas. Este processo encontra-se ilustrado na Figura 3-3.
3.1.1 Restrição das Palavras do Léxico
Na primeira etapa o preditor de palavras obtém um conjunto Palavras Candidatas através da aplicação
de um conjunto de restrições ao Léxico. Nesta etapa é obtido o conjunto de Palavras Possíveis. Para
esta operação deve ser utilizado o prefixo pref da palavra que o utilizador se encontra a escrever. Neste
caso as Palavras Possíveis serão todas aquelas que começam com aquele prefixo. No entanto pode
acontecer ainda não ter sido escrito nenhum caracter da palavra, como sucede na Figura 3-2 b). Nesta
situação qualquer palavra do Léxico poderia ser uma Palavra Possível. Para reduzir o conjunto de Palavras Possíveis, o nosso preditor de palavras recorre à palavra que se encontra antes do cursor e que já
definimos atrás como Palavra Anterior. Neste caso as Palavras Possíveis serão todas aquelas que habitualmente surgem a seguir a esta palavra.
A obtenção deste conjunto de Palavras Possíveis é importante para a redução da quantidade de dados a
processar nas etapas seguintes. Para além deste motivo também poderão ser aplicadas restrições adicionais, com outros objectivos. No nosso sistema introduzimos a possibilidade eliminar do conjunto de
Palavras Possíveis, as palavras que possuem um determinada letra (e.g. k, w, y), uma determinada
sequência de letras (e.g. lh, nh, ch), ou palavras cujo tamanho ultrapassa um determinado limite. Julgamos estas restrições importantes na aplicação do Preditor de Palavras à aprendizagem da leitura e da
escrita. Assim é possível evitar a proposta de palavras com determinadas letras, ou sequências de le-
35
Factores de Restrição
As letras já introduzidas da palavra
A palavra introduzida anteriormente
Letras não pretendidas
Sequências de letras não pretendidas
Tamanho máximo para as palavras preditas
Quadro 3-1- Factores de Restrição no Processo
de Predição.
tras que ainda não foram aprendidas. Através da limitação do tamanho das palavras também é possível
forçar o sistema a propor palavras de pequenas dimensões, e por isso, menos complexas para crianças
em fase de aprendizagem. O professor pode assim conjugar os vários factores de modo a atingir determinados objectivos educativos. Na Figura 3-4 apresenta-se a caixa de diálogo na qual pode ser
efectuada a configuração destes factores. A totalidade dos factores utilizados nesta primeira fase foi
denominada Factores de Restrição e encontram-se sumariados no Quadro 3-1.
As palavras que ultrapassam esta primeira etapa são consideradas as Palavras Candidatas. Definimos o
conjunto de J palavras candidatas como PC = {pc1, pc2, ..., pcJ}, sendo pcj a j-ésima palavra deste conjunto, com 0 < j < J.
Figura 3-4 – Caixa de diálogo para configuração dos factores de restrição
com objectivos educativos (em cima) e os coeficientes dos factores de predição
(em baixo).
36
3.1.2 Classificação das Palavras Candidatas
Após a obtenção das Palavras Candidatas o preditor de palavras deve então classificar cada uma destas
utilizando um conjunto de informação estatística sobre a Língua Portuguesa. Sendo PC o conjunto de
palavras candidatas {pc1, pc2, ..., pcJ} definimos o conjunto de J palavras candidatas classificadas,
PCC, como { (pc1, c1), (pc2, c2), ..., (pcj, cJ)}, no qual cj é a classificação atribuída à palavra pcj, com 0
< j < J.
Para obter a classificação cj para a palavra pcj o nosso sistema recorre a vários factores de natureza
estatística. Cada factor contribui com uma classificação parcial para a classificação final de cada palavra candidata pcj. Estes factores que denominámos de Factores de Classificação encontram-se listados
no Quadro 3-2.
Em qualquer língua existem palavras muito utilizadas, outras nem tanto, outras raramente. A frequência ou probabilidade de uma palavra na Língua Portuguesa é um valor de difícil precisão. Na verdade
cada palavra pode ter diferentes frequências dependendo do tipo de discurso, tema ou tempo. A manipulação deste tipo de informação obriga assim à utilização de estimativas destes valores. Estas estimativas são normalmente obtidas através da análise estatística de grandes corpora de textos. Os valores
para estas estimativas encontram-se correctos para os textos analisados mas poderão não ser os mais
correctos noutros contextos. Ao longo desta tese quando nos referirmos à probabilidade de uma palavra ou par de palavras estaremos a referir-nos a estas estimativas, com um determinado valor num
contexto definido, e não ao seu valor exacto para o caso geral da Língua Portuguesa.
A frequência de determinada palavra pode assim ser utilizada como um factor para a classificação das
palavras candidatas. Sendo p(pal) a probabilidade da palavra pal o nosso preditor de palavras utiliza a
probabilidade p(pcj) para a obtenção de uma classificação parcial para cada palavra candidata pcj. Desta forma as palavras mais frequentes obterão uma melhor classificação parcial.
Para a classificação das palavras candidatas pode ainda ser utilizada a informação contextual existente
nas últimas N-1 palavras anteriores, pal1, pal2, ..., palN-2, pala. Em qualquer língua as várias palavras
que formam uma frase encontram-se encadeadas segundo regras bem definidas. Por este motivo uma
Factores de Classificação
A probabilidade de uma palavra
A probabilidade de uma palavra conhecendo a palavra anterior
A probabilidade de uma classe gramatical conhecendo a classe gramatical da palavra anterior
A probabilidade de uma palavra para o utilizador
A probabilidade de uma palavra conhecendo a palavra anterior, para o utilizador
Quadro 3-2 - Factores de Classificação no Processo de Predição.
37
determinada palavra pode surgir com uma certa frequência a seguir a uma sequência de palavras, e
raramente ou nunca, a seguir a outra sequência de palavras. A probabilidade de uma palavra pal surgir
a depois de uma sequência de N-1palavras, pal1, pal2, ..., palN-2, pala, é dada pela probabilidade condicional p(pal | pal1, pal2, ..., palN-2, pala).
A probabilidade condicional p(pcj | pal1, pal2, ..., palN-2, pala), que indica a probabilidade da palavra
candidata pcj, surgir, conhecendo-se a sequência de palavras anteriores, pal1, pal2, ..., palN-2, pala, pode
assim ser utilizada na obtenção de uma outra classificação parcial para cada palavra candidata pcj. Esta
probabilidade condicional pode ser calculada através da Eq. (3.1).
p(pcj | pal1, pal2, ..., paln - 1, pala) =
p(pal1, pal2, ..., paln - 2, pala, pcj)
p(pal1, pal2, ..., paln - 2, pala)
(3.1)
Na Eq. (3.1) a probabilidade p(pal1, pal2, ..., palN-2, pala, pcj) representa a probabilidade da sequência
de N palavras, pal1, pal2, ..., palN-2, pala, pcj e p(pal1, pal2, ..., palN-2, pala) a probabilidade da sequência de N-1 palavras, pal1, pal2, ..., palN-2, pala. Uma associação de N palavras pal1, pal2, ..., palN-2, pala,
pcj é denominada N-grama de palavras. Uma associação formada por duas palavras é denominada
bigrama, por três palavras, trigrama e assim sucessivamente. Esta abordagem implica por isso o armazenamento das probabilidades de todas as sequências possíveis de N e de N-1 palavras, no Léxico do
sistema. Quanto maior o valor de N, maior o contexto utilizado, e por isso, com mais informação será
possível a realização de uma predição de palavras mais eficaz. Por outro lado, quanto maior o valor de
N, maior a quantidade de sequências possíveis de palavras, ou ngramas de palavras. Para valores de N
superiores a 2 a quantidade de ngramas é de tal ordem que o tempo necessário ao seu processamento
seria incompatível com os propósitos de um preditor de palavras. O nosso sistema utiliza por isso apenas bigramas de palavras. Considerando um léxico de 50.000 palavras, o número máximo de bigramas
será 50.000 × 50.000, um valor elevado, mas devido à frequência nula de muitos pares de palavras, por
não serem admissíveis na Língua Portuguesa, o número de bigramas será reduzido para um valor
computacionalmente razoável. Assim, para N = 2, a Eq. (3.1) reduz-se à Eq. (3.2) .
p(pci | pala) =
p( pala, pci)
p( pala)
(3.2)
Para o cálculo desta probabilidade condicionada, p(pcj | pala), que indica a probabilidade da palavra
candidata pcj dada a palavra anterior, pala, é necessário dispor da probabilidade do bi-grama de palavras pala, pcj, dada por p( pala, pcj), e a probabilidade da palavra anterior pala, dada por p( pala).
Também quisemos dotar o sistema de uma certa capacidade para propor predições gramaticalmente
correctas. Para tal foi seguida uma estratégia estatística em tudo semelhante à anterior. Como consequência das regras gramaticais de um língua existem classes gramaticais que surgem com mais frequência a seguir a determinadas sequências de classes gramaticais. Consideremos a sequência de N-1
palavras, pal1, pal2, pal3, ..., palN-2, pala, pertencentes a uma frase gramaticalmente correcta e atribua-
38
mos a cada uma destas palavras uma classe gramatical, cg1, cg2, cg3, ..., cgN-2, cga, respectivamente. A
probabilidade da classe gramatical cg surgir a seguir à sequência de N-1 classes gramaticais, cg1, cg2,
cg3, ..., cgN-2, cga, é dada pela probabilidade condicional p(cg | cg1, cg2, cg3, ..., cgN-2, cga).
Consideremos cgj a classe gramatical da palavra candidata pcj. A probabilidade condicional p(cgj | cg1,
cg2, cg3, ..., cgN-2, cga), que indica a probabilidade da classe gramatical, cgj, surgir, conhecendo-se a
sequência de classes gramaticais anteriores, cg1, cg2, cg3, ..., cgN-2, cga, foi também utilizada como
uma classificação parcial para cada palavra candidata pcj. Esta probabilidade condicional pode ser
calculada através da Eq. (3.3).
p(cgj | cg1, cg2, ..., cgN - 2, cga) =
= p( cg1, cg2, ..., cgN - 2, cga, cgj)
p(cg1, cg2, ..., cgN - 2, cga)
(3.3)
Na Eq. (3.3) a probabilidade p(cg1, cg2, cg3, ..., cgN-2, cga, cgj) representa a probabilidade do ngrama
de classes gramaticais, cg1, cg2, cg3, ..., cgN-2, cga, cgj, e p(cg1, cg2, cg3, ..., cgN-2, cga) a probabilidade
do N-1-grama de classes gramaticais, cg1, cg2, cg3, ..., cgN-2, cga. Considerações semelhantes às anteriores poderiam ser feitas relativamente ao valor de N. Há no entanto uma diferença. Como o número
de classes gramaticais é muito inferior ao número de palavras existentes num Léxico, poderiam ser
utilizadas nesta abordagem sequências de classes gramaticais maiores, digamos, trigramas de classes
gramaticais. Apesar deste facto utilizámos apenas bigramas. Desta forma, para N = 2, a Eq. (3.3) reduz-se à Eq. (3.4).
p(cgj | cga) =
p( cga, cgj)
p( cga)
(3.4)
Para o cálculo da probabilidade condicionada p(cgj | cga), que indica a probabilidade da classe gramatical da palavra candidata pcj, dada a classe gramatical da palavra anterior, cga, apenas é necessário
conhecer a probabilidade do bigrama de classes gramaticais cga, cgj, dada por p(cga, cgj), e a probabilidade da classe gramatical da palavra anterior, cga, dada por p(cga).
Na Língua Portuguesa existem palavras com a mesma grafia mas com sentidos diferentes e por isso
com classes gramaticais diferentes (palavras homógrafas e palavras homónimas). Nestas situações a
classe gramatical da palavra pode ser determinada com o recurso a um analisador sintáctico. No entanto estes analisadores requerem normalmente uma frase completa para a determinação da categoria
gramatical de uma das suas palavras, o que não acontece na predição de palavras, pois em cada momento apenas dispomos de uma parte da frase que o utilizador se encontra a escrever. Assim, para
simplificar esta abordagem apenas associámos categorias gramaticais às palavras com uma forma gráfica única (palavras não homógrafas e não homónimas). Na forma escrita estas palavras não necessitam de uma avaliação do contexto para a determinação da sua categoria gramatical. A categoria gramatical é obtida simplesmente com o recurso à sua forma gráfica. Às restantes palavras não foi atribuída uma categoria gramatical. Desta forma, ao utilizarmos este factor no processo de classificação,
39
beneficiámos as palavras com categoria gramatical atribuída (palavras não homógrafas e não homónimas) em detrimento das palavras sem categoria gramatical atribuída (palavras homógrafas ou homónimas). Como veremos adiante esta simplificação comprometeu a eficácia deste factor. No futuro teremos de prever a possibilidade de uma palavra na forma escrita poder representar diferentes palavras
e assim estar associada a diferentes classes gramaticais. Uma abordagem possível será associar a uma
palavra um conjunto de categorias gramaticais possíveis e quando necessário considerar a palavra
como pertencente à classe gramatical que a beneficiar mais em termos de pontuação para a predição de
palavras.
Todos os Factores de Classificação referidos até ao momento recorrem a informação estatística respeitante à Língua Portuguesa em termos gerais. No entanto a escrita de um determinado utilizador pode
apresentar variações em relação a estes valores estatísticos. Para um mesmo utilizador podem inclusivamente existir diferenças ao longo de assuntos ou temas de escrita diferentes (e.g. carta, relatórios,
diálogos). Assim, com o recurso a um conjunto de informação estatística adaptada a cada tema de
escrita do utilizador é possível uma predição de palavras mais eficaz. Esta informação estatística foi
considerada no processo de predição. A informação estatística sobre a Língua Portuguesa em termos
gerais, estará completa logo desde o inicio, e permanecerá inalterada ao longo do tempo. A informação
estatística associada a um determinado utilizador será nula à partida, sendo então gradualmente constituída e afinada com base na escrita produzida pela própria pessoa. No nosso sistema cada utilizador
pode possuir diferentes perfis. O Perfil de Utilizador consiste num conjunto de informações que permitem configurar o sistema de modo a este poder ser utilizador por pessoas diferentes ou pela mesma
pessoa em situações distintas. Por isso cada Perfil de Utilizador está associado a um conjunto de informação estatística que permite adaptar o mecanismo de predição a cada utilizador.
Assim através desta nova fonte de informação estatística foram incorporados dois novos Factores de
Classificação, a probabilidade de uma palavra pal, e a probabilidade condicional de uma palavra pal
dada a palavra anterior pala, para um Perfil de Utilizador especifico, expressas respectivamente por
ppu(pal) e ppu( pal | pala).
A probabilidade ppu(pcj) e a probabilidade condicional ppu(pcj | pala), podem assim ser utilizadas na
obtenção de duas novas classificações parciais para cada palavra candidata pcj. A probabilidade condicional ppu(pcj | pala) pode ser calculada através da Eq. (3.5).
ppu(pcj | pala) =
ppu(pala, pcj)
ppu(pala)
(3.5)
Na Eq. (3.5) a probabilidade ppu(pala, pcj) representa a probabilidade do bigrama de palavras, pala, pcj,
para um determinado perfil de utilizador, e ppu(pala) a probabilidade da palavra anterior, pala, também
nesse mesmo perfil de utilizador.
40
Cada um destes factores irá assim fornecer uma classificação parcial para cada palavra candidata pcj.
Uma classificação parcial, maior ou menor, indica que segundo aquele factor específico existe a possibilidade, maior ou menor, daquela palavra ser a que o utilizador pretende escrever. Através da contabilização das várias classificações parciais deve ser obtida uma classificação final para cada palavra
candidata. No nosso sistema utilizamos uma combinação linear das várias classificações parciais por
forma a obtermos esta classificação final. Esta combinação linear encontra-se expressa na Eq. (3.6) .
cj = α 1 × p(pcj) + α 2 × p(pcj | pala) + α 3 × p(cgj | cga) + α 4 × ppu(pcj) + α 5 × ppu(pcj | pala)
(3.6)
Na Eq. (3.6) cj e cgj designam respectivamente a classificação final e a classe gramatical da palavra
candidata pcj, e cga a classe gramatical da palavra anterior pca.
A utilização de uma combinação linear para a obtenção da classificação final de cada palavra candidata apresenta vários pontos de interesse. A contribuição de cada factor pode ser ponderada através dos
coeficientes αi da combinação linear. Desta forma pode ser atribuída uma maior importância a uns
factores e uma menor importância a outros. Numa situação limite o coeficiente associado a um determinado factor pode ser colocado a zero eliminando-se assim a participação desse factor na classificação das palavras candidatas. Em qualquer das situações a contribuição de cada factor é sempre proporcional às probabilidades associadas. O intervalo de variação dos coeficientes foi fixado entre 0 e 100.
Cada perfil de utilizador pode conter combinações diferentes para estes coeficientes. Como não implementámos nenhum método automático para encontrar valores óptimos para estes coeficientes, o seu
ajustamento terá de ser efectuado manualmente tendo em consideração cada situação. A Figura 3-4
mostra a caixa de diálogo que permite a alteração destes coeficientes. Num trabalho futuro poderemos
desenvolver um método para a determinação dos coeficientes óptimos para cada situação. Este método
deverá encontrar os coeficientes αi que maximizam a percentagem de caracteres poupados na escrita
de um determinado conjunto de textos utilizando a predição de palavras.
Substituindo na Eq. (3.6) as probabilidades condicionais p(pcj | pala), p(cgj | cga) e ppu(pcj | pala) pelas
expressões equivalente, fornecidas em Eq. (3.2), Eq. (3.4), Eq. (3.5), respectivamente, obtemos uma
outra forma para a Eq. (3.6), que apresentamos na Eq. (3.7). A classificação de cada palavra candidata
pode assim ser calculada com os dados armazenados no Léxico do sistema.
cj = α 1 × p(pcj) + α 2 ×
p(pala, pcj)
p(cga, cgj)
ppu(pala, pcj)
+α3×
+ α 4 × ppu(pcj) + α 5 ×
p(pala)
p(cga)
ppu(pala)
(3.7)
3.2 Léxico
Como referimos anteriormente um léxico pode ser visto como uma lista de palavras com um conjunto
de informação associada, seja estatística, sintáctica, morfológica, semântica, ou outra. O nosso preditor
de palavras utiliza essencialmente informação estatística no processo de predição pelo que esta deverá
41
estar disponível no léxico do sistema. Inspeccionando a Eq. (3.7) verificamos qual a informação que o
léxico deverá conter. Por um lado deverá conter um conjunto de probabilidades gerais para a Língua
Portuguesa, que são a probabilidade de uma palavra pal, a probabilidade de um bigrama de palavras
pal1, pal2, a probabilidade de uma classe gramatical cg, e a probabilidade de um bigrama de classes
gramaticais, cg1, cg2. Por outro lado também deverá conter a probabilidade de uma palavra pal e de
um bigrama de palavras, pal1, pal2, para cada perfil de utilizador.
Para a obtenção dos valores das várias probabilidades relativas ao caso geral da Língua Portuguesa foi
utilizado um Corpus de Português escrito, constituído por 156.876 frases retiradas do jornal ‘O Público’. Estas frases são as primeiras 156.876 de um maior conjunto de frases constituído pelos dois primeiros parágrafos de cada artigo publicado neste jornal ao longo dos vários meses dos anos de 1991 a
1994. Sabemos no entanto que este Corpus não é totalmente representativo da Língua Portuguesa. Por
exemplo nas frases deste Corpus é muito difícil encontrar formas verbais na 1ª pessoa. Para complementar esta lacuna também teria sido desejável a utilização de um Corpus de Português falado. Tal
não foi efectuado por não termos disponível um Corpus deste tipo. Esta lacuna não é muito grave pois
o nosso sistema encontra-se preparado para aperfeiçoar o seu conhecimento sobre a língua com base
na escrita do utilizador. Com o passar do tempo o modelo da língua do sistema estará mais adaptado
ao estilo de escrita utilizado.
Numa primeira fase desenvolvemos um pequeno estudo sobre o Corpos de frase do “Público”. Os
resultados obtidos permitiram a tomada de determinadas decisões importantes para o sistema. Num
destes estudos verificámos quais os caracteres existentes no Corpus, assim como o seu número de
ocorrências. Esta informação, que se encontra no Apêndice A, permitiu definir o conjunto de caracteres
admissíveis numa palavra. Considerámos uma palavra como uma sequência formada pelos caracteres A-Za-záéíóúÁÉÍÓÚàÀâÂêÊôÔãÃõÕçÇ. O espaço e os caracteres \n\t,.«»:)(;/?\"! foram considerados
como separadores de palavras. Verificámos também o comprimento máximo, médio e mínimo das
várias palavras do Corpus. Obtivemos os valores 60, 5.074149 e 1, respectivamente. Estes dados levaram-nos a inspeccionar qual a palavra que continha este elevado número de caracteres. Tratava-se de
um erro. Eliminámos essa palavra (çããcvãçícçíçcçíefijkymnopqrstuvwxyzabcdefghijklznopqrstuvwxr),
e retirámos do Corpus mais duas palavras, uma por tamanho excessivo e a outra por erro (encenadorensaiador-narrador-iluminador e anunciadasocial-democratização). Depois deste tratamento obtivemos os valores de 30, 5.074087 e 1 para o tamanho máximo, médio e mínimo das palavras do Corpus.
Esta pequena operação foi importante para a redução da dimensão das estruturas que posteriormente
desenvolvemos para o armazenamento do Léxico.
Após este primeiro processamento iniciámos a obtenção do conjunto de informação estatística sobre a
Língua Portuguesa. Como o Corpus contém um número finito de dados os valores obtidos para as
várias probabilidades tratam-se de estimativas e não valores exactos. A estimativa para a probabilidade
de uma palavra pal, p(pal), pode ser obtida com base no número de ocorrências desta palavra no Corpus, o(pal), e no somatório das ocorrências de todas as palavras, Op, nesse mesmo Corpus. A Eq. (3.8)
apresenta este cálculo.
42
p(pal) =
o(pal)
Op
(3.8)
Para a contagem das ocorrências de cada palavra no referido Corpus desenvolvemos um script awk
que denominámos con_oco_pal.awk e apresentamos no Apêndice B. Através deste script foi gerado
um ficheiro contendo para cada palavra o seu número de ocorrências. Contabilizámos 65.820 palavras
diferentes. Esta informação foi ordenada e armazenada num ficheiro que passaremos a designar de
palavrasOcorrencias.ord
Através da informação contida neste ficheiro é possível a obtenção de o(pal), as ocorrências de uma
determinada palavra pal, e de Op, o somatório das ocorrências de todas as palavras, pelo que p(pal)
pode ser obtido através da Eq. (3.8). Ao invés de efectuarmos um novo processamento para a determinação dos valores das probabilidades de cada palavra, decidimos incorporar directamente no Léxico os
valores das suas ocorrências. Recorrendo a esta informação o sistema pode depois calcular as várias
probabilidades das palavras.
Uma das vantagens do armazenamento do número de ocorrências de cada palavra ou bigrama de palavras, em vez das probabilidades correspondentes, consiste na possibilidade da actualização destes valores à medida que o utilizador vai escrevendo novas palavras. Os valores das probabilidades relativas
ao caso geral da Língua Portuguesa mantêm-se constantes ao longo da utilização do sistema, no entanto tal não sucede com as probabilidades associadas a um perfil de utilizador. Por forma a mantermos
uma certa uniformidade decidimos armazenar as ocorrências, em vez das probabilidades, para todas as
situações.
Para a obtenção da probabilidade de um bigrama de palavras pal1, pal2, p(pal1, pal2), foi efectuado um
processamento semelhante. Considerando o(pal1, pal2) o número de ocorrências do bigrama de palavras pal1, pal2, no referido corpus, e Obp o somatório das ocorrências de todos os bigramas, então a
estimativa para p(pal1, pal2) pode ser obtida através da Equação (3.9).
p(pal1, pal2) =
o(pal1, pal2)
Obp
(3.9)
Para efectuarmos a contagem das ocorrências de cada bigrama de palavras no referido Corpus desenvolvemos um script awk, denominado con_oco_pares.awk, e apresentado no Apêndice C. Através
deste script foi gerado um ficheiro contendo, em cada linha, o bigrama de palavras seguido do seu
número de ocorrências. Contabilizámos um elevado número de bigramas, 522.792. Verificámos no
entanto que a maioria destes pares de palavras apresentava um número diminuto de ocorrências. Eliminando todos os bigramas com um número de ocorrências inferior a 3 reduzimos o número de bigramas para 80.850. A redução desta quantidade de informação foi importante para a diminuição do
43
conjunto de dados que o preditor deve processar durante uma predição. Esta informação foi ordenada e
armazenada num ficheiro que passaremos a denominar de paresPalavrasOcorrencias.ord.
Com base nesta informação é assim possível obter, o(pal1, pal2), as ocorrências de uma determinado
bigrama de palavras pal, e Obp, o somatório das ocorrências de todos os bigramas de palavras, e assim
obter p(pal1, pal2) através da Eq. (3.9).
Para a obtenção da probabilidade de uma classe gramatical cg, e a probabilidade de um bigrama de
classes gramaticais cg1, cg2, foram seguidas abordagens semelhantes às anteriores. No entanto, primeiro foi necessário classificar quanto à classe gramatical o maior número possível de palavras do Léxico
do sistema, ou seja as 65.820 palavras existentes no ficheiro palavrasOcorrencias.ord. Pelo que referimos anteriormente não classificámos as palavras que possuem a mesma grafia mas diferentes classes
gramaticais. Foram utilizadas 13 classes gramaticais. As etiquetas associadas a cada uma destas classes gramaticais encontram-se apresentadas no Quadro 3-3. A classificação das palavras foi efectuada
pelo analisador morfológico “Palavroso” do Laboratório de Sistemas de Língua Falada do INESC-ID.
Com base no ficheiro palavrasOcorrencias.ord, foi assim gerado um novo ficheiro que passaremos a
denominar palavrasOcorrenciasClasses.ord, que contém para cada palavra o seu número de ocorrências e a sua classe gramatical. Como não classificámos as palavras que possuem a mesma grafia mas
classes gramaticais diferentes apenas atribuímos classe gramatical a 32.933 das 65.820 palavras. As
restantes permaneceram no léxico sem classe gramatical atribuída.
Conhecendo a classe gramatical de algumas palavras do Corpus foi então possível desenvolver um
script awk, denominado con_oco_classes.awk e apresentado no Apêndice D, que efectuou a contagem
das ocorrências de cada uma das 13 classes gramaticais no Corpus. Foi assim criado um ficheiro com
esta informação, que passamos a denominar de classesOcorrencias.txt.
Com a informação existente neste ficheiro é possível obter o(cg), o número o número de ocorrências
de cada classe gramatical cg, e Ocg, o somatório das ocorrências de todas as classes gramaticais. Com
adj – adjectivo
adv – adverbio
cp - conjunção
nc – nome comum
np – nome próprio
pdem – pronome demonstrativo
pind – pronome indefinido
pint – pronome interrogativo
ppes – pronome pessoal
ppos – pronome possessivo
prel – pronome relativo
prep - preposição
v – verbo
Quadro 3-3 - Etiquetas associadas a cada uma das classes gramaticais.
44
este valores é possível calcular uma estimativa para p(cg), utilizando a Eq. (3.10).
p(cg) =
o(cg)
Ocg
(3.10)
A contagem do número de ocorrências de cada bigrama de classes gramaticais foi efectuada com o
recurso ao script awk, con_oco_pares_classes.awk, apresentado no Apêndice E. Foram obtidas ocorrências para 149 bigramas de classes gramaticais. Esta informação foi armazenada num ficheiro que
passaremos a denominar de paresClassesOcorrencias.txt.
A informação contida neste ficheiro permite obter o(cg1, cg2), as ocorrências de um bigrama de classes
gramaticais cg1, cg2, e Obcg o somatório das ocorrências de todos os bigramas de classes gramaticais.
Com estes valores podemos obter uma estimativa para probabilidade de qualquer um dos bigramas de
palavras, utilizando a Eq. (3.11).
p(cg1, cg2) =
o(cg1, cg2)
Obcg
(3.11)
A obtenção dos valores das probabilidades, ou ocorrências de palavras e bigramas de palavras, relativas a um determinado perfil de utilizador não pode ser determinado a priori mas sim à medida que o
utilizador produz escrita com o apoio do sistema. As ocorrências de palavras e bigramas de palavras
escritos pelo utilizador vão sendo contabilizados e armazenados em dois ficheiros associados ao perfil
de utilizador. O sistema denomina os ficheiros utilizando a designação do perfil de utilizador e as extensões, .pal para o ficheiro com as palavras, e .par para o ficheiro com os bigramas de palavras. Supondo que era criado um perfil de utilizador denominado util o ficheiro com as palavras seria designado util.pal, e o ficheiro com os bigramas de palavras de util.par. Passaremos a utilizar as designações,
util.pal e util.par para nos referirmos de uma forma genérica a estes dados. Para uma adaptação rápida
ao estilo de escrita do utilizador o nosso sistema dispõe de uma funcionalidade que gera esta informação estatística com base em textos fornecidos pelo utilizador.
O Léxico do sistema contém as 65.820 palavras contidas no ficheiro palavrasOcorrenciasClasses.ord,
os 80.850 bigramas de palavras contidas no ficheiro paresPalavrasOcorrencias.ord, as 13 classes
gramaticais existentes no ficheiro classesOcorrencias.txt, e os 149 bigramas de classes gramaticais
existentes no ficheiro paresClassesOcorrencias.txt. Também contém as palavras e bigramas de palavras associadas a um determinado perfil de utilizador. Apesar de não incluirmos no sistema uma ferramenta para a manipulação desta informação, os dados encontram-se armazenados em ficheiros de
texto que podem ser modificados com um simples editor de texto.
45
3.3 Implementação
O nosso sistema foi desenvolvido em ambiente Windows utilizando a linguagem Visual C++ 6.0 e
com o suporte das Microsoft Foundation Classes (MFC). Cada elemento do nosso sistema encontra-se
por isso implementado através de um ou mais objectos C++. Como referimos anteriormente os elementos principais do mecanismo de predição do nosso sistema são o Léxico e o Algoritmo de Predição. O léxico encontra-se armazenado num objecto do tipo CDicionario (Classe Dicionario). A definição deste novo tipo, assim como de todos os outros, foi efectuada através da introdução de uma nova
classe no programa. Também decidimos armazenar no objecto CDicionario outros dados, como por
exemplo as abreviaturas e respectivas expansões necessárias ao componente de expansão de abreviaturas. Os vários dados do sistema encontram-se por isso centralizados num único objecto que pode ser
acedido por qualquer componente do sistema. O algoritmo de predição encontra-se implementado no
interior de um objecto do tipo CPreditorPalavras (Classe Preditor Palavras). Este objecto disponibiliza a função membro EfectuarPredicaoPalavras que possibilita a execução de uma predição de palavras. Na chamada desta função devem ser fornecidos como parâmetro os dados necessários à predição
de palavras.
3.3.1 Armazenamento do Léxico
O Léxico do nosso sistema é constituído essencialmente por informação estatística sobre a utilização
das várias palavras, pares de palavras, classes gramaticais e pares de classes gramaticais em textos
escritos na Língua Portuguesa. Estes dados são utilizados pelo algoritmo de predição na execução de
cada predição de palavras. Esta operação deve ser suficientemente rápida para fornecer uma lista de
palavras preditas ao utilizador em tempo útil. Por este motivo as estruturas de dados que armazenam o
léxico do sistema devem permitir a execução de consultas rápidas a este conjunto de informação.
O armazenamento das 13 classes gramaticais e dos 149 bigramas de classes gramaticais e respectivas
ocorrências não colocou quaisquer dificuldades ao nível da selecção de estruturas de dados apropriadas. Como se trata de uma pequena quantidade de dados, dois vectores, um para as classes gramaticais, outro para os bigramas, possibilitam um acesso suficientemente rápido a estes dados. O armazenamento de 65.820 palavras e 80.850 bigramas necessitou de uma estrutura um pouco mais complexa
de modo a ser possível um acesso rápido aos dados.
Para este efeito decidimos armazenar as várias palavras num vector ordenado por ordem alfabética
descendente. Este tipo de estrutura permite o acesso a uma determinada palavra do vector através de
uma busca dicotómica. Cada posição deste vector contém a palavra, o número de ocorrências da palavra para o caso geral, o número de ocorrências para o perfil de utilizador corrente, a classe gramatical,
e uma lista das palavras seguintes possíveis. Esta lista contém em cada elemento uma palavra e o seu
número de ocorrências como palavra seguinte, quer para o caso geral, quer para o perfil de utilizador
corrente. Esta lista encontra-se ordenada por ordem alfabética descendente.
46
Esta estrutura, que ilustramos na Figura 3-5 é carregada com os dados existentes nos ficheiros palavrasOcorrenciasClasses.ord, paresPalavrasOcorrencias.ord, classesOcorrencias.txt, paresClassesOcorrencias.txt, util.pal e util.par.
Como referimos anteriormente esta estrutura foi incorporada numa classe C++ que denominámos
CDicionário. No Quadro 3-4 apresentamos parte da classe CDicionário na qual se encontram definidas as várias estruturas que armazenam o Léxico do sistema.
Figura 3-5 - Estrutura de dados utilizada para o armazenamento do Léxico.
47
class CDicionario{
public:
...
private:
//Vector de Palavras
CArray<CPalavra, CPalavra&> m_palavras;
int m_nPalavras;
int m_totalOcorrenciasPalavrasLP;
int m_totalOcorrenciasParesLP;
int m_totalOcorrenciasPalavrasPU;
int m_totalOcorrenciasParesPU;
//Classes Gramaticais de Palavras
CArray<CClasseGramatical, CClasseGramatical&> m_classesGramaticais;
int m_nClassesGramaticais;
int m_totalOcorrenciasClassesGramaticaisPU;
//Pares de Classes Gramaticais de Palavras
CArray<CParClassesGramaticais, CParClassesGramaticais &> m_paresClassesGramaticais;
int m_nParesClassesGramaticais;
int m_totalOcorrenciasParesClassesGramaticaisPU;
...
};
Quadro 3-4 - Parte da definição do classe CDicionario que armazena o Léxico do sistema.
Para a definição da classe CDicionario recorremos a uma biblioteca da MFC que disponibiliza estruturas de dados básicas para a construção de estruturas de dados mais complexas, entre as quais classes
para a manipulação de vectores (CArray), listas (CList) e tabelas de hash ou mapas (CMap). Estas
estruturas disponibilizam na sua generalidade um conjunto de operações simples e prático. Por exemplo, utilizando a classe CArray é possível inserir uma nova posição no vector, sendo as posições seguintes automaticamente recolocadas. Todos os tipos de estruturas também disponibilizam um mecanismo, denominado Serialização, que permite armazenar num ficheiro todos os dados contidos na
estrutura. Para possibilitar a incorporação de qualquer tipo de elementos, a MFC utiliza templates na
definição destas estruturas.
Para o armazenamento das várias palavras do sistema, do conjunto de categorias gramaticais e dos
vários pares de classes gramaticais foram utilizadas estruturas do tipo CArray. Cada uma destas estruturas possui respectivamente elementos do tipo CPalavra, CClasseGramatical e CParClassesGramaticais. No Quadro 3-5 apresentamos uma definição parcial da classe CPalavra. As outras classes foram definidas de forma semelhante. Podemos verificar pela definição da classe CPalavra que cada
objecto deste tipo possui o texto da palavra, o número de ocorrências para o caso geral e para o perfil
de utilizador corrente, e finalmente uma lista com as suas palavras seguintes. Podemos também verificar que esta lista de palavras seguintes se encontra implementada com o recurso a um objecto do tipo
CList. Cada um dos elementos desta lista é do tipo CPalavraSeguinte.
Na definição destas estruturas, sejam do tipo CArray ou CList, é necessário fornecer dois argumentos
na template. O primeiro indica tipo de elementos da estrutura, por exemplo CPalavra, e o segundo, o
tipo de argumento utilizado nas funções membro da estrutura. De uma forma geral é aconselhada a
utilização de uma referência para o tipo de elementos da estrutura, no exemplo apontado, CPalavra&.
48
Esta estrutura responde de uma forma satisfatória aos requisitos das várias etapas do algoritmo de predição. Verifiquemos então as operações efectuadas em cada uma destas etapas.
3.3.2 Complexidade das Operações sobre o Léxico
Como vimos anteriormente, na primeira etapa do processo, a Restrição de Palavras do Léxico, é necessário obter as várias palavras candidatas. Numa primeira fase são obtidas as Palavras Possíveis.
Estas consistem nas palavras iniciadas pelo prefixo já escrito, caso este exista. A função membro ObterPalavrasComPrefixo da classe CDicionario efectua esta operação. Através de uma busca dicotómica sobre o Vector de Palavras, utilizando o prefixo fornecido, é obtida a primeira palavra que possui
este prefixo, as restantes palavras encontram-se nas posições seguintes. Num estudo sobre o léxico
obtivemos a quantidade de palavras iniciadas por cada caracter. No Apêndice F apresentamos esta
lista. Através da inspecção desta lista verificamos que a pior situação, em termos de sobrecarga para o
sistema, ocorre quando o prefixo é igual a c. Nesta situação existem 7413 palavras possíveis. Este
valor relaciona-se com o número de palavras do léxico, n, que neste caso é 65.820, através da expressão n/8. Assim, para o pior caso a obtenção de um conjunto de palavras com um prefixo possui uma
complexidade de O(log2n)+O(n/8).
Caso não exista prefixo então as palavras possíveis são as palavras que formam bigramas com a palavra anterior. Esta operação é efectuada pela função membro ObterPalavrasSeguintes. Nesta operação
é efectuada uma pesquisa dicotómica para encontrar a palavra anterior no Vector de Palavras. As palavras pretendidas encontram-se na sua lista de palavras seguintes. Num estudo efectuado sobre o Léxico verificámos quais as palavras que possuíam um maior número de palavras seguintes. Apresentamos
no Apêndice G as vinte palavras com um maior número de palavras seguintes. No topo desta lista encontramos a palavra de com 3969 palavras seguintes. Este valor relaciona-se de forma aproximada
com n através da expressão n/16. Assim para o pior caso, a obtenção das palavras seguintes de uma
palavra terá uma complexidade de O(log2n) + O(n/16).
Após a obtenção das palavras possíveis o preditor de palavras elimina aquelas que possuem um determinado conjunto de letras, sequências de letras, ou que ultrapassam um determinado tamanho. Esta
class CPalavra{
public:
...
private:
CString m_palavra;
int m_ocorrenciasLP;
int m_ocorrenciasPU;
CString m_clasGram;
CList<CPalavraSeguinte, CPalavraSeguinte&> m_palavrasSeguintes;
int m_nPalavrasSeguintes;
};
Quadro 3-5 - Definição parcial da classe CPalavra.
49
operação requer uma iteração sobre o conjunto de palavras possíveis. Pelo que referimos atrás a quantidade destas palavras é na pior situação n/8 pelo que a complexidade desta operação é O(n/8). As
palavras não eliminadas tornam-se assim as Palavras Candidatas. Terminada a primeira etapa, inicia-se
a classificação de cada uma das palavras candidatas.
Nesta segunda etapa o preditor de palavras deve consultar o léxico de modo a obter um conjunto de
informação estatística necessário ao cálculo da classificação de cada palavra candidata, pcj. A classificação de cada um destas palavras, cj é calculada com base na Eq. (3.7). A classificação final de cada
palavra candidata resulta da combinação linear de várias classificações parciais, efectuadas segundo os
diferentes factores indicados no Quadro 3-2.
Por cada classificação parcial deve ser efectuada uma iteração sobre o conjunto das palavras candidatas. Existindo cinco Factores de Classificação diferentes seriam necessárias cinco iterações sobre este
conjunto de palavras. Decidimos optimizar este processo, mantendo no entanto a sua linearidade. Verificámos que determinadas classificações parciais podiam ser efectuadas através de uma mesma iteração. Por exemplo para calcularmos a classificação parcial fornecida pelo factor α1 × p(pcj) é necessário
efectuar uma pesquisa dicotómica sobre o Vector de Palavras para ser obtido o número de ocorrências
da palavra pcj, que depois permite o cálculo de p(pcj). Através do resultado desta pesquisa também
podemos aceder, sem qualquer esforço adicional, à informação que permite o cálculo de ppu(pcj), que é
o número de ocorrências da palavra para o perfil de utilizador corrente. Desta forma a contribuição
destes dois factores pode ser calculado numa só iteração. O mesmo sucede para a contribuição dos
factores α2 × p( pala, pcj) / p( pala) e ppu(pala, pcj) / ppu(pala). Desta forma o número de iterações sobre
o conjunto de palavras candidatas foi reduzido de cinco para três sem qualquer prejuízo na linearidade
do processo de classificação.
Na primeira iteração são calculadas as classificações parciais fornecidas por α1 × p(pcj) e α4 × ppu(pcj).
Estas probabilidades, quer para o caso geral, p(pcj), quer para o perfil de utilizador corrente, ppu(pcj),
são obtidas com o recurso a uma única busca dicotómica no Vector de Palavras. Considerando que no
máximo existem n/8 palavras candidatas esta iteração possui uma complexidade de n/8 x O(log2n).
Na segunda iteração são calculadas as classificações parciais fornecidas pelos termos α2 × p( pala, pcj)
/ p( pala) e α5 × ppu(pala, pcj) / ppu(pala). Nesta situação é necessário obter a probabilidade dos bigramas formados pela palavra anterior e cada uma das palavras candidatas, quer para o caso geral, quer
para o perfil de utilizador corrente. Também é necessário obter a probabilidade da palavra anterior
para os dois casos. Estas probabilidades, p( pala) e ppu(pala), podem ser calculadas através de uma
única pesquisa dicotómica, que pode ser efectuada apenas uma vez para todo o conjunto de palavras
candidatas. A complexidade desta primeira operação é por isso O(log2n).
As probabilidades dos bigramas de palavras p( pala, pcj) e ppu(pala, pcj) podem ser obtidas através de
uma pesquisa dicotómica, que permita encontrar a palavra anterior, pala, no Vector de Palavras, seguida de uma pesquisa linear na sua lista de palavras seguintes, de modo a encontrar a palavra candidata
50
pcj. O elemento da lista com a palavra pcj possui as ocorrências do bigrama de palavras pala, pcj, que
permite assim o cálculo das probabilidades do bigrama. A complexidade desta operação é n/8 x
[O(log2n)+ O(n/16)]. Na prática verificou-se que a obtenção da probabilidade destes bigramas, através de uma pesquisa dicotómica, seguida de uma busca linear sobre a lista de palavras seguintes tornava o processo de classificação extremamente lento. Assim efectuámos uma optimização a esta operação. Numa primeira fase são copiadas para um vector todas as palavras seguintes da palavra anterior.
Como a lista de palavras seguintes se encontra ordenada, o vector também fica ordenado. A complexidade desta operação é O(n/16). Para a obtenção da informação sobre o bigrama de palavras pala, pcj
basta agora efectuar uma busca dicotómica da palavra pcj neste vector. A complexidade desta operação é O(log2n). Para a realização desta classificação parcial é assim eliminada a necessidade de uma
pesquisa linear sobre uma lista de palavras para cada palavra candidata. Desta forma a complexidade
desta segunda iteração sobre o conjunto de n/8 palavras candidatas é dada por 2 x O(log2n) + O(n/16)
+ n/8 × O(log2n)
Na terceira iteração é efectuado o cálculo da contribuição fornecida pelo termo α3 × p(cga, cgj) /
p(cga). Para tal é necessário encontrar a probabilidade dos bigramas formados pela classe gramatical
da palavra anterior e a classe gramatical de cada palavra candidata. Também é necessário obter a probabilidade da classe gramatical da palavra anterior. Esta probabilidade, p(cga), pode ser calculada através de uma pesquisa dicotómica no Vector de Palavras para a determinação da categoria gramatical
da palavra anterior. Em seguida deve ser efectuada uma pesquisa linear sobre o Vector Classes Gramaticais para a determinação das ocorrências desta classe. Como a quantidade de elementos deste último
vector não tem qualquer expressão quando comparado com o Vector de Palavras esta operação possui
uma complexidade de O(log2n). Esta operação pode ser efectuada apenas uma vez para todo o conjunto de palavras candidatas.
Em seguida, para cada palavra candidata é necessário obter a sua classe gramatical. Esta operação é
efectuada através de uma pesquisa dicotómica sobre o Vector de Palavras, seguida de uma pesquisa
linear sobre o Vector de Bigramas de Classes Gramaticais por forma a encontrar o número de ocorrências do bigrama de classes cga, cgj. Com este valor é então obtida a probabilidade p(cga, cgj). Tal como
na situação anterior a complexidade desta operação pode ser considerada O(log2n). Assim a complexidade desta terceira iteração sobre as n/8 palavras candidatas é O(log2n) + n/8 × O(log2n).
Após a classificação de cada palavra candidata, pcj, é necessário obter as palavras melhor classificadas. Nesta operação não é necessária qualquer consulta ao léxico. Para efectuar esta operação percorremos linearmente o conjunto de palavras candidatas. Durante cada passo desta iteração actualizamos,
caso necessário, uma lista com as palavras candidatas melhor classificadas até ao momento. Esta lista
encontra-se ordenada por ordem descendente da classificação. Ao aparecer uma palavra com classificação superior, à pior da lista, retiramos esta última palavra, e colocamos a nova palavra de uma forma
ordenada na lista. No final da iteração a lista contém as palavras melhor classificadas e ordenadas de
forma decrescente. Estas são as Palavras Preditas. A lista com as palavras melhor classificadas apresenta um número muito reduzido e não superior a 10. Por este motivo apenas consideramos para o
51
cálculo da complexidade desta operação a iteração sobre as várias palavras candidatas. A complexidade desta operação é O(n/8).
A estrutura para o léxico apresenta no entanto a desvantagem de ser pouco eficiente para a inserção de
novas palavras. Ao inserir-se uma nova palavra todas aquelas com ordem alfabética inferior deverão
ser avançadas uma posição no vector. Na pior das situações a inserção será efectuada no inicio do
vector e por isso todas as palavras serão deslocadas uma posição. Esta operação tem a complexidade
de O(n). No entanto esta operação só será efectuada caso o utilizador escreva uma palavra que ainda
não faça parte do léxico. Como existem 65.820 palavras no léxico esta operação não é muito frequente. Nas experiências práticas que efectuámos, escrevendo palavras não existentes no léxico, verificámos que esta operação não comprometia de qualquer forma o desempenho do preditor de palavras. Por
outro lado a introdução de um novo bigrama de palavras, escrito pelo utilizador, decorre com uma
eficiência razoável, pois a primeira palavra já estará obrigatoriamente inserida no vector, e por isso
bastará a inserção da segunda palavra na lista de palavras seguintes da primeira.
3.3.3 Implementação do Algoritmo de Predição
Para a implementação do Algoritmo de Predição definimos no nosso sistema uma classe denominada
CPreditorPalavras (Classe Preditor de Palavras). Esta classe disponibiliza para o exterior a função
EfectuarPredicao através da qual é possível a realização de uma predição de palavras com base nos
parâmetros fornecidos. Os vários parâmetros utilizados por esta função são a quantidade de palavras
preditas, uma referência para o Léxico, uma referência para o Perfil do Utilizador, que contém as várias restrições e coeficientes de ponderação dos diversos factores de predição, a Palavra Anterior e o
Prefixo escritos pelo utilizador. A função devolve as Palavras Preditas e as respectivas classificações
através de um vector de elementos do tipo CPalavraDicionarioClassificacao. Cada um destes elementos contém uma referência para uma palavra do dicionário e a classificação atribuída através do pro-
int EfectuarPredicao( int n, CDicionario& dicionario, CPerfilUtilizador& perfilUtilizador, CString palavraAnterior, CString prefixo, CArray<PalavraDicionarioClassificacao, CPalavraDicionarioClassificacao&>& palavrasPreditas ){
//Restrição das Palavras do Léxico
SeleccionarPalavrasPossiveis( dicionario, palavraAnterior, prefixo );
RestringirPalavrasPossiveis( perfilUtilizador );
if( m_palavrasCandidatas.ObterNumeroPalavras() > 0 ){
//Classificação das Palavras Candidatas
ClassificarPalavrasCandidatas( dicionario, perfilUtilizador, palavraAnterior,
prefixo );
//Selecção das Palavras Preditas
return m_palavrasCandidatas.ObterPalavrasMelhorClassificacao( n, palavrasPreditas )
}
else
return 0;
}
Quadro 3-6 - A função EfectuaPredicao.
52
cesso de predição de palavras.
A função EfectuarPredicao realiza cada predição de palavras em três etapas distintas. Primeiro efectua
as devidas restrições às palavras do léxico de modo a obter um conjunto de palavras candidatas, a seguir classifica cada uma destas palavras segundo um conjunto de factores, e finalmente obtém deste
conjunto as palavras com melhor classificação. Cada uma destas três operações é efectuada através de
uma função auxiliar. No Quadro 3-6 apresentamos a função EfectuarPredicao.
Através das funções SeleccionarPalavrasPossiveis e RestringirPalavrasPossiveis é realizada a primeira etapa, a Restrição de Palavras do Léxico. A primeira função utiliza o Prefixo e a Palavra Anterior
para obter o conjunto de Palavras Possíveis. A segunda função aplica um conjunto de restrições definidas pelo utilizador sobre as várias palavras possíveis. É assim obtido o conjunto de Palavras Candidatas que fica armazenado numa variável membro denominada m_palavrasCandidatas. Esta variável é
do tipo CConjuntoPalavraDicionarioClassificacao e armazena internamente um conjunto de palavras
e respectivas classificações. Para esta classe desenvolvemos também um conjunto de funções membro
que facilitam a manipulação deste conjunto de palavras. Um exemplo é a função membro ObterPalavrasMelhorClassificacao. Esta função permite obter de todo o conjunto de palavras, as n melhor classificadas. Na secção anterior já referimos o algoritmo utilizado para a realização desta operação.
Caso existam palavras candidatas o sistema inicia a sua classificação através da função ClassificarPalavrasCandidatas. Esta função efectua as três iterações, referidas na secção anterior, para a classificação do conjunto de palavras candidatas.
Após a classificação, a função EfectuarPredicao obtém as palavras candidatas que possuem a melhor
classificação. Esta operação é efectuada através da função ObterPalavrasMelhorClassificacao.
3.3.4 Incorporação da Predição de Palavras no Sistema
A realização de cada predição de palavras no nosso sistema é da responsabilidade do objecto CPreditorPalavras. Para efectuar uma predição de palavras este objecto necessita de aceder ao léxico do sistema, contido no objecto CDicionario, às parametrizações do sistema contidas no objecto CPerfilUtilizador, e à palavra anterior e prefixo escritos pelo utilizador, contidas no objecto CProcessadorTexto.
Em capítulos posteriores iremos abordar o desenvolvimento destes dois últimos objectos. O objecto
CPreditorPalavras consegue efectuar uma predição de palavras mas não possui informação que lhe
permita tomar a iniciativa de realizar esta operação. O mesmo sucede com a realização de outras operações por parte de outros componentes do sistema. Por este motivo os vários componentes do sistema
são controlados por um objecto que denominámos Controlador do Sistema. Este objecto sabe quais as
operações a efectuar em cada momento. Para tal monitoriza os vários componentes do sistema. Ao
detectar a ocorrência de um determinado evento que requeira uma resposta, este objecto desencadeia
um conjunto de operações. Por exemplo, ao detectar a escrita de uma nova letra e ao verificar uma
pausa na escrita o Controlador do Sistema assume que utilizador pode precisar do apoio na escrita. Por
53
Figura 3-6 - Interacção entre os vários objectos do sistema para a realização de uma Predição de
Palavras.
isso desencadeia uma predição de palavras. Nesta operação encontram-se envolvidos vários objectos,
o objecto CProcessadorTexto assinala que foi escrita mais uma letra e disponibiliza a palavra anterior
e o prefixo, um temporizador do sistema indica ao Controlador do Sistema que já passou um certo
tempo depois da escrita da última letra e que por isso o utilizador pode estar a precisar de apoio. Por
este motivo é desencadeada uma predição de palavras com o recurso ao objecto CPreditorPalavras.
Finalmente o Controlador do Sistema deve apresentar o resultado da predição de palavras ao utilizador
através de um outro objecto denominado Teclado de Ecrã. Num próximo capítulo também nos iremos
referir a este componente. A Figura 3-6 ilustra de uma forma simplificada a interacção entre os vários
componentes do sistema para a realização de uma predição de palavras.
3.4 Expansão de Abreviaturas
Para complementar a predição de palavras introduzimos no nosso sistema uma outra técnica para a
aceleração da escrita, a Expansão de Abreviaturas. Através desta técnica o utilizador do nosso sistema
pode escrever palavras ou frases com o recurso a abreviaturas. Estas abreviaturas são definidas pelo
utilizador através da caixa de diálogo apresentada na Figura 3-7. Após a escrita de uma abreviatura o
utilizador deve pressionar a tecla para a sua expansão numa palavra ou frase.
No nosso sistema o componente que efectua a Expansão de Palavras é o próprio Controlador do Sistema. Ao ser informado pelo objecto CProcessadorTexto que foi pressionada a tecla para a expansão
de uma abreviatura o Controlador do Sistema obtém numa primeira fase a abreviatura escrita. Em
seguida consulta a lista de abreviaturas do utilizador para obtenção da expansão associada. Finalmente, através do objecto CProcessadorTexto, substitui a abreviatura escrita pela expansão obtida.
54
Figura 3-7 - Caixa de diálogo para a definição das abreviaturas
do utilizador.
As várias abreviaturas e respectivas expansões encontram-se armazenadas no objecto CDicionario,
numa estrutura do tipo CMap. Como referimos anteriormente este tipo de estrutura consiste numa
tabela de hash. A obtenção de uma expansão de abreviatura é por isso uma operação suficientemente
rápida para os objectivos do nosso sistema.
55
56
4. Interacção com a Aplicação Externa
A composição de uma mensagem num SACAA é efectuada num componente denominado Editor de
Símbolos. Este componente pode ser interno ou externo ao sistema. Podemos apontar três abordagens
diferentes no que respeita ao local utilizado pelo SCAA para a composição de mensagens:
(1)Composição Interna; (2)Composição Externa; (3)Composição Mista.
Através da primeira abordagem todo o tratamento de mensagens é efectuado dentro do SACAA. Por
isso este deve disponibilizar ao utilizador um editor de símbolos com as funcionalidades necessárias
ao processamento das mensagens. Esta abordagem é muitas vezes utilizada nos SACAA para a conversação. Estes sistemas ao disporem de um pequeno editor de texto interno, suficiente para a escrita
de pequenas frases, retiram da pessoa a carga imposta pela utilização de duas aplicações em simultâneo, possibilitando assim uma maior rapidez no fluxo de mensagens. Como as mensagens são construídas internamente, o SACAA pode aceder facilmente ao seu conteúdo e assim prestar um apoio
mais contextualizado. A Figura 4-1 ilustra um destes sistemas.
Na segunda aproximação o SACAA apoia a composição de mensagens numa aplicação externa. Os
SACAA que recorrem a esta abordagem são geralmente baseados em símbolos do alfabeto. Tal devese ao facto de externamente apenas existirem aplicações adequadas ao processamento deste tipo de
símbolos. Dependendo da aplicação externa assim a solução pode ser utilizada para a conversação ou
para a escrita. A pessoa pode utilizar um pequeno editor de texto (e.g. WordPad) se pretender apenas
escrever frases que depois envia para um sintetizador de fala, mas também pode utilizar um processador de texto sofisticado (e.g. Ms Word) para a formatação adequada de um documento escrito. Na
Figura 4-2 apresentamos um sistema com composição de mensagens externa.
Figura 4-1 SACAA com composição de mensagens
interna.
57
Figura 4-2 - SACAA com composição de mensagens
externa.
Nesta segunda abordagem é necessária a existência de um mecanismo de comunicação entre as duas
aplicações, que permita, na situação mais simples, o envio do símbolo seleccionado (e.g. letra, palavra) para a aplicação. Para além da escrita de um símbolo na aplicação externa também é muitas vezes
conveniente o acesso ao texto escrito anteriormente. Conhecendo o texto escrito o SACAA pode assim
propor palavras ou frases mais contextualizadas.
A terceira e última abordagem relativa à composição de mensagens recorre por sua vez às duas aproximações apresentadas anteriormente, dai a denominação de Composição Mista. Numa primeira fase,
parte da mensagem, por exemplo duas ou três linhas de texto, são escritas num editor interno ao SACAA. Neste editor o utilizador pode efectuar as alterações e correcções que considerar necessárias.
Numa segunda fase as frases são enviadas para a aplicação externa, juntando-se ao texto que compõe a
totalidade da mensagem. O processo repete-se até todo o texto se encontrar na aplicação externa. Esta
aproximação evita que a pessoa necessite de trabalhar com duas aplicações em simultâneo. Ora trabalha com o SACAA ora trabalha com a aplicação externa. Como é utilizado um editor interno, o SACAA também consegue aceder facilmente à totalidade do texto que a pessoa se encontra a escrever
Figura 4-3 - SACAA com composição de mensagens mista.
58
num determinado momento. Pode assim prestar facilmente um apoio contextualizado. No entanto esta
abordagem implica que a pessoa esteja continuamente a enviar partes da mensagem para a aplicação
externa. Estes sistemas provocam assim quebras no processo de composição. Para além disso também
não facilitam a alteração do texto que já se encontra na aplicação externa visto apenas apoiarem a manipulação do texto internamente. A Figura 4-3 apresenta um destes sistemas.
O nosso sistema é um SACAA baseado em computador e destina-se a apoiar a conversação e a escrita.
Como tal decidimos permitir a composição de mensagens em aplicações externas ao sistema. Desta
forma o utilizador pode escolher a aplicação mais adequada às suas necessidades de comunicação.
Um SACAA para apoiar a composição de uma mensagem numa aplicação externa deve conseguir
enviar para aquela, cada letra seleccionada pelo utilizador. Também deve conseguir solicitar à aplicação externa o texto já escrito para dessa forma prestar um apoio contextualizado à construção da mensagem. Em algumas situações também é necessário que a aplicação externa notifique a ocorrência de
determinados eventos. Por exemplo, um SACAA pode necessitar saber da introdução de um novo
caracter para de seguida efectuar uma nova predição de palavras.
Existem vários mecanismos que possibilitam a comunicação entre aplicações, como a memória partilhada, pipes, mensagens e sockets. Com o recurso a um destes mecanismos um SACAA pode enviar a
uma aplicação externa letras seleccionadas pelo utilizador, assim como poderá receber daquela o texto
já escrito até ao momento. Desta forma também poderiam ser assinalados determinados acontecimentos entre as aplicações. No entanto estes mecanismos implicam que ambas as aplicações se encontrem
preparadas para o estabelecimento da comunicação pretendida. Num SACAA as necessidades de comunicação com uma outra aplicação são conhecidas a priori, e por isso deste lado, poderá ser implementado o mecanismo de comunicação adequado. Na aplicação externa a situação é diferente. Durante
o desenvolvimento de uma aplicação é impossível antecipar as necessidades específicas de comunicação com outras aplicações, como por exemplo as necessidades de comunicação requeridas por um
SACAA.
Uma forma de permitir um vasto conjunto de interacções entre aplicações consiste em expor para o
exterior as várias funcionalidades, dados e eventos de cada aplicação. Um SCAA pode então escrever
letras e ler o texto já escrito na aplicação externa recorrendo às funcionalidades e dados disponibilizados por aquela. Também pode ser informado da ocorrência de determinados eventos, como por exemplo a escrita de um novo caracter.
Actualmente podemos distinguir duas interfaces distintas através das quais é possível aceder às funcionalidades, dados e eventos de uma aplicação: (1) Interface de Programação; (2) Interface do Utilizador. Na primeira situação a aplicação disponibiliza para o exterior um conjunto de procedimentos e
variáveis que podem ser invocados por outra aplicação. Também dispõe de um mecanismo para a notificação de um conjunto de eventos internos. Na segunda situação a aplicação não se encontra preparada para este tipo de interacção com outras aplicações. Assim o acesso às suas funcionalidades e dados
59
terá de ser efectuado através da interface gráfica, normalmente manipulada pelo utilizador. Por exemplo, através da simulação de um clique do rato num determinado botão da aplicação é possível invocar
o procedimento associado a este. Este processo requer no entanto a utilização de mecanismos de baixo-nível. Também proporciona um nível de interacção entre as aplicações muito limitado.
4.1 Interacção com uma Aplicação Externa através de uma
Interface de Programação
Esta abordagem baseia-se no modelo cliente-servidor. A aplicação que pretende disponibilizar as funcionalidades, dados e eventos para o exterior é o servidor, a aplicação que acede a estes é o cliente. No
nosso caso particular, a aplicação externa que está a ser utilizada para a composição da mensagem,
será a aplicação servidor, e o SACAA a aplicação cliente.
Para que estas interfaces possam responder de uma forma abrangente à interacção entre aplicações,
têm vindo a ser desenvolvidos ao nível dos sistemas operativos, um conjunto de mecanismos que uniformizam estas interfaces e ao mesmo tempo facilitam a sua implementação. Relativamente ao nosso
problema, se vários processadores de texto apresentarem a mesma interface para o acesso às suas funcionalidades, dados e eventos, então um SACAA pode interagir com todos estes de uma forma transparente.
No sistema operativo Windows existem actualmente dois mecanismos que possibilitam a criação das
referidas Interfaces de Programação numa aplicação: (1) OLE Automation; (2) Microsoft Active Accessibility (MSAA). Quer o OLE Automation, quer o Microsoft Active Accessibility assentam sobre um
mecanismo de interacção básico entre componentes de software denominado Component Object Model (COM).
4.1.1 O Component Object Model
O COM teve como principal origem o mecanismo OLE 1.0 (Object Linking and Embedding) que foi
desenvolvido em 1991 para permitir a criação e manutenção de documentos compostos. Com este
mecanismo tornou-se possível no sistema Windows a criação de documentos compostos por objectos
produzidos em aplicações diferentes, como sejam, gráficos, imagens e sons. Estes documentos compostos continham os dados necessários à criação dos vários objectos assim como a indicação do seu
formato. Desta forma era possível a alteração destes objectos através da invocação da aplicação adequada e fornecimento dos dados associados. Estes dados podiam encontrar-se armazenados no ficheiro
do documento composto (Object Embedding) ou então num outro ficheiro separado (Object Linking).
Nesta última situação o ficheiro do documento composto possui uma referência para o ficheiro com os
dados do objecto.
60
Os criadores do OLE verificaram entretanto que os objectos existentes nos documentos compostos
eram apenas um caso especial dos componentes de software, ou seja elementos autónomos que sendo
incorporados numa aplicação estendem a funcionalidade desta, sem requererem quaisquer alterações
no seu interior (Brockschmidt, 1996). Surgiu então em 1993 uma nova versão, o OLE 2.0, dispondo de
uma vasta infra-estrutura para o suporte de componentes de software. O núcleo desta infra-estrutura é
o mecanismo COM que fornece a outras camadas superiores serviços básicos de interacção entre
componentes de software.
O OLE Documents, o OLE Controls e o OLE Automation são alguns dos serviços que recorrem ao
COM (Brockschmidt, 1996). Para cada um destes serviços encontram-se especificadas regras rígidas
relativamente à interacção entre os componentes de software intervenientes. Geralmente encontram-se
envolvidos dois componentes, aquele que fornece o serviço, o servidor, e o outro que o utiliza, o cliente. O OLE Documents possibilita a criação e gestão de documentos compostos criados em aplicações
diferentes. O OLE Controls permite desenvolver objectos binários auto-suficientes, os OLE controls,
que depois podem ser incorporados em aplicações e manipulados por estas através do acesso às suas
funções e variáveis membro. Finalmente o OLE Automation permite a criação de objectos que expõem
para o exterior as funcionalidades existentes numa aplicação, permitindo que esta seja controlada a
partir de outras aplicações.
Apesar destes serviços disponibilizarem diferentes funcionalidades ao utilizador, todos partilham a
necessidade de um mecanismo que possibilite a comunicação entre componentes de software binários
desenvolvidos por fontes diferentes (Williams, 1994). Este mecanismo é disponibilizado pelo COM.
Um dos conceitos centrais no COM é a noção de Interface. A Interface é constituída por um conjunto
de funções que permitem a interacção entre um cliente e um objecto. Em tempo de execução uma Interface é simplesmente um apontador. Este apontador permite referenciar uma tabela na qual se encontram os endereços das várias funções membro da Interface. Esta estrutura binária é um standard COM
que permite a interacção de componentes desenvolvidos com o recurso a diferentes linguagens de
programação. Desde que o compilador consiga implementar este standard, não interessa a forma como
o componente ou cliente foi desenvolvido, pois a interacção entre os dois é estabelecido através deste
standard binário (Brockschmidt, 1996). A Figura 4-4 ilustra a estrutura de uma Interface.
Todos os servidores COM deverão possuir a interface predefinida IUnknown que possui três funções
membro: AddRef, Release e QueryInterface. As duas primeiras funções são utilizadas para a monitori-
Figura 4-4 - Estrutura de uma Interface.
61
zação do tempo de vida do objecto. Sempre que é estabelecida uma ligação à interface de um objecto é
automaticamente chamada a função AddRef que incrementa um contador que armazena o número de
ligações estabelecidas. Quando um cliente já não necessita da interface deve chamar a função Release
de modo a decrementar o referido contador. Quando os contadores da interface ficarem iguais a zero o
objecto pode ser destruído. A função QueryInterface permite questionar o componente sobre a existência de outras interfaces adicionais. No caso de existir a interface solicitada a função devolve um
apontador para esta que assim permite o acesso às suas funções membro.
Cada objecto e interface COM possui um identificador único no tempo e no espaço, denominado pela
COM como Identificador Globalmente Único (Globally Unique Identifier – GUID). Quando um destes identificadores se encontra associado a um objecto é denominado de Identificador de Classe (Class
Identifier – CLSID), quando se encontra associado a uma interface é denominado de Identificador de
Interface (Interface Identifier –IID). Estes identificadores são gerados por um algoritmo que utiliza
um endereço máquina do protocolo IP (garantido como único no espaço pelos fabricantes de hardware
de rede) e o tempo do sistema onde o algoritmo é executado. Fornecendo um destes identificadores à
função QueryInterface esta indica se a interface está disponível ou não, e no caso afirmativo devolve o
apontador associado a esta.
O servidor COM pode ser executado no processo cliente, num outro processo ou mesmo numa outra
máquina, sendo desta forma denominado, respectivamente, servidor interno (in-process server), servidor local (local server) e servidor remoto (remote server). Em quaisquer das situações o cliente acede
sempre às funções de uma interface através do apontador obtido. No servidor todos os acessos às interfaces disponíveis também são efectuados através dos respectivos apontadores. Quando o servidor
COM é carregado no processo cliente (servidor interno), as várias funções pertencentes às interfaces
do servidor encontram-se no mesmo espaço de memória do cliente, e por isso o apontador associado a
um interface possibilita o acesso directo às suas funções membro. A chamada de uma destas funções é
equivalente à chamada de uma função existente num dll.
Quando o servidor não se encontra dentro do processo cliente o apontador obtido para uma determinada interface não permite referenciar directamente as várias funções membro por estas não se encontrarem no mesmo espaço de memória. Nesta situação o COM introduz no processo cliente e no processo
servidor dois elementos, denominados respectivamente Proxy e Stub. Estes elementos interagem entre
si para tornar o processo de chamada de uma função de uma interface semelhante ao que decorre
quando o servidor se encontra instalado no mesmo espaço de memória do cliente. O Proxy recebe a
chamada do cliente que em seguida traduz para um pacote RPC (Remote Procedure Call) com a referência da função e respectivos parâmetros. Este pacote é então enviado ao Stub localizado no servidor
que se encarregará de invocar a função da interface referenciada. Este processo denominado Marshalling uniformiza assim a interacção entre o cliente e o servidor nas várias situações possíveis, servidor
interno, servidor local ou servidor remoto. Nas extremidades do mecanismo, quer no cliente, quer no
servidor, os acessos às interfaces são sempre efectuados através de apontadores.
62
Através da noção de interface o COM resolve também o problema das novas versões de um componente de software. Cada nova versão é implementada através da introdução de uma nova interface com
um identificador único. Desta forma não existe o problema da sobreposição de versões. Clientes antigos do componente podem assim continuar a utilizar a interface antiga ao passo que os clientes novos
podem começar a utilizar uma nova interface. Para além disso como um cliente pode interrogar um
componente sobre a disponibilidade de determinadas interfaces, com o recurso à função QueryInterface, aquele pode decidir dinamicamente qual a interface mais apropriada.
4.1.2 O OLE Automation
O OLE Automation é um mecanismo que permite uma aplicação aceder às funcionalidades, dados e
eventos de uma outra. Como já referimos o OLE Automation assenta sobre o mecanismo COM e por
isso a sua estrutura apresenta grandes semelhanças com a deste. Clark e Matteson (1996) descrevem
de uma forma exaustiva os conceitos e estruturas relacionadas com este mecanismo. Na nomenclatura
do OLE Automation a aplicação que disponibiliza o acesso às suas funcionalidades e dados é denominado o Servidor da Automação e a aplicação que acede a estas o Controlador da Automação. Para
poder ser controlada, uma aplicação deve implementar internamente um Servidor de Automação. Todos os programas que compõem o Microsoft Office dispõem de um servidor deste tipo.
O Servidor de Automação disponibiliza o acesso às suas funcionalidades e dados através da exposição
de objectos para o exterior. A exposição destes objectos para o exterior é efectuada através de interfaces COM. Estas interfaces fornecem acesso a um conjunto de propriedades e métodos de um objecto.
Um objecto OLE Automation possui necessariamente uma interface IUnknown. Também pode possuir
uma outra interface standard do OLE Automation, denominada interface IDispatch. Utilizando unicamente esta interface é possível o acesso a todas as propriedades e métodos do objecto. O objecto também pode possuir outras interfaces, não standard, que possibilitem um acesso directo a estas mesmas
propriedades e métodos.
Os objectos expostos por um Servidor de Automação encontram-se geralmente organizados hierarquicamente. Por exemplo, no Ms Word, o objecto Aplicação encontra-se no topo da hierarquia, seguindose os Documentos, Parágrafos, Palavras e outros. O Controlador deve aceder primeiro ao objecto do
topo da hierarquia para depois aceder aos restantes objectos. Relativamente ao Ms Word esta estrutura
é conhecida como Word Object Model (WOM) (Hart-Davis, 1997).
No caso da aplicação já estar a correr, o objecto Aplicação deve estar criado e registado no Servidor
como o objecto activo. Para aceder a este objecto o Controlador deve primeiro obter o CLSID da aplicação. Este CLSID pode ser obtido através da função CLSIDFromProgID disponibilizada pelo OLE
Automation. Na chamada desta função deve ser fornecido o identificador da aplicação (Identificador
Programático da Aplicação) que no caso do Ms Word é Word.Application. Com o CLSID obtido e a
63
função GetActiveObject o Controlador pode então obter-se a interface IUnknown do objecto Aplicação.
No caso da aplicação não estar a correr terá de ser o Controlador a solicitar a criação do objecto Aplicação. Utilizando o CLSID da aplicação e a função CoCreateInstance é criado este objecto e obtida a
sua interface IUnknown.
A partir desta interface IUnknown é depois possível aceder às propriedades e métodos de todos os
outros objectos. O acesso às propriedades e métodos de um objecto, nomeadamente ao objecto Aplicação, pode ser efectuado de duas formas diferentes.
A primeira forma recorre à interface IDispatch, anteriormente referida. Esta interface é obtida através
da função IUnknown::Queryinterface. Após a obtenção desta interface o Controlador apenas necessita
de chamar a função IDispatch::Invoke para aceder a todas as propriedades e métodos do objecto. As
propriedades e métodos de um objecto são conhecidos internamente através de um identificador. Por
isso, a interface IDispatch disponibiliza uma função, denominada IDispatch::GetIDsOfNames, que
permite obter um identificador dada uma designação de uma propriedade ou método. Para chamar um
método ou aceder a uma propriedade de um objecto basta depois chamar a função IDispatch::Invoke
com o identificador obtido e os parâmetros necessários. Esta forma de acesso foi desenvolvida essencialmente para Controladores desenvolvidos em Visual Basic (VB) ou Visual Basic for Applications
(VBA), e por isso permite estabelecer de uma forma fácil, ligações às propriedades e métodos de um
objecto, em tempo de execução.
Alternativamente, um Controlador pode aceder às propriedades e métodos de um objecto de uma forma directa. Para tal o Servidor deve disponibilizar interfaces específicas para estes acessos. Cada uma
destas interfaces também pode ser obtida através da função IUnknown::Queryinterface. Os acessos às
várias propriedades e métodos de um objecto são assim efectuados através de chamadas directas a
funções membro destas interfaces. Como nesta última situação é efectuado um acesso directo às funções de uma interface, situadas na tabela de funções virtuais (Virtual Function Table – VTBL), este
mecanismo de acesso é denominado de VTBL. Para a ligação às funções membro durante a compilação deve ser utilizada uma Biblioteca de Tipos (Type Library). Uma Biblioteca de Tipos é um ficheiro
que contém um conjunto de descrições próprias do OLE Automation sobre os objectos, propriedades e
métodos expostos. Este método de acesso é mais rápido que o anterior, visto não haver a sobrecarga
da indirecção efectuada pela interface IDispatch.
Um Servidor de Automação não é obrigado a dispor de ambos os métodos de acesso, pode apenas
implementar um destes. Quando disponibiliza ambos os métodos refere-se que o Servidor possui uma
interface dual. Esta interface dual é recomendável de modo a ser possível a ligação de vários tipos de
Controladores.
64
O OLE Automation também permite que as aplicações informem o exterior da ocorrência de certos
eventos. Para tal os Servidores de Automação destas aplicações devem possuir a interface IconnectionPointContainer. O Controlador deve aceder a esta interface para informar o Servidor sobre quais
os eventos que deseja receber. Em algumas situações o conjunto de eventos que pode ser assinalado
para o exterior é limitado.
4.1.3 O Microsoft Active Accessibility
Devido a determinadas dificuldades de visão, sensoriais, cognitivas, motoras ou de comunicação, uma
pessoa pode não conseguir interagir directamente com a interface de um sistema informático. Contudo
esta interacção poderá ser possível com o apoio de um dispositivo que funcione como intermediário
entre a pessoa e o sistema. Estes dispositivos que podem ser equipamentos electrónicos, programas de
computador, ou uma junção de ambos são denominados de Tecnologias de Apoio (TA’s) ou Ajudas
Técnicas (AT’s). Estes dispositivos devem adequar-se às capacidades dos seus utilizadores de modo a
traduzirem as ordens destes nas acções necessárias sobre o sistema. A interacção no sentido inverso,
do sistema para o utilizador, também deve ser convertida para uma forma adequada às capacidades da
pessoa. Por este motivo é importante que as várias aplicações existentes num sistema, assim como o
próprio sistema operativo, possam expor para o exterior a sua Interface do Utilizador (IU). Desta forma a TA utilizada por determinada pessoa pode interagir mais facilmente com o sistema e suas aplicações.
O MSAA (Microsoft Active Accessibility) é um mecanismo desenvolvido recentemente pela Microsoft
para a exposição da IU do sistema operativo Windows e das suas aplicações para o exterior. Este mecanismo foi desenvolvido especificamente para as TA’s, no entanto também pode ser utilizado por
outras aplicações.
Tal como o OLE Automation este mecanismo assenta sobre o COM. No MSAA a aplicação que expõe
a sua IU é referida como o Servidor, e a aplicação que acede a esta, o Cliente. Os vários elementos da
IU, como menus, botões, caixas de texto, e outros elementos são expostos aos Clientes através objectos COM. Estes objectos mantêm determinadas informações sobre os elementos gráficos associados,
denominadas de propriedades, como a designação do elemento, localização no ecrã e outros dados
importantes para as TA’s. Também disponibilizam métodos que os clientes podem chamar de modo a
ordenar a execução de determinadas acções. O acesso a estas propriedades e métodos é efectuado através de interfaces COM. Qualquer objecto que possa ser manipulado do exterior através do MSAA é
denominado de Objecto Acessível. A interface COM que permite o acesso directo às propriedades e
métodos de um Objecto Acessível é denominada de IAccessible.
Os vários objectos elementares que compõem um objecto mais complexo de uma IU são geralmente
denominados de objectos filhos. Caso os objectos filhos não se encontrem acessíveis, o objecto pai
deve disponibilizar informação sobre estes para o exterior. Devido a estas relações entre objectos, a IU
65
de uma aplicação encontra-se geralmente organizada através de uma estrutura hierárquica. A interface
IAccessible dispõe de mecanismos próprios que permitem a navegação ao longo esta estrutura.
Os Servidores MSAA de uma aplicação não necessitam de implementar a interface IAccessible para os
elementos da IU fornecidos pelo sistema operativo, como sejam os menus, barras de ferramentas, barras de deslocamento e outros, pois o MSAA já expõe estes objectos por defeito. Caso a aplicação apenas utilize elementos deste tipo então não necessita de implementar nenhuma interface IAccessible.
Uma aplicação apenas necessita de implementar esta interface para objectos da IU construídos de raiz.
Por exemplo, um processador de texto pode ter de implementar um Objecto Acessível próprio para a
exposição do texto escrito, caso não armazene o texto em elementos gráficos disponibilizados pelo
próprio sistema operativo, e que por isso já possuem uma interface IAccessible. Um exemplo destes
elementos é o Controlo de Edição (Edit Control). O MSAA expõe por defeito o texto armazenado num
Controlo de Edição através de uma string contida numa propriedade do Objecto Acessível associado.
À semelhança do OLE Automation o MSAA aconselha a implementação da interface standard IDispatch no Servidor. Tal como foi referido anteriormente o propósito desta interface é permitir um acesso indirecto, e em tempo de execução, às propriedades e métodos de um objecto. Este acesso é efectuado exclusivamente através da função IDispatch::Invoke. Desta forma os Objecto Acessíveis ficarão
também disponíveis a outras linguagens de programação não compiladas como o Visual Basic. No
caso de implementar ambas as interfaces, IAccessible e IDispatch, então refere-se que o Servidor possui uma interface dual.
Um Cliente MSAA pode aceder a um Objecto Acessível através de várias formas. Pode simplesmente
aceder ao objecto do topo da hierarquia para de seguida navegar ao longo desta estrutura, ao encontro
de outros objectos. Também é possível aceder a objectos localizados em determinada parte do ecrã
através de funções como AccessibleObjectFromWindow e AccessibleObjectFromPoint. Estas funções
devolvem um apontador para uma interface IAccessible ou IDispatch que depois possibilita o acesso
ao objecto.
Também existe a possibilidade de um Cliente aceder a objectos da IU que provocaram um determinado acontecimento. Para tal o Cliente deve informar o MSAA dos eventos sobre quais pretende receber
notificações. Esta operação deve ser efectuada através da função SetWinEventHook. Entre outros parâmetros deve ser fornecida a esta função o intervalo de eventos sobre os quais o Cliente pretende
receber notificações, assim como a função que deve ser chamada quando estes eventos ocorrerem.
Os mecanismos OLE Automation e MSAA apresentam grandes semelhanças entre si. De facto ambos
permitem o acesso às funcionalidades, dados e eventos de uma aplicação. Possuem no entanto objectivos diferentes. O principal objectivo do OLE Automation consiste em disponibilizar o acesso às funcionalidades, dados e eventos de uma aplicação de modo a esta poder ser controlada a partir de uma
aplicação exterior. O principal objectivo do MSAA consiste em disponibilizar o acesso à IU de uma
aplicação, de modo a ser possível a utilização de uma TA em conjunto com a aplicação.
66
4.2 Interacção com uma Aplicação Externa através da Interface
do Utilizador
Quando as aplicações não disponibilizam para o exterior o acesso às suas funcionalidades ou dados,
uma TA pode recorrer a métodos de mais baixo nível para interagir com a aplicação. Estes métodos
recorrem geralmente à manipulação dos canais de comunicação da aplicação com o exterior.
Na sua generalidade os sistemas operativos actuais adoptaram a metáfora da secretária de trabalho no
desenvolvimento da sua interface com o utilizador. O ecrã do computador, sendo a secretária de trabalho, contém objectos gráficos associados às várias aplicações e serviços disponibilizados pelo sistema
operativo. Neste ambiente cada aplicação encontra-se representada através de um ícone. Através de
um duplo clique sobre esse ícone o utilizador indica que pretende trabalhar com aquela aplicação e
dessa forma o sistema operativo cria um espaço no ecrã, denominado de janela, destinado exclusivamente à interacção do utilizador com a aplicação.
Actualmente os vários sistemas operativos também conseguem partilhar os vários recursos de um
computador (e.g. memória, processador, disco, etc.) por várias aplicações que se encontram a correr
num mesmo momento. Desta forma, no ecrã do computador poderão existir várias janelas abertas,
cada qual associada a uma aplicação diferente. No entanto só é permitida a interacção com uma aplicação em cada momento. A aplicação sobre a qual o utilizador se encontra a trabalhar é usualmente
denominada de aplicação activa. Desta forma a janela associada a esta aplicação também recebe a
designação de janela activa. Para activar uma outra aplicação o utilizador deve efectuar um clique
sobre a janela correspondente.
Todas as entradas produzidas pelo utilizador no sistema, quer através do teclado, quer através do rato,
são direccionadas para a janela da aplicação activa sob a forma de mensagens do sistema operativo.
Por este motivo a rotina principal destas aplicações consiste num ciclo (message loop) que espera continuamente a chegada destas mensagens. Na chegada de uma mensagem esta é analisada e de seguida
encaminhada para o componente apropriado da aplicação. Por exemplo, quando o utilizador pressiona
uma tecla no sistema operativo Windows, a aplicação activa recebe duas mensagens, a mensagem
WM_KEYDOWN, quando a tecla é carregada, e a mensagem WM_KEYUP, quando a mesma tecla é
solta. A movimentação do rato e a pressão dos seus botões também provocam o envio de mensagens à
aplicação activa. O simples movimento do rato sobre a janela da aplicação activa provoca um envio
contínuo de mensagens à aplicação, assinalando cada nova posição do ponteiro do rato, por outro lado
um clique no botão esquerdo, provoca, à semelhança do que sucede com as teclas, o envio da mensagem WM_LBUTTONDOWN, indicando que este botão foi carregado, e a mensagem
WM_LBUTTONUP, indicando que o mesmo botão foi solto. Para os outros botões também são geradas mensagens semelhantes. Acompanhando as mensagens são também fornecidas informações que
67
permitem caracterizar de uma forma pormenorizada o evento ocorrido, como seja o código da tecla, a
posição do rato, ou outras, dependendo da mensagem envolvida.
Nestes sistemas operativos o utilizador interage com as várias aplicações com o recurso aos vários
dispositivos de entrada, como sejam o teclado e o rato. Por exemplo, para a selecção de uma determinada opção do menu, deve ser movimentado o ponteiro do rato na direcção da opção, e de seguida
efectuado um clique no botão esquerdo. A selecção desta opção também pode ser efectuada através do
teclado pressionando uma sequência de teclas. Através destas operações o utilizador acede assim às
várias funcionalidades disponibilizadas por uma aplicação.
Uma aplicação externa pode também aceder a estas funcionalidades simulando as operações que o
utilizador efectuaria sobre a aplicação. Para efectuar esta simulação a aplicação externa deve conseguir
sintetizar as mensagens que seriam geradas pelo sistema operativo caso o utilizador estivesse a manipular a aplicação. Estas mensagens devem depois ser enviadas à aplicação.
Devido à inexistência de mecanismos apropriados, esta técnica tem sido utilizada pelas TA’s, e mais
particularmente pelos SACAA’s, na interacção com as aplicações externas. Como a aplicação externa
julga que está a ser manipulada com o recurso aos dispositivos tradicionais de entrada, esta técnica foi
designada, na área da Engenharia de Reabilitação, como Acesso Transparente.
Esta técnica também tem sido utilizada recentemente na área dos Agentes de Software para o desenvolvimento de Agentes de Interface. Estes agentes à semelhança das TA’s também pretendem apoiar o
utilizador na realização de determinadas tarefas num computador, como por exemplo a gestão de correio electrónico, e por isso necessitam de aceder às funcionalidades da aplicação sobre a qual a pessoa
se encontra a trabalhar. Lieberman descreve esta técnica utilizando uma metáfora que consiste na manipulação de uma marioneta (Lieberman, 1998). Considerando a aplicação externa a marioneta, qualquer outra aplicação do sistema pode controlá-la puxando determinadas cordas. O puxar de uma corda
consiste em enviar à aplicação uma mensagem que irá provocar naquela uma determinada acção. Por
este motivo Lieberman designa esta técnica como Cordas de Marioneta (Marionette Strings).
Através desta técnica é possível aceder às funcionalidades de uma aplicação, ainda que em determinadas situações a síntese das mensagens apropriadas possa ser bastante complexa. O acesso aos dados
pertencentes a uma aplicação é no entanto mais complicado para não dizer impossível, visto que os
sistemas operativos modernos impedem o acesso aos dados internos de uma aplicação. Para proteger
as aplicações contra as interferências de elementos externos os sistemas operativos actuais atribuem
um espaço de memória único e exclusivo a cada aplicação. Por exemplo, o texto introduzido por um
utilizador num processador de texto estará armazenado numa variável dentro do espaço de memória da
aplicação e por isso não poderá ser acedido de forma directa por outra aplicação.
Em algumas situações poderá ser efectuado em paralelo com a aplicação, o processamento das acções
do utilizador. Desta forma pode ser possível a manutenção de uma cópia de determinadas variáveis
68
existentes no interior da aplicação. Voltemos ao exemplo do processador de texto. Consideremos que é
a aplicação activa do sistema. Utilizando certos mecanismos do sistema operativo, como por exemplo
os Hooks no sistema operativo Windows, é possível inspeccionar as mensagens que chegam ao processador de texto como resultado do pressionar de teclas. Através do processamento paralelo destas
mensagens é assim possível conhecer, em simultâneo com o processador de texto, as teclas pressionadas pelo utilizador. Torna-se assim possível a uma aplicação, manter uma cópia externa do texto que a
pessoa se encontra a introduzir num processador de texto. A Figura 4-5 ilustra esta técnica.
De uma forma geral o mecanismo de Hooks no sistema Windows permite a uma aplicação inspeccionar as mensagens enviadas a outras aplicações. Um hook é um ponto no mecanismo de tratamento de
mensagens do sistema, no qual uma aplicação pode instalar uma rotina para monitorizar o tráfico de
mensagens e assim processar determinados tipos de mensagens antes destas chegarem ao seu destino.
Existem 14 tipos de hooks diferentes, cada qual destinado a interceptar um certo grupo de mensagens.
Por exemplo, através de um hook do tipo WH_GETMESSAGE é possível interceptar todas mensagens
enviadas a uma fila de mensagens de uma aplicação. Com hooks do tipo WH_KEYBOARD ou
WH_MOUSE é possível monitorizar apenas as mensagens originadas através do teclado ou rato, respectivamente. Depois de interceptada uma mensagem a aplicação pode decidir do seu seguimento até
ao destino ou não. Os hooks podem ser globais, interceptando as mensagens enviadas a qualquer aplicação, ou então específicos a uma aplicação, interceptando apenas as mensagens enviadas àquela aplicação. Dependendo do tipo de hook assim este pode ser global, específico, ou ambos. Os hooks globais
consomem mais recursos no sistema e por isso devem ser evitados sempre que possível. Um hook é
instalado por uma aplicação através da função SetWindowsHookEx. A esta função deve ser fornecido o
tipo de hook, a rotina a ser chamada quando do aparecimento de uma mensagem e o identificador do
Figura 4-5 - Manutenção de uma cópia do texto que o utilizador está a introduzir numa
aplicação.
69
thread sobre o qual vai ser instalado o hook.
Os hooks também permitem a detecção de determinados acontecimentos na aplicação externa. Tal
pode ser efectuado através da monitorização de certas mensagens recebidas ou enviadas pela aplicação. Por exemplo para a detecção do acontecimento que consiste na pressão de uma tecla por parte do
utilizador, pode ser instalado um hook que intercepta mensagens do tipo WM_KEYDOWN. Ao surgir
uma destas mensagens, indicando que uma tecla foi pressionada, é chamada a rotina instalada pelo
hook que deve efectuar o tratamento do evento. Como resultado deste evento pode ser efectuado em
seguida um determinado processamento.
4.3 Implementação
Atrás foram apresentadas duas formas distintas através das quais uma aplicação pode aceder às funcionalidades e dados de uma outra aplicação. Na primeira forma a aplicação deve disponibilizar uma
Interface de Programação para o exterior. Vimos que no sistema operativo Windows estas interfaces
podiam ser desenvolvidas utilizando dois mecanismos, o OLE Automation e o MSAA, ambos baseados no COM. Na segunda forma a aplicação não expõe deliberadamente as suas funcionalidades e
dados às outras aplicações do sistema. O acesso a estas é efectuado através da manipulação de mensagens que circulam através da IU. Em relação ao primeiro, o segundo processo oferece poucas possibilidades para a interacção entre as aplicações. É no entanto a única alternativa quando nenhum dos anteriores se encontra presente.
Através destes mecanismos o nosso SCAA pode enviar para a aplicação externa, seja um processador
de texto, editor de texto, ou outra aplicação, cada uma das letras seleccionadas pelo utilizador. Também pode aceder ao texto que já se encontra escrito de modo a prestar um apoio mais contextualizado,
nomeadamente pode obter os caracteres já escritos de uma palavra e algumas das palavras anteriores.
Estes mecanismos também possibilitam que uma aplicação seja notificada de eventos que sucedem
numa outra aplicação. Esta possibilidade é importante pois o nosso sistema necessita de ser informado
da escrita de uma nova letra no processador de texto para em seguida efectuar uma nova predição de
palavras. Também necessita de saber quando uma nova palavra está completa para poder actualizar a
informação estatística sobre a escrita do utilizador. No nosso sistema, para o controlo do processo de
varrimento decidimos utilizar os botões do rato. Como durante o processo de escrita a aplicação activa
será o processador de texto, este irá receber também as mensagens provocadas pelo pressionar dos
botões do rato. Por este motivo estes eventos também devem ser assinalados ao componente do sistema que controla o mecanismo de varrimento.
O Microsoft Word disponibiliza para o exterior o acesso a todas as suas funcionalidades e dados através de uma Interface de Programação, desenvolvida especificamente para esta aplicação. Esta interface encontra-se implementada através do mecanismo OLE Automation, que disponibiliza para o exte-
70
class CProcessadorTexto : public CWnd {
public:
virtual int Inicializar( CWnd *pCWndReceptor, HWND hwndProcessadorTexto ) = 0;
virtual void Terminar() = 0;
virtual
virtual
virtual
virtual
virtual
CString
CString
CString
CString
CString
ObterPrefixo() = 0;
ObterSufixo() = 0;
ObterPalavra() = 0;
ObterPalavraAnterior() = 0;
ObterPalavraAnteriorAnterior() = 0;
virtual
virtual
virtual
virtual
CString
CString
CString
CString
ObterFraseEsquerda() = 0;
ObterFraseDireita() = 0;
ObterFrase() = 0;
ObterFraseAnterior() = 0;
virtual CPoint ObterPosicaoCursorTexto() = 0;
virtual void EscreverTexto( CString texto) = 0;
virtual void ApagarPrefixo() = 0;
virtual void CompletarPalavra( CString palavra) = 0;
...
};
Quadro 4-1 - Definição parcial da classe abstracta CProcessadorTexto.
rior um conjunto de objectos, organizados hierarquicamente, que assim permitem o acesso às funcionalidades e dados da aplicação. Esta estrutura de objectos é designada por Word Object Model
(WOM). Verificámos no entanto que o conjunto de eventos assinalados para o exterior através desta
interface é um pouco limitado. Por este motivo utilizámos o mecanismo dos hooks para a detecção dos
eventos necessários. Com o decorrer do tempo pensamos que outras aplicações poderão também vir a
implementar Interfaces de Programação. No entanto a maioria das aplicações não disponibiliza este
tipo de interfaces pelo que o acesso às suas funcionalidades e dados deve ser efectuado através da IU.
Através do nosso sistema pretendemos possibilitar o apoio à composição de mensagens num vasto
conjunto de aplicações do sistema operativo Windows. Num pequeno editor de texto, para em conjunto com um sintetizador de fala, apoiar a conversação, num processador de texto sofisticado para a escrita de documentos formatados, ou mesmo num programa de correio electrónico para a troca de mensagens via Internet. Por este motivo o nosso sistema deverá interagir com uma grande quantidade de
aplicações que disponibilizam as suas funcionalidades e dados para o exterior utilizando diferentes
mecanismos. Na melhor das hipóteses a interacção é efectuada através de uma Interface de Programação completa, como sucede com o Ms Word, noutras situações apenas existe um Interface de Programação incompleta como a disponibilizada por defeito pelo MSAA, na pior das situações a interacção
terá de ser efectuada através da IU.
Houve então a necessidade de isolarmos os componentes do nosso sistema das diferenças existentes
entre os vários mecanismos de interacção. Desenvolvemos assim um novo componente que representa
no interior do SCAA o processador de texto com o qual o utilizador está a trabalhar. Este componente
apresenta sempre a mesma interface para os outros componentes do sistema, independentemente do
mecanismo de interacção utilizado com a aplicação externa. Este componente foi desenvolvido com o
recurso a uma classe abstracta do C++ denominada de CProcessadorTexto. Uma classe abstracta ape-
71
nas possui funções membro virtuais, sem qualquer implementação. A implementação de cada uma
destas funções é efectuada nas classes derivadas da classe abstracta. Cada uma das classes derivadas
pode assim implementar as várias funções virtuais utilizando diferentes mecanismo de interacção com
a aplicação externa. O Quadro 4-1 apresenta a definição parcial da classe abstracta CProcessadorTexto.
Nesta classe encontram-se definidas várias funções virtuais que depois deverão ser implementadas nas
classes derivadas. Entre estas destacamos a função membro void EscreverTexto( CString texto) que
permite a escrita de uma sequência de caracteres no processador de texto, a função CString ObterPrefixo() que permite a obtenção dos caracteres já escritos de uma palavra, e a função CString ObterPalavraAnterior() que possibilita a obtenção da palavra anterior.
A partir da Classe Abstracta CProcessadorTexto foi derivada a classe CMicrosoftWord que implementa as funções virtuais utilizando o mecanismo OLE Automation e o WOM. Esta classe foi desenvolvida de modo a possibilitar a interacção com o processador de texto Microsoft Word. Também foi derivada a classe CProcessadorTextoGenerico que permite a interacção com qualquer processador de
texto, editor de texto, ou outra aplicação através da IU. No futuro também poderemos derivar uma
outra classe, que recorra essencialmente ao MSAA para a interacção com as aplicações externas.
Figura 4-6 – Mecanismo que possibilita a interacção do SACAA com qualquer processador de texto do sistema e em especial com o Ms Word.
72
CString palavraAnterior = m_pProcessadorTexto ->ObterPalavraAnterior();
CString prefixo = m_pProcessadorTexto ->ObterPrefixo();
m_preditorPalavras.EfectuarPredição( m_dicionario, m_perfilUtilizador, palavraAnterior, prefixo,
palavrasPreditas );
Quadro 4-2 - Acesso ao objecto que representa o processador de texto no sistema, através de um
apontador.
Desta forma quando o utilizador se encontra a trabalhar com o Ms Word é criado no sistema um objecto do tipo CMicrosoftWord, incumbido de estabelecer a interacção entre os vários componentes do
SACAA e o Microsoft Word. Quando a aplicação activa não é o Ms Word deve ser criado um objecto
do tipo CProcessadorTextoGenerico. Este objecto irá permitir a interacção com qualquer outra aplicação. A Figura 4-6 ilustra este mecanismo.
A partir do momento que o objecto associado ao processador de texto é criado os outros componentes
do sistema podem interagir com a aplicação activa através da interface disponibilizada pela classe
abstracta CProcessadorTexto. Dependendo do tipo exacto de processador de texto, CMicrosoftWord
ou CProcessadorTextoGenerico, assim serão chamadas as funções membro adequadas. Este mecanismo, fornecido pelo C++ é denominado de Polimorfismo. Para a obtenção deste comportamento polimórfico os objectos devem ser manipulados através de apontadores (Stroustrup, 1997). Por isso, a
interacção dos componentes do SACAA, com o objecto que representa o processador de texto é efectuada através de um apontador para a classe abstracta CProcessadorTexto. No Quadro 4-2 apresentamos um destes acessos. Nesta situação é obtida através deste objecto, a palavra anterior e o prefixo da
palavra que o utilizador se encontra a escrever. De seguida é efectuada uma predição de palavras.
A classe abstracta CProcessadorTexto é derivada da classe CWnd, definida pela MFC (Microsoft
Foundation Classes). Esta classe da MFC incorpora as funcionalidades da API do Windows no que
respeita à manipulação de janelas. Cada objecto CWnd encontra-se associado a uma janela do sistema.
Internamente estes objectos possuem o identificador da janela associada. Este identificador é denominado pelo Windows como HWND (Handler Window). Através desta derivação a classe abstracta CProcessadorTexto herda várias características da classe CWnd, entre as quais a possibilidade de envio
e recepção de mensagens no sistema operativo Windows, motivo pelo qual foi efectuada esta derivação. Por sua vez as classes derivadas a partir desta classe, CMicrosoftWord e CProcessadorTextoGenerico, também possuirão esta capacidade. Esta capacidade é importante para que este componente
possa indicar a outros componentes do SACAA a ocorrência de determinados eventos no processador
de texto. A notificação destes eventos é efectuada através de mensagens do Windows. No Quadro 4-3
são apresentadas as mensagens utilizadas no nosso sistema. Este componente uniformiza por isso também a forma como são efectuadas as notificações dos eventos aos componentes do sistema. Independentemente da forma como são assinalados pela aplicação externa, as notificações dos eventos são
convertidas internamente para as mensagens apresentadas no Quadro 4-3.
73
Mensagens
WM_TECLA_PRESSIONADA
WM_BOTAO_ESQ_BAIXO
WM_BOTAO_ESQ_CIMA
WM_BOTAO_DIR_BAIXO
WM_BOTAO_DIR_CIMA
WM_MOVIMENTO_RATO
WM_NOVA_PALAVRA
Eventos
Foi pressionada uma tecla
O botão esquerdo do rato foi para baixo
O botão esquerdo do rato foi para cima
O botão direito do rato foi para baixo
O botão direito do rato foi para cima
O ponteiro do rato foi movido
Foi escrita uma nova palavra
Quadro 4-3 - Mensagens enviadas pelo objecto que representa o processador de texto
no nosso sistema.
4.3.1 Interacção com o Processador de Texto Microsoft Word
Como referimos atrás a classe CMicrosoftWord, derivada da classe abstracta CProcessadorTexto permite a interacção do nosso sistema com o processador de texto Microsoft Word. A interacção é efectuada com o recurso ao mecanismo OLE Automation, que permite o acesso às funcionalidades e dados
expostos pelo Ms Word, através do WOM (Word Object Model).
4.3.1.1 Acesso às Funcionalidades e Dados
Para o acesso aos vários objectos existentes no WOM esta classe deve implementar internamente um
Cliente ou Controlador de Automação. Como vimos anteriormente existem duas formas diferentes de
implementar um Controlador de Automação. Um Controlador pode recorrer unicamente à Interface
standard IDispatch, que depois possibilita o acesso às várias propriedades e métodos dos objectos
através da utilização da função IDispatch::Invoke, ou então pode aceder às várias interfaces do Servidor de Automação que fornecem um acesso directo às propriedades e métodos dos objectos. Como o
nosso sistema foi implementado na linguagem C++ qualquer um dos métodos poderia ser utilizado.
A MFC (Microsoft Foundations Classes) dispõe de algumas facilidades para a utilização do OLE Automation. Em particular permite criar, com o recurso a uma Biblioteca de Tipos (Type Library), um
conjunto de classes que encapsulam o acesso aos vários objectos descritos naquela biblioteca, implementando assim um Cliente de Automação. Todas as classes geradas são derivadas da classe da MFC
COleDispatchDriver. Cada uma destas classes pode depois ser associada a uma interface IDispatch.
Estas classes também dispõem de um conjunto de funções membro que facilitam a chamada da função
IDispatch::Invoke. Esta última função é chamada indirectamente através da função ColeDispatchDriver::InvokeHelper.
Para a implementação do Cliente de Automação utilizámos estas facilidades da MFC pelo que o nosso
Cliente de Automação utiliza a interface IDispatch. Através da Biblioteca de Tipos (Type Library)
74
class _Application : public COleDispatchDriver
{
public:
_Application() {}
// Calls COleDispatchDriver default constructor
...
// Operations
public:
...
LPDISPATCH
LPDISPATCH
LPDISPATCH
LPDISPATCH
LPDISPATCH
...
}
GetDocuments();
GetWindows();
GetActiveDocument();
GetActiveWindow();
GetSelection();
Quadro 4-4 - Definição parcial da classe _Application, que possibilita o acesso ao objecto situado
no topo da hierarquia do WOM.
disponibilizada pelo Ms Word foram criadas com o recurso a uma ferramenta de apoio do Visual C++
(ClassWizard) várias classes encapsulando os acessos aos objectos do WOM necessários ao nosso
sistema. Através deste processo foram geradas automaticamente as classes Aplicação (_Application),
Selecção (Selection) e Intervalo (Range). Apresentamos parte da definição da classe Aplicação no
Quadro 4-4. Também apresentamos a implementação de algumas das suas funções membro no
Quadro 4-5. Com podemos ver estas funções acedem aos vários métodos e propriedades do objecto
Aplicação através da indicação do respectivo identificador na chamada da função ColeDispatchDriver::InvokeHelper.
O objecto Aplicação situa-se no topo da hierarquia do WOM e possibilita o acesso aos outros objectos,
como por exemplo o Documento Activo, Janela Activa ou Selecção. Para tal devem ser chamadas as
funções que devolvem os apontadores para as interfaces IDispatch pretendidas. O objecto Selecção
permite seleccionar vários objectos existentes num documento do Ms Word. Após a selecção de um
conjunto de objectos, como por exemplo as palavras ou linhas de um documento, pode ser efectuada
uma operação sobre todos estes, como a alteração do tipo ou do tamanho da letra. Esta operação de
selecção é frequentemente utilizada para a manipulação de objectos em várias aplicações do sistema
operativo Windows.
LPDISPATCH _Application::GetActiveWindow()
{
LPDISPATCH result;
InvokeHelper(0x4, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
LPDISPATCH _Application::GetSelection()
{
LPDISPATCH result;
InvokeHelper(0x5, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
Quadro 4-5 - Implementação de duas funções membro da classe _Application..
75
O WOM também permite a um Cliente de Automação efectuar selecções num documento do Ms
Word. Utilizámos esta possibilidade para a obtenção do contexto de escrita do utilizador. Enquanto o
utilizador está a escrever, o objecto Selecção encontra-se vazio porque nada está seleccionado. O inicio e o fim da selecção encontram-se no mesmo ponto do documento, que corresponde ao local no
qual está situado o cursor de texto (caret). No entanto, sempre que pretender, o Cliente de Automação
pode estender a Selecção para a esquerda de modo a obter os caracteres que o utilizador acabou de
escrever. Também pode continuar a estender a Selecção de modo a obter as palavras anteriores.
Estas operações são efectuadas muito rapidamente e por isso tornam-se praticamente imperceptíveis
ao utilizador que se encontra a escrever. Há no entanto o perigo de o utilizador carregar numa tecla no
momento que o Controlador de Automação efectua uma selecção do texto escrito. Nesta situação o
texto seleccionado é destruído.
Numa primeira abordagem evitámos esta situação bloqueando a entrada de dados na aplicação Ms
Word sempre que estava a ser efectuada uma selecção pelo Controlador de Automação. Tal era efectuado através da função BlockInput da API do Windows. Esta função, em vez de acumular as teclas
pressionadas durante o bloqueio, eliminava-as simplesmente, pelo que em algumas situações o utilizador verificava que não surgia no documento o caracter que tinha acabado de teclar. Resolvemos este
problema utilizando o objecto Intervalo (Range) do WOM.
Os objectos Intervalo são em tudo semelhantes à Selecção, com a diferença de não possuírem existência gráfica. Podem também existir vários objectos deste tipo num documento do Ms Word, cada qual
seleccionando um determinado conjunto de objectos. Para a obtenção do contexto de escrita do utili-
int CMicrosoftWordProcessor::InicializarOleMsWord(){
CLSID clsid;
LPUNKNOWN pUnk;
LPDISPATCH pDisp;
::CLSIDFromProgID(L"Word.Application", &clsid);
if(::GetActiveObject(clsid, NULL, &pUnk) == S_OK){
//Obtem uma "dispatch" interface para o msword
if(pUnk->QueryInterface(IID_IDispatch, (void**) &pDisp) == S_OK){
m_apWord.AttachDispatch(pDisp);
pUnk->Release();
return 1;
}
else{
AfxMessageBox("PreditorPalavras:Dispatch para o objecto MsWord não
encontrada.");
pUnk->Release();
return 0;
}
}
else{
AfxMessageBox("PreditorPalavras:Objecto MsWord não encontrado.");
return 0;
}
}
Quadro 4-6 - Implementação da função que estabelece a ligação ao Ms Word.
76
zador utilizamos agora um objecto Intervalo. Numa primeira fase o objecto Intervalo é tornado igual
ao objecto Selecção, ficando com o inicio e fim iguais a este, ambos situados no ponto do cursor de
texto. Numa segunda fase o inicio do objecto Intervalo é estendido para a esquerda de modo a ser obtido o prefixo da palavra que o utilizador está a escrever e algumas das palavras escritas anteriormente.
Como este objecto não tem existência gráfica, não pode ser manipulado através da IU do Ms Word e
por isso não existe a possibilidade do utilizador eliminar inadvertidamente o texto seleccionado.
Para o acesso a qualquer um destes objectos é necessário obter primeiro um apontador para a interface
IDispatch do objecto Aplicação. A classe CMicrosoftWord efectua esta operação através da função
membro CMicrosoftWord::InicializarOleMsWord(), apresentada no Quadro 4-6. Inicialmente é obtido
o CLSID do programa Ms Word. Com este identificador é obtido de seguida um apontador para a
interface IUnknown do objecto activo no Servidor, ou seja o objecto Aplicação. Através desta interface
é obtida depois a interface IDispatch que em seguida é associada uma variável membro, denominada
m_appWord. O tipo desta variável é _Application, a classe que encapsula a IDispatch do objecto Aplicação. A partir deste momento pode ser chamada qualquer uma das funções membro desta classe,
como por exemplo _Application::GetActiveWindow() ou _Application::GetSelection(), para o acesso a
determinadas propriedades ou dados do objecto Aplicação.
Através da manipulação do WOM são implementadas as várias funções virtuais definidas na classe
abstracta CProcessadorTexto. A implementação da função CMicrosoftWord::EscreverTexto( CString
texto ) é bastante simples. Esta função é apresentada no Quadro 4-7. Primeiro é obtido o objecto Selecção, através da função _Application::GetSelection(), e em seguida utilizado o método Selection::TypeText(LPCTSTR Text) para a escrita do texto pretendido no documento activo do Ms Word.
A implementação das funções CString CMicrosoftWord::ObterPrefixo() e CString CMicrosoftWord::ObterPalavraAnterior() também recorrem ao objecto Selecção. Ambas as funções utilizam
uma função auxiliar denominada CMicrosoftWord::ObterFraseEsquerda(). Esta função permite obter
a parte da frase situada à esquerda do cursor de texto. Após a obtenção da parte esquerda da frase as
funções CString ObterPrefixo() e CString ObterPalavraAnterior() efectuam a sua divisão em palavras
(tokenização) e no caso de existirem, retornam respectivamente o prefixo e a palavra anterior. Considerámos como separadores de palavras os caracteres Espaço, Tabulação, Carriage Return, Line-Feed
e também os seguintes caracteres .:)(;/.?!«»". As outras funções virtuais definidas pela classe abstracta
CProcessadorTexto, como sejam CString ObterSufixo(), CString ObterPalavra(), void ApagarPrefixo(), encontram-se implementadas de forma semelhante.
void CMicrosoftWord::EscreverTexto( CString texto ){
Selection oSeleccao = m_apWord.GetSelection();
oSelection.TypeText( word );
}
Quadro 4-7 - Implementação da função EscreverTexto na classe derivada CMicrosoftWord.
77
CString CMicrosoftWord::ObterFraseEsquerda(){
Selection oSeleccao = m_apWord.GetSelection();
Range oIntervalo = oSeleccao.GetRange();
CString antigoTextoOIntervalo = oIntervalo.GetText();
oIntervalo.MoveStart( COleVariant( (short) 1 ), COleVariant( (short) -1 ) );
textoOIntervalo = oIntervalo.GetText();
while( ( textoOIntervalo != antigoTextoOIntervalo )
&& ( ! strchr( SEPARADORES_FRASES, textoOIntervalo[ 0 ] ) ) ){
antigoTextoOIntervalo = textoOIntervalo;
oIntervalo.MoveStart( COleVariant( (short) 1 ), COleVariant( (short) -1 ) );
textoOIntervalo = oIntervalo.GetText();
}
return antigoTextoOIntervalo;
}
Quadro 4-8 - Função da classe CMicrosoftWord que permite obter a parte uma frase que se situa à
esquerda do curso de texto.
Para ilustrarmos a forma como é efectuado o acesso ao texto escrito no Ms Word apresentamos no
Quadro 4-8 a função CMicrosoftWord::ObterFraseEsquerda() de uma forma simplificada.
Esta função começa por obter o objecto Selecção. Em seguida é criado um objecto Intervalo que é
tornado igual ao objecto Selecção. Através da função Range::MoveStart é efectuado um ciclo que vai
estendendo o Intervalo para a esquerda até surgir um separador de frase. Foram considerados separadores de frases os caracteres Carriage Return, Line-Feed e os caracteres .?!. O ciclo também deve
terminar caso o Intervalo chegue ao inicio do documento. Por isso é verificado em cada iteração se foi
possível estender o Intervalo, um caracter para a esquerda. Quando tal não acontece verifica-se que foi
atingido o inicio do documento e por isso o ciclo também deve ser terminado.
4.3.1.2 Sinalização de Eventos
O WOM apresenta no entanto uma grande limitação ao nível do conjunto de eventos que disponibiliza
para o exterior. O Ms Word 97 apenas consegue informar outras aplicações sobre os seguintes eventos: (1) Close, New e Open (eventos dos documentos); (2) LostFocus e GetFocus (eventos ActiveX);
(3) Document Change e Quit (eventos da aplicação).
Nenhum dos eventos requerido pelo nosso sistema é assinalado pelo WOM. Por isso foi necessário
encontrar outro processo que permitisse a notificação destes eventos. Este processo recorreu à utilização de dois hooks instalados sobre o processador de texto Ms Word. Este mecanismo não é específico
do Ms Word e por isso também foi utilizado para a detecção destes eventos nos outros processadores
de texto.
78
Figura 4-7 - Sinalização do evento WM_TECLA_PRESSIONADA e acesso ao WOM através do
OLE Automation.
O primeiro hook, do tipo WH_KEYBOARD, é utilizado para a intercepção das mensagens
WM_KEYDOWN e WM_KEYUP, permitindo assim detectar quando o utilizador carrega numa tecla.
Através desta notificação também é possível verificar se uma nova palavra foi concluída. Através de
um segundo hook, do tipo WH_MOUSE, são interceptadas as mensagens resultantes das várias operações efectuadas com o rato.
Na instalação de um hook deve fornecer-se a função para o tratamento da mensagem interceptada. Esta
função é chamada no contexto da aplicação cuja mensagem foi interceptada, neste caso o Ms Word.
Por este motivo foi necessário implementar as funções de tratamento das várias mensagens interceptadas num dll (dynamic link library). Assim estas funções podem ser carregadas para o espaço de memória do processador de texto e chamadas no contexto de execução deste.
Estas funções devem ser bastante rápidas pois enquanto não terminarem, o sistema operativo impede a
aplicação monitorizada de receber novas mensagens. Uma implementação deficiente destas funções
pode impedir a aplicação de tratar as mensagens resultantes da interacção com o utilizador num espaço
de tempo razoável, tornando a sua utilização impraticável. Por este motivo as funções implementadas
para o tratamento das mensagens interceptadas limitam-se a enviar uma mensagem ao objecto CMicrosoftWord existente na nossa aplicação. Esta mensagem assinala assim a ocorrência de um determinado evento. O objecto CMicrosoftWord processará esta mensagem que depois também enviará ao
componente apropriado do SACAA. Este componente pode depois consultar o WOM para obter outra
informação necessária ao processamento do evento. A Figura 4-7 ilustra a sinalização do evento que
indica que uma tecla foi pressionada no Ms Word.
Para iniciar a monitorização destes eventos o objecto CMicrosoftWord chama uma função existente no
dll denominada de InicializarHooks. Esta função cria os hooks necessários sobre o Ms Word. Apresentamos a função InicializarHooks no Quadro 4-9. Como podemos verificar esta função requer o identi-
79
int InicializarHooks( DWORD threadIdInstalado, HWND hwndInstalador ){
m_hwndInstalador = hwndInstalador;
//Instala o hook para o teclado
m_hookTeclado = (HHOOK) SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC) TratarHookTeclado,
threadIdInstalado);
if( m_hookTeclado == NULL ){
AfxMessageBox("Hook: Problema a instalar o hook para o teclado");
return 0;
}
//Instala o hook para o rato
m_hookRato = (HHOOK) SetWindowsHookEx( WH_MOUSE, (HOOKPROC) TratarHookRato, threadIdInstalado);
if( m_hookRato == NULL ){
AfxMessageBox("Hook: Problema a instalar o hook para o rato");
return 0;
}
...
return 1;
}
Quadro 4-9 - Função do dll que inicializa os vários hooks.
ficador do thread sobre o qual vão ser instalados os hooks e o identificador da janela (HWND) que
receberá as notificações dos eventos. O thread sobre o qual vão ser instalados os hooks é o thread
principal do Ms Word e a janela que irá receber as notificações dos eventos é a janela associada ao
objecto CMicrosoftWord.
A função InicializarHooks começa por armazenar o identificador da janela associada ao objecto CMicrosoftWord na variável membro m_hwndInstalador. Posteriormente as mensagens associadas aos
eventos serão enviadas para a janela com este identificador. Em seguida instala os dois hooks através
da função SetWindowsHookEx. Para a instalação de um hook deve ser fornecida à função SetWindowsHookEx a rotina que efectua o tratamento das mensagens interceptadas e o identificador do thread a
monitorizar. No Quadro 4-10 apresentamos a implementação da função que trata a intercepção das
mensagens WM_KEYDOWN e WM_KEYUP, a função TratarHookTeclado. Esta função pertence a um
tipo especial de funções do sistema operativo Windows denominado de funções CALLBACK. Estas
funções são chamadas pelo próprio sistema operativo. Neste caso a função é chamada no contexto da
aplicação monitorizada, quando o sistema detectada a chegada de uma das mensagens vigiadas. No
caso particular de um hook sobre o teclado esta função recebe através do parâmetro wParam o código
virtual da tecla que originou a mensagem. Este código virtual é uma abstracção efectuada pelo sistema
operativo Windows. Através desta abstracção cada uma das teclas possui um código único, independente do fabricante do teclado. O outro parâmetro, lParam contém um conjunto de informações relativas à mensagem interceptada e codificadas ao nível dos bits. O bit mais significativo deste parâmetro
de 32 bits toma o valor 0 quando se trata da mensagem WM_KEYDOWN e o valor 1 para o caso da
mensagem WM_KEYUP.
Por este motivo, numa primeira fase a função TratarHookTeclado verifica este bit para saber qual a
mensagem que está a tratar. Caso seja uma mensagem WM_KEYDOWN a função envia a mensagem
WM_TECLA_PRESSIONADA ao objecto CMicrosoftWord. Os parâmetros wParam e lParam, associados à mensagem também são enviados.
80
CALLBACK TratarHookTeclado ( WORD wParam, DWORD lParam ){
...
int codigoVirtualTecla = (int) wParam;
if( ! ( lParam & 0x80000000 ) ){ //WM_KEYDOWN
PostMessage( m_hwndInstalador, WM_TECLA_PRESSIONADA, wParam, lParam);
for( int i = 0; i < MAX_NUM_CODIGOS_VIRTUAIS; i++){
if( m_codigosVirtuaisTeclas[ i ] == codigoVirtualTecla ){
PostMessage( m_hwndInstalador, WM_TECLA_PRESSIONADA,
wParam, lParam);
return 1;
}
}
}
if( lParam & 0x80000000 ){ //WM_KEYUP
for( int i = 0; i < MAX_NUM_CODIGOS_VIRTUAIS; i++)
if(m_codigosVirtuaisTeclas [ i ] == codigoVirtualTecla )
return 1;
}
return CallNextHookEx( m_hookTeclado, wParam, lParam);
}
Quadro 4-10 - Rotina do dll que efectua o tratamento das mensagens WM_KEYDOWN e
WM_KEYUP.
A função verifica depois se deve deixar passar a mensagem para o processador de texto ou não. Há
situações nas quais a mensagem não deve prosseguir, nomeadamente quando a tecla desempenha uma
função especial no SACAA. A tecla pode ser uma das dez teclas para a selecção das palavras preditas,
a tecla para a expansão de abreviaturas ou a tecla para a síntese da frase que acabou de ser escrita. Ao
ser pressionada uma destas teclas o SACAA deve efectuar o seu processamento e impedir que esta
chegue ao processador de texto. Assim evita-se que a tecla possua duas funções, uma atribuída pelo
SACAA e outra pelo processador de texto. Não faria sentido o utilizador pressionar a tecla F1 para
completar uma palavra predita e simultaneamente aparecer a ajuda do processador de texto. Quando
uma tecla é seleccionada pelo utilizador para uma determinada função no SACAA a sua função no
processador
de
texto
é
temporariamente
desactivada.
O
dll
possui
uma
tabela
(m_codigosVirtuaisTeclas) com os códigos virtuais das teclas que não devem ser enviadas à aplicação
monitorizada. O dll desenvolvido também disponibiliza funções que permitem introduzir e retirar teclas nesta tabela. Assim o SACAA pode atribuir de uma forma dinâmica funções às teclas.
Na continuação do tratamento da mensagem WM_KEYDOWN, a função TratarHookTeclado verifica
se
o
código
virtual
da
tecla
associada
à
mensagem que
chegou existe
na
tabela
m_codigosVirtuaisTeclas. Se existir, a tecla desempenha uma função no SACAA e por isso a mensagem não deve prosseguir para o processador de texto. Para conseguir este efeito a função deve devolver o valor 1. Caso contrário é chamada a função CallNextHookEx para que a mensagem possa ser
processada por um outro hook também instalado sobre a mesma aplicação. Eventualmente a mensagem passará por uma cadeia de hooks e finalmente chegará à aplicação destino.
81
CMicrosoftWord::TratarTeclaPressionada(WPARAM wParam, LPARAM lParam){
m_pCWndReceptor -> PostMessage( WM_TECLA_PRESSIONADA, wParam, lParam);
}
Quadro 4-11 - Tratamento da mensagem WM_TECLA_PRESSIONADA no interior da classe CMicrosoftWord.
O tratamento de uma mensagem WM_KEYUP é semelhante, apenas não é enviada a mensagem
WM_TECLA_PRESSIONADA. O pressionar de uma tecla provoca o aparecimento do par de mensagens, WM_KEYDOWN e WM_KEYUP, pelo que a mensagem associada a este evento é apenas enviada
durante o tratamento da mensagem WM_KEYDOWN.
A mensagem WM_TECLA_PRESSIONADA e os dois parâmetros com informação associada são recebidos pelo objecto CMicrosoftWord. Este objecto deve processar a mensagem e em seguida enviá-la
para o objecto que se registou como receptor das mensagens que assinalam os vários eventos. O
Quadro 4-11 apresenta a função do objecto CMicrosoftWord que efectua o tratamento desta mensagem.Esta função reenvia simplesmente a mensagem ao Controlador do Sistema. A Figura 4-8 ilustra
esta operação. Na inicialização do sistema este objecto é responsável pela criação do objecto CMicrosoftWord e regista-se também como receptor dos eventos ocorridos no processador de texto. A variável membro m_pCWndReceptor armazena o CWnd da janela associada ao Controlador do Sistema.
4.3.2 Interacção com um Processador de Texto Genérico
Para permitirmos a interacção do nosso sistema com outro processador de texto que não o Ms Word,
derivámos a classe CProcessadorTextoGenerico a partir da classe abstracta CProcessadorTexto. Para
a implementação desta classe utilizámos unicamente mecanismos disponíveis para qualquer aplicação
do Windows, nomeadamente os hooks e o MSAA. Os hooks foram a base para o desenvolvimento
desta classe. Para a utilização deste mecanismo recorremos ao dll que apresentámos anteriormente.
O tratamento dos eventos efectuado por esta classe é exactamente igual ao apresentado atrás para a
classe CMicrosoftWord. A diferença entre as duas classes derivadas reside na forma como é efectuado
o acesso ao texto escrito no processador de texto. Como assumimos que uma aplicação genérica não
disponibiliza uma Interface de Programação para o acesso a estes dados, a classe CProcessadorTextoGenerico tenta manter internamente uma cópia dos dados aos quais desejaríamos aceder directamen-
Figura 4-8 - Objecto CMicrosoftWord a enviar a mensagem WM_TECLA_PRESSIONADA
ao objecto Controlador do Sistema.
82
CProcessadorTextoGenerico::TratarCaracter(UINT nChar, UINT nRepCnt, UINT nFlags){
//Acrescenta um caracter ao texto e incrementa o indice do caret
if( nChar != VK_BACK ){
m_texto += CString( nChar );
m_indiceTexto ++;
}
if( ( ! strchr( SEPARADORES_PALAVRAS, m_caracterAnterior ) )
&& ( m_caracterAnterior != VK_BACK )
&& strchr( SEPARADOR_PALAVRAS, nChar ) ){
m_pCWndReceptor -> PostMessage( WM_NOVA_PALAVRA, 0, 0);
}
m_caracterAnterior = nChar;
}
Quadro 4-12 - Tratamento da mensagem WM_CHAR no interior do objecto CProcessadorTextoGenerico.
te. No nosso caso o texto que o utilizador se encontra a escrever. A manutenção desta cópia é efectuada através da inspecção das mensagens que chegam ao processador de texto. As mensagens necessárias a esta operação são assinaladas pelo dll ao objecto CProcessadorTextoGenerico.
4.3.2.1 Acesso ao Texto Escrito pelo Utilizador
Inicialmente utilizámos a mensagem WM_TECLA_PRESSIONADA e a informação associada para a
manutenção
de
uma
cópia
do
texto
escrito
pelo
utilizador.
Por
cada
mensagem
WM_TECLA_PRESSIONADA recebida, o caracter correspondente era acrescentado a uma string contida numa variável interna. Isto no caso de ter sido pressionada uma tecla associada a um caracter.
Caso fosse pressionada uma tecla com uma função especial na edição de texto, então o efeito provocado era reproduzido também na cópia do texto. Por exemplo, no caso de ser pressionada a tecla BackSpace então o último caracter da string interna era removido. Algumas desta teclas com funções especiais no processamento de texto permitem transportar o cursor de escrita para pontos do texto impossíveis de determinar através deste método. Nestas situações a string interna é anulada e iniciada a sua
construção a partir daquele novo ponto do texto.
Verificámos no entanto que a mensagem WM_TECLA_PRESSIONADA não era muito apropriada para
determinação dos caracteres escritos pelo utilizador. Recordemos que esta mensagem foi criada para
notificar simplesmente que uma tecla foi pressionada. Esta mensagem disponibiliza apenas o código
virtual da tecla. E não basta a consulta deste código para a determinação do caracter gerado na aplicação externa. É necessário verificar se a tecla shift está a ser pressionada ou não, pois num caso será
gerado o caracter maiúsculo, no outro o minúsculo. Também é necessário determinar se antes foi pressionada uma tecla de acentuação ou não. Num caso será gerado o caracter acentuado no outro o caracter simples. Outras situações também poderão ter de ser verificadas.
83
Para uma mais fácil identificação do caracter recebido por uma aplicação é preferível a intercepção da
mensagem WM_CHAR em vez do recurso às mensagens WM_KEYDOWN ou WM_KEYUP. As mensagens WM_CHAR são enviadas pelo sistema operativo a uma aplicação sempre que uma tecla pressionada produz um caracter. O próprio sistema operativo verifica o estado do teclado e produz o caracter apropriado, seja minúsculo, maiúsculo, não acentuado, acentuado, ou outro. Este caracter é enviado
à aplicação juntamente com a mensagem WM_CHAR. Esta mensagem é enviada a uma aplicação
sempre depois do par de mensagens WM_KEYDOWN e WM_KEYUP. No caso de uma aplicação apenas necessitar de processar os caracteres introduzidos pelo utilizador então pode desprezar estas duas
últimas mensagens e recorrer apenas à mensagem WM_CHAR.
Para a intercepção destas mensagens foi necessário a instalação de um novo hook no processador de
texto. Os hooks do tipo WH_GETMESSAGE permitem a intercepção de qualquer mensagem enviada a
uma aplicação, e num caso particular a mensagem WM_CHAR. Tal como nas outras mensagens monitorizadas, a rotina de tratamento deste hook ao detectar a chegada de uma mensagem WM_CHAR
reenvia a mensagem e a informação associada ao componente do SACAA que instalou o hook, neste
caso o objecto CProcessadorTextoGenerico.
Ao receber esta mensagem o objecto CProcessadorTextoGenerico pode agora efectuar de uma forma
mais simples a manutenção da cópia do texto escrito. O Quadro 4-12 mostra como o objecto CProcessadorTextoGenerico efectua o tratamento desta mensagem. Quando não se trata do caracter Backspace
a função acumula o caracter na string interna. De seguida verifica se foi escrita uma nova palavra ou
não. Para tal inspecciona o caracter recebido. Quando este é um separador de palavras, e o caracter
anterior não, então estamos perante uma nova palavra. Nesta situação a mensagem
WM_NOVA_PALAVRA é enviada ao Controlador do Sistema. Através desta informação poderá ser
efectuada uma actualização da informação estatística associada ao utilizador. A mensagem
WM_TECLA_PRESSIONADA também continuou a ser utilizada na manutenção do texto escrito pelo
utilizador. Ao ser recebida a indicação que foi pressionada uma tecla que alterou o cursor de escrita
para um ponto do texto indeterminado então a string interna é anulada. Esta operação também é efectuada quando o dll envia uma mensagem indicando que um dos botões do rato foi pressionado. Estas
operações também provocam a deslocação do cursor de escrita para um ponto desconhecido do texto e
por isso a string interna também deve ser anulada. Esta mensagem também continuou a ser utilizada
para a detectar a utilização da tecla Backspace e Delete. Em ambas as situações a cópia do texto é
devidamente actualizada.
A implementação das funções para a obtenção de um prefixo, ObterPrefixo() e para a obtenção da
palavra anterior, ObterPalavraAnterior() são semelhantes às apresentadas anteriormente para a classe
CMicrosoftWord, com a diferença de que o texto do utilizador se encontra agora numa variável membro, denominada m_texto.
84
void CProcessorTextoGenerico::EscreverCaracter( char c ){
char primeiroCaracter, segundoCaracter;
if( CaracterAcentuado( c, primeiroCaracter, segundoCaracter ) ){
EscreverCaracterAcentuado( primeiroCaracter, segundoCaracter );
}
else
EscreverCaracterSimples ( c );
}
Quadro 4-13 - Função que permite a escrita de um caracter em qualquer aplicação externa.
4.3.2.2 Escrita no Editor de Texto
A implementação da função EscreverTexto(CString texto) é no entanto totalmente diferente da sua
congénere. Uma forma de escrever um texto numa aplicação, utilizando a IU, consiste em enviar à
aplicação a sequência de teclas que o utilizador teria de pressionar para a escrita daquele texto. Utilizámos esta abordagem para a implementação da função EscreverTexto(CString texto). A função ao
receber um texto como parâmetro envia para a aplicação a sequência de mensagens correctas de modo
àquela receber cada um dos caracteres do texto. Para que o processo seja completamente transparente
para a aplicação devem ser enviadas as mensagens WM_KEYDOWN e WM_KEYUP. Assim a aplicação não consegue determinar se os caracteres estão a ser introduzido pelo teclado ou através de outra
aplicação. O sistema operativo após a chegada deste par de mensagens enviará à aplicação a mensagem WM_CHAR adequada tendo em conta o estado do teclado e outras tecla pressionadas anteriormente, como as teclas de acentuação. Para simplificarmos o processo experimentámos enviar às aplicações unicamente a mensagem WM_CHAR mas em vários casos não obtivemos os resultados esperados. A omissão das mensagens WM_KEYDOWN e WM_KEYUP da sequência de mensagens normalmente esperada pela aplicação e pelo próprio sistema operativo impedia uma recepção correcta dos
caracteres.
Para a escrita de cada um dos caracteres de um texto fornecido, o objecto CProcessadorTextoGenerico
utiliza a função EscreverCaracter( char c ), apresentada no Quadro 4-13.
Primeiro esta função verifica se o caracter que deve ser escrito é acentuado o não. Para tal chama a
função int CaracterAcentuado(char c, char primeiroCaracter, char segundoCaracter). Esta função
indica se o caracter é acentuado ou não, e no caso afirmativo fornece os dois caracteres que devem ser
enviados à aplicação de modo a ser gerado o caracter acentuado. Dependendo da situação assim é
chamada a função EscreverCaracterAcentuado ou a função EscreverCaracterSimples. A função que
permite a escrita de um caracter acentuado void EscreverCaracterAcentuado(char primeiroCaracter,
char segundoCaracter ) recorre por sua vez à função void EscreverCaracterSimples(char c) para o
envio de cada um dos dois caracteres à aplicação.
85
void CProcessadorTextoGenerico::EscreverCaracterSimples( char c ){
SHORT infoTecla;
if( ( infoTecla = VkKeyScan( c ) ) != -1 ){
BYTE codigoVirtualTecla = LOBYTE( infoTecla );
BYTE infoShift = HIBYTE( infoTecla );
if( infoShift & 0x1 ){
keybd_event( VK_SHIFT, MapVirtualKey( VK_SHIFT, 0), 0, 0 );
keybd_event(codigoVirtualTecla, MapVirtualKey( codigoVirtualTecla, 0), 0, 0 );
keybd_event(codigoVirtualTecla, MapVirtualKey(codigoVirtualTecla, 0), KEYEVENTF_KEYUP, 0 );
keybd_event( VK_SHIFT, MapVirtualKey( VK_SHIFT, 0), KEYEVENTF_KEYUP, 0 );
}
else{
keybd_event(codigoVirtualTecla, MapVirtualKey(codigoVirtualTecla, 0), 0, 0 );
keybd_event(codigoVirtualTecla, MapVirtualKey(codigoVirtualTecla, 0), KEYEVENTF_KEYUP, 0 );
}
}
}
Quadro 4-14 - Função que permite a escrita de um caracter simples numa aplicação externa.
A função EscreverCaracterSimples é apresentada no Quadro 4-14. No inicio é chamada a função int
VkKeyScan(char). Esta função recebe um caracter como parâmetro e devolve o código virtual da tecla
que deve ser pressionada assim como o estado da tecla shift para que o caracter seja produzido. Esta
informação é fornecida respectivamente no byte mais baixo e byte mais alto do valor devolvido. Caso
seja necessário pressionar a tecla shift para a produção do caracter então devem ser enviadas à aplicação as mensagens como se tal acontecesse realmente. Primeiro deve ser enviada uma mensagem
WM_KEYDOWN com o código virtual da tecla shift para a indicação de que esta tecla se encontra em
baixo, depois deve ser enviado um par de mensagens WM_KEYDOWN e WM_KEYUP com o código
virtual da tecla associada ao caracter, simulando assim o pressionar desta tecla, e finalmente deve ser
enviada uma mensagem WM_KEYUP para a indicação de que a tecla shift foi solta. Quando não é
necessário carregar na tecla shit para a produção do caracter basta enviar o par de mensagens
WM_KEYDOWN e WM_KEYUP, com o código virtual da tecla do caracter.
As mensagens não são enviadas directamente à aplicação, mas sim através da função keybd_event. O
driver do teclado do sistema operativo também utiliza esta função para a geração das mensagens
WM_KEYDOWN e WM_KEYUP pelo que desta forma asseguramos uma total transparência do processo. A esta função deve ser fornecido no primeiro parâmetro o código virtual da tecla, no segundo, o
código hardware da tecla, que é obtido através da função MapVirtualKey, e no terceiro a indicação do
tipo de mensagem que queremos gerar, WM_KEYDOWN ou WM_KEYUP, o quarto parâmetro é opcional.
86
Referimos atrás que no futuro iremos utilizar o mecanismo MSAA para a implementação de uma nova
classe derivada a partir da classe abstracta CProcessadorTexto. Esta nova classe irá recorrer essencialmente ao MSAA para a interacção com aplicações que disponham deste mecanismo. Utilizámos
também este mecanismo para a implementação de uma funcionalidade na classe CProcessadorTextoGenerico, a indicação da posição do cursor de texto na aplicação externa. No Windows o cursor de
texto não é um objecto gerido pelo sistema operativo. Por este motivo não existem chamadas ao sistema que permitam obter informação sobre este objecto. Cada aplicação possui o seu próprio cursor de
texto que é um objecto privado como qualquer outro objecto da aplicação. Por consequência só é possível determinar a localização deste objecto no ecrã caso a aplicação forneça esta informação. As aplicações que recorrem ao Controlo de Edição ou a componentes de edição de texto disponibilizados pelo
sistema operativo expõem automaticamente um conjunto de informação e alguns eventos através do
MSAA, entre os quais a indicação da alteração da localização do cursor de texto. A classe CProcessadorTextoGenerico utiliza este evento para conhecer em cada momento a localização do cursor de
texto. Para tal implementa internamente um cliente MSAA que regista no servidor MSAA da aplicação activa o interesse em receber o evento referido. Neste registo fornece também a função que deve
ser chamada na ocorrência do evento. Esta função limita-se a aceder ao objecto acessível que provocou o evento, ou seja o objecto acessível associado ao cursor de texto, de modo a obter a nova localização do cursor de texto que depois armazena numa variável membro. Quando solicitado por outros
componentes do SACAA o objecto CProcessadorTextoGenerico pode então disponibilizar esta informação. A localização do cursor de texto na aplicação activa é necessária para a implementação de três
funcionalidades importantes do nosso sistema: (1) a colocação automática da lista das palavras preditas junto ao cursor de texto; (2) o afastamento automático do teclado de ecrã do ponto de escrita; (3) a
colocação de uma previsão do que irá ser escrito junto ao cursor de texto. A primeira e terceira funcionalidade encontram-se ilustradas na Figura 4-9 e Figura 4-10 respectivamente. Tanto quanto sabemos
Figura 4-9 - Funcionalidade que permite a colocação automática da lista
das palavras preditas junto ao cursor de texto.
87
Figura 4-10 - Funcionalidade que permite a colocação de uma previsão do
que irá ser escrito junto ao cursor de texto.
o componente do Ms Word responsável pela edição do texto não disponibiliza para o exterior a informação sobre a localização do cursor de texto através do MSAA. O WOM também não fornece este
tipo de informação. Por isso de momento não é possível utilizar as funcionalidades referidas com o Ms
Word.
88
5. Interacção com o Utilizador
A interacção de uma pessoa com um SACCA é efectuada através de um componente denominado
Interface do Utilizador (IU). Este componente deve permitir ao utilizador a selecção dos vários símbolos disponíveis para a construção de mensagens. Também deve fornecer ao utilizador o feedback necessário ao processo de composição de mensagens. Na Figura 5-1 podemos observar um utilizador a
interagir com um SACAA.
Para além das dificuldades de comunicação, os utilizadores destes sistemas também podem sofrer de
outras dificuldades, nomeadamente ao nível sensorial, visual, motor ou cognitivo. Por este motivo
deve ser possível adaptar a IU destes sistemas às capacidades de interacção de cada pessoa. Para o
reforço da interacção com o sistema é por vezes importante a utilização simultânea de modalidades
diferentes de interacção. Por exemplo, para auxiliar a inspecção da lista de palavras preditas, um sistema pode destacar visualmente a palavra apontada pelo ponteiro do rato, simultaneamente também
pode efectuar a sua síntese para fala. A incorporação de características multimodais nestas interfaces é
por isso extremamente importante.
Cook e Hussey (1995: 482) apontam como principais componentes da IU de um SACCA os seguintes
elementos: Conjunto de Selecção, Método de Selecção e Dispositivo de Controlo.
O Conjunto de Selecção é formado pelos vários símbolos que a pessoa dispõe para a construção de
mensagens. Podem ser simples desenhos, símbolos de um Sistema de Símbolos Gráficos ou letras do
alfabeto.
Figura 5-1 - Utilizador a interagir com um SACAA.
89
Para a composição de uma mensagem o utilizador deve seleccionar sucessivamente símbolos do Conjunto de Selecção. Como referimos anteriormente existem essencialmente quatro Métodos de Selecção
distintos: (1) Selecção Directa; (2) Selecção Indirecta; (3) Varrimento Directo; (4) Selecção por Código.
O método de Selecção Directa é o habitualmente utilizado pelas pessoas no dia-a-dia, e de uma forma
particular pelos utilizadores de computadores, quer pressionando directamente uma tecla ou seleccionando determinada opção de um menu através do movimento do rato e respectivo clique.
Quando por dificuldades motoras a pessoa não consegue apontar para um símbolo, utilizar o teclado,
ou deslocar o rato no ecrã por forma a seleccionar uma das opções disponíveis então deve ser utilizado
um método de Selecção Indirecta. O método de Selecção Indirecta mais utilizado é a Selecção por
Varrimento. Este método apresenta ainda algumas variantes sendo as principais: (1) Varrimento Regular; (2) Varrimento Inverso; (3) Varrimento Passo-a-Passo. Na primeira forma de varrimento as várias
opções disponíveis são percorridas, uma a uma, de forma automática pelo sistema. No momento que a
opção pretendida é percorrida o utilizador deve pressionar um interruptor de modo a efectuar a sua
selecção. No Varrimento Inverso as várias opções são percorridas enquanto o interruptor estiver pressionado. Ao ser solto é seleccionada a opção percorrida naquele momento. No Varrimento Passo-aPasso as várias opções não são percorridas de forma automática pelo sistema. A pessoa utiliza dois
interruptores, um destes é utilizado para o varrimento manual dos vários elementos disponíveis. Ao
chegar ao elemento pretendido a pessoa pressiona o outro interruptor para efectuar a selecção. A grande desvantagem do método de Selecção por Varrimento consiste na lentidão com que cada opção é
seleccionada. A grande vantagem consiste em requerer apenas um ou dois movimentos funcionais por
parte da pessoa.
Através do método de selecção por Varrimento Directo a pessoa pode seleccionar a direcção do varrimento ao invés deste ser efectuado de uma forma automática por parte do sistema. Este método de
selecção é mais rápido que o anterior mas também mais exigente em termos de funcionalidade motora
pois a pessoa terá de possuir pelos menos quatro movimentos funcionais, um para cada direcção, e um
quinto para efectuar a selecção.
O último método de acesso referido consiste na selecção de uma determinada opção através da introdução de um código. Um código que pode ser utilizado é o referido código Morse. Através deste código, e utilizando apenas um interruptor, é possível a introdução das várias letras do alfabeto. Este método tem a desvantagem de ser bastante exigente a nível cognitivo, nomeadamente no que respeita à
memória.
O Dispositivo de Controlo também é um componente importante da IU de um SACAA. Este dispositivo deve ser escolhido de acordo com o Método de Selecção utilizado e com as capacidades do utilizador. Para uma selecção directa pode ser utilizado um teclado ou um dispositivo de ponteiro. Existem
90
vários tipos de teclados. Uns com teclas largas, denominados de Teclados Alargados, destinados a
pessoas com pouca precisão de movimentos. Existem também teclados com teclas muito pequenas, os
Mini-Teclados, destinados a pessoas com pouca amplitude de movimentos. Também existem bastantes
dispositivos de ponteiro alternativos ao rato tradicional. Entre os mais utilizados neste tipo de sistemas
encontram-se as track-balls, os touch-pads, os joysticks e os ecrãs tácteis. Para a selecção por varrimento os Dispositivos de Controlo utilizados são os interruptores. Existem também vários tipos de
interruptores, cada qual accionado através de uma manipulação específica.
5.1 A Interface do Utilizador
O nosso sistema destina-se a apoiar a escrita e a conversação para o Português Europeu. Por isso no
Conjunto de Selecção do sistema foram incluídos todos os caracteres necessários à escrita de mensagens nesta língua. Também pertencem a este conjunto elementos que disponibilizam determinadas
operações importantes para a edição de texto, como o apagar de um caracter (BackSpace), a introdução de uma nova linha de texto (Enter), e outras. Pertencem ainda ao Conjunto de Selecção elementos
destinados ao apoio da escrita, como por exemplo, elementos que permitem sintetizar em fala, a palavra ou frase escritas, que expandem uma abreviatura, ou completam automaticamente uma palavra
com o recurso a uma palavra predita.
O nosso sistema disponibiliza métodos de selecção directa e indirecta para o acesso a estes elementos.
Com cada um destes métodos devem ser utilizados dispositivos de controlo adequados. O nosso sistema permite a utilização dos seguintes métodos de selecção: (1) Selecção Directa com Teclado de
Figura 5-2 - Caixa de diálogo para a configuração das opções principais do sistema.
91
Teclas de Palavras Preditas
Teclas para Expansão de Abreviatura
Teclas para Ouvir a Palavra Escrita
Teclas para Ouvir a Frase Escrita
(F1-F10) ou (0-9) ou (0-9) do Teclado Numérico
Ins ou Tab
F11 ou Alt ou ,
F12 ou Ctrl ou *
Quadro 5-1 - Teclas para o acesso aos elementos do Conjunto de Selecçao que permitem apoiar
a escrita.
Computador; (2) Selecção Directa com Teclado de Ecrã e Dispositivo de Ponteiro; (3) Selecção Indirecta com Teclado de Ecrã e Varrimento.
O primeiro destes métodos é fornecido por defeito em qualquer computador. Cada elemento do Conjunto de Selecção encontra-se associado a uma tecla do computador. O acesso a estes elementos é
efectuado através da pressão da respectiva tecla. Os vários caracteres para a escrita em português e as
várias operações necessárias à edição de texto, como o apagar ou o introduzir uma nova linha, já possuem teclas associadas num teclado de computador tradicional. Para o acesso aos restantes elementos
do Conjunto de Selecção, como sejam as palavras preditas, foi necessário redefinir determinadas teclas
do teclado. Os teclados de computador disponibilizam teclas para a atribuição de novas funções, como
por exemplo as teclas de função. As teclas de função F1 até F10 são utilizadas pelo nosso sistema como um dos possíveis conjuntos de teclas para a selecção de cada uma das palavras preditas, cuja quantidade pode atingir o valor máximo de 10. Para a selecção destas palavras o nosso sistema permite
ainda a utilização de outros dois conjuntos de teclas, as teclas numéricas de 0 a 9, localizadas na parte
principal do teclado, e as teclas numéricas, também de 0 a 9, pertencentes ao teclado numérico. No
Quadro 5-1 apresentamos as teclas que possibilitam o acesso aos elementos do Conjunto de Selecção
para o apoio à escrita. A selecção das teclas associadas a cada uma das funções pode ser efectuada
através da caixa de diálogo apresentada na Figura 5-2.
O processo através do qual o nosso sistema atribui novas funções a determinadas teclas do teclado
encontra-se discutido no capítulo sobre a interacção do sistema com as aplicações externas. O nosso
sistema ao verificar que uma destas teclas foi pressionada na aplicação externa inibe a sua função original e executa a função atribuída pelo sistema. Uma tecla não pode acumular duas funções diferentes,
por isso as funções originais destas teclas ficam temporariamente desactivadas. Assim para estas novas
funções foram utilizadas teclas cujas funções originais podiam ser dispensadas no processo de escrita.
Na selecção destas teclas também tivemos em consideração teclados bastante utilizados pelos utilizadores destes sistemas, como por exemplo os teclados de portáteis e o teclado alargado Intellikeys. Este
último teclado, apresentado na Figura 5-3, é bastante utilizado por crianças em fase de aprendizagem
da leitura e escrita.
92
Figura 5-3 - O teclado Intellikeys
Os outros dois métodos de selecção disponibilizados pelo nosso sistema destinam-se a pessoas com
dificuldades na manipulação de um teclado de computador. Para o acesso aos vários elementos do
Conjunto de Selecção ambos os métodos utilizam um teclado de ecrã. Este componente consiste numa
matriz com os vários elementos do Conjunto de Selecção. O primeiro destes dois métodos (Selecção
Directa com Dispositivo de Ponteiro) possibilita a selecção dos elementos do teclado de ecrã com o
recurso a um dispositivo de ponteiro, como por exemplo o rato. O segundo método de selecção (Selecção Indirecta por Varrimento) destina-se a pessoas com grandes dificuldades motoras, impedidas de
utilizar quer um teclado, quer um rato. Por isso, este método percorre automaticamente os vários elementos do teclado de ecrã aguardando a pressão de um interruptor por parte do utilizador como sinal
para a selecção do elemento percorrido num dado instante.
Independentemente do teclado utilizado, o nosso sistema recorre a um sintetizador de fala e a um
agente de interface para o apoio à escrita. Desta forma pretendemos aumentar a capacidade de interacção do nosso sistema. A seguir iremos referir-nos ao desenvolvimento do teclado de ecrã e à incorporação de um sintetizador de fala e de um agente de interface na IU do nosso sistema.
5.2 Implementação do Teclado de Ecrã
O teclado de ecrã desenvolvido reproduz no ecrã um teclado de computador simplificado. O teclado de
ecrã incorpora as teclas associadas aos vários elementos do Conjunto de Selecção, ou seja, as teclas
com os vários caracteres necessários à escrita de textos em português, as teclas com as operações necessárias à edição de texto, como o apagar um caracter ou introduzir uma nova linha de texto, e as
teclas associadas às funções introduzidas no nosso sistema para o apoio à escrita, como as teclas utilizadas para a expansão de abreviaturas ou síntese de uma palavra ou frase.
93
Figura 5-4 - Estrutura do Teclado de Ecrã.
5.2.1 Estrutura do Teclado de Ecrã
Um teclado de ecrã é constituído por várias linhas, e por sua vez cada linha constituída por várias teclas. Para a implementação do mecanismo de varrimento acrescentámos ainda outro elemento a esta
estrutura, o grupo de teclas. O teclado de ecrã do nosso sistema é assim constituído por várias linhas,
cada linha constituída por vários grupos de teclas e finalmente cada um destes grupos de tecla composto por várias teclas. Este conjunto de elementos formam uma estrutura de dados, organizada de forma
hierárquica, e que permite o armazenamento dos vários elementos do Conjunto de Selecção. A Figura
5-4 ilustra esta estrutura.
Adoptámos esta estrutura para facilitar a implementação do mecanismo de varrimento no teclado de
ecrã. Quando o Conjunto de Selecção é formado por poucos elementos, por exemplo 10, este mecanismo pode percorrer os vários elementos do conjunto, um a um, pois rapidamente chegará ao elemento pretendido e nesse momento o utilizador poderá pressionar um interruptor para efectuar a sua selecção. Quando o Conjunto de Selecção possui um número de elementos elevado, como acontece com
um teclado de ecrã, não é conveniente o varrimento linear sobre cada um dos elementos pois tal tornaria o processo de selecção extremamente lento. Uma solução para este problema consiste em efectuar
grupos com vários elementos do Conjunto de Selecção. Estes grupos podem também encontrar-se
94
divididos em subgrupos. Nos teclados de ecrã é comum a distribuição dos vários elementos em linhas
e depois cada uma destas em grupos de teclas. Estes grupos conterão por fim uma quantidade de teclas
reduzida. Esta estrutura evita a necessidade de um varrimento linear sobre todas as teclas. Para tal o
mecanismo de varrimento é efectuado em três fases. Numa primeira fase é efectuado um primeiro
varrimento sobre as várias linhas do teclado. Depois de escolhida a linha desejada o sistema efectua
um segundo varrimento, agora sobre os vários grupos desta linha. Após a selecção do grupo desejado é
efectuado um último varrimento sobre as várias teclas do grupo. Neste último varrimento o utilizador
pode seleccionar a tecla pretendida.
Para a implementação do teclado de ecrã do nosso sistema desenvolvemos a classe CTecladoEcra. A
estrutura do teclado do ecrã é implementada com o recurso a três classes: CLinha, CGrupo e CTecla.
O Quadro 5-2 apresenta definições parciais das classes CTecladoEcra e CTecla.
Tal como sucede com outras classes apresentadas em capítulos anteriores as classes CTecladoEcra,
CLinha e CGrupo são derivadas a partir da classe CWnd, a classe da MFC com as funcionalidades
básicas para a manipulação de janelas no sistema operativo Windows. A classe CTecla é derivada a
partir da classe CButton, classe esta por sua vez derivada da classe CWnd. A classe CButton pertence à
MFC e incorpora um conjunto de funcionalidades para a manipulação de botões. Estas classes, derivadas directa ou indirectamente da classe CWnd herdam um conjunto de capacidades importantes para o
seu funcionamento, como por exemplo a capacidade de conterem outros objectos do tipo CWnd (ou de
classes derivadas), e a capacidade de enviarem e receberem mensagens de objectos do tipo CWnd (ou
de classes derivadas). Através destas mensagens os objectos podem assinalar determinados acontecimentos a outros objectos. Por exemplo um objecto CTecla ao detectar um clique sobre a sua área pode
assinalar a ocorrência deste evento a outro objecto através do envio de uma mensagem.
class CTecladoEcra : public CWnd{
public:
void Inicializar( CWnd *pCWndReceptor, CString nomeFicheiro, int tamanhoLetra, CString tipoLetra, int corFundo, int corTexto, int corFundoDestacar, int
corTextoDestacar, CString metodoVarrimento, int velocidadeVarrimento, int latenciaInterruptoresVarrimento, int ciclosVarrimento);
...
private:
CWnd *m_pCWndReceptor;
CArray<CLinha*, CLinha*> m_linhas;
int m_nLinhas;
...
};
class CTecla : public CButton{
public:
...
private:
CWnd *m_pCWndPai;
...
};
Quadro 5-2 - Definições parciais das classes CTecladoEcra e CTecla.
95
LINHA <descrição linha>
GRUPO <descrição grupo>
TECLA <tipo tecla> [<texto tecla> <descrição tecla> <designação tecla>]
Quadro 5-3 - As definições possíveis para a criação de elementos num teclado de ecrã..
Um objecto do tipo CTecladoEcra possui vários objectos do tipo CLinha. Cada um destes é composto
por vários objectos do tipo CGrupo. Finalmente cada objecto CGrupo possui um conjunto de objectos
CTecla. Cada uma destas teclas encontra-se associada a um dos elementos do Conjunto de Selecção.
Cada objecto CTecladoEcra, CLinha e CGrupo possui um vector com apontadores para os seus objectos constituintes. Na definição parcial da classe CTecladoEcra podemos verificar que estes apontadores são armazenados na variável membro m_linhas. A utilização de apontadores para os objectos
constituintes permite a criação e destruição dinâmica destes. Com estas referências um objecto pode
efectuar determinadas operações sobre os seus objectos constituintes. Por exemplo, durante o mecanismo do varrimento o objecto CTecladoEcra solicitará sucessivamente aos vários objectos CLinha
que estas se apresentem visualmente destacadas. Cada objecto também possui um apontador para o
objecto ao qual pertence. Podemos verificar na definição parcial da classe CTecla que esta referência é
armazenada na variável membro m_CwndPai. Esta referência é utilizada para a notificação de eventos
ao objecto no qual estão inseridos. Este objecto é muitas vezes referido como o objecto pai. Esta referência é por exemplo utilizada quando um objecto do tipo CTecla pretende assinalar a ocorrência de
um clique. O objecto CTecla assinalará este acontecimento ao objecto no qual está contido, um objecto do tipo CGrupo, este por sua vez informará o objecto CLinha que o contém. Finalmente o objecto
CLinha informará o objecto CTecladoEcra. Este último objecto informará o componente adequado do
SACAA sobre a ocorrência do evento. Neste caso também será fornecida a identificação da tecla sobre
a qual foi efectuado o clique.
...
LINHA
GRUPO
TECLA
TECLA
TECLA
TECLA
TECLA
LINHA
GRUPO
TECLA
TECLA
TECLA
TECLA
TECLA
TECLA
GRUPO
TECLA
TECLA
TECLA
TECLA
TECLA
TECLA
...
palavras;preditas
palavras;preditas
TECLA_VAZIA
TECLA_PREDICAO
TECLA_PREDICAO
TECLA_PREDICAO
TECLA_PREDICAO
espaço;e;números
espaço;e;números
TECLA_VAZIA
TECLA_NORMAL space.bmp espaço Space
TECLA_NORMAL 1 um 1
TECLA_NORMAL 2 dois 2
TECLA_NORMAL 3 três 3
TECLA_NORMAL 4 quatro 4
números
TECLA_NORMAL 5 cinco 5
TECLA_NORMAL 6 seis 6
TECLA_NORMAL 7 sete 7
TECLA_NORMAL 8 oito 8
TECLA_NORMAL 9 nove 9
TECLA_NORMAL 0 zero 0
Quadro 5-4 - Parte de um ficheiro com a definição da estrutura de um teclado de ecrã.
96
Podemo observar no Quadro 5-2 uma das funções membro da classe CTecladoEcra, a função Inicializar. Esta função permite inicializar o teclado de ecrã. A função deve ser chamada com um conjunto de
parâmetros que permitem a criação da estrutura do teclado e em seguida possibilitam a adaptação das
características de interacção do teclado às necessidades do utilizador. O primeiro parâmetro fornecido
deve ser o identificador do objecto que irá receber as notificações dos eventos ocorridos no teclado de
ecrã. No segundo parâmetro é fornecido o nome do ficheiro de texto com a disposição pretendida para
o teclado, em termos linhas, grupos, e teclas constituintes. Desta forma podem ser criadas várias disposições de teclados, umas mais adaptadas a determinadas circunstâncias que outras. Nos parâmetros
seguintes devem ser indicadas determinadas propriedades que permitem adaptar o teclado às capacidades do utilizador, como sejam o tipo da letra, o tamanho da letra, a cor de fundo das teclas, a cor do
texto das teclas e outras.
5.2.2 Disposições de Teclado
Ao invés de criarmos uma disposição fixa para as linhas, grupos e teclas decidimos possibilitar a existência de várias disposições para o teclado de ecrã. A selecção da disposição pretendida assim como a
configuração de outras propriedades do teclado de ecrã pode ser efectuada através da caixa de diálogo
apresentada na Figura 5-2. Para além das disposições de teclado predefinidas, que acompanham a
instalação do sistema, também podem ser definidas novas disposições de teclado. A definição de uma
disposição de teclado é efectuada através de um ficheiro de texto. Este ficheiro deve possuir a extensão .tec. Cada linha deste ficheiro permite definir uma linha, grupo ou tecla do teclado de ecrã. No
Quadro 5-3 apresentamos as definições possíveis a utilizar para cada um dos elementos do teclado.
Os primeiros dois tipos de definição permitem introduzir respectivamente uma linha ou um grupo de
teclas no teclado de ecrã. Para cada um destes elementos deve ser atribuída uma descrição. Esta descrição é depois utilizada pelo sistema para o fornecimento de um feedback auditivo ao utilizador durante o mecanismo de varrimento. O terceiro tipo de definição permite a introdução de uma tecla no
teclado de ecrã. A cada tecla deve ser atribuído um tipo. Internamente este tipo permite agrupar de
uma forma lógica um conjunto de teclas. É depois possível solicitar ao objecto CTecladoEcra uma
lista com as teclas de determinado tipo, sobre as quais depois pode ser efectuado um processamento
conjunto. No nosso sistema utilizámos três tipos de teclas, que são, TECLA_PREDICAO,
TECLA_VAZIA e TECLA_NORMAL. As teclas do primeiro tipo são utilizadas pelo sistema para a
apresentação das palavras preditas em cada momento. O segundo tipo de teclas é utilizado para a introdução de teclas vazias no teclado. Este tipo de teclas permite minimizar os efeitos de um erro durante uma selecção por varrimento. Estes erros resultam normalmente de uma activação incorrecta do
interruptor que assim selecciona um elemento não desejado, seja uma linha, grupo ou mesmo uma
tecla. No final da selecção, devido ao erro cometido, o varrimento será efectuado sobe um grupo de
teclas não pretendido. Caso o grupo de teclas possua uma tecla do tipo TECLA_VAZIA, o utilizador
pode seleccionar esta tecla para abortar o varrimento em curso. Assim evita-se a selecção de uma tecla
97
AbcdefSimples
AbcdefDivisãoSimples
AbcdefAvançado
AbcdefDivisãoAvançado
QwertySimples
QwertyDivisãoSimples
QwertyAvançado
QwertyDivisãoAvançado
EaoisrVarrimentoSimples
EaoisrVarrimentoDivisãoSimples
EaoisrVarrimentoAvançado
EaoisrVarrimentoDivisãoAvançado
EaoisrCentroSimples
EaoisrCentroAvançado
Coluna
Linha
Quadro 5-5 - As diferentes disposições para o teclado de ecrã que acompanham a instalação do sistema.
cujo resultado teria de ser anulado numa próxima acção. O tipo TECLA_NORMAL permite a introdução de teclas que representam no teclado de ecrã as teclas de um computador. Para estas teclas devem
ser fornecidos em adição ao tipo, outros três campos, o texto da tecla, a descrição da tecla e o nome
da tecla. O primeiro campo contém o texto que será apresentado pela tecla no ecrã. No caso deste
campo conter um nome de um ficheiro bmp, então a tecla apresentará no ecrã a imagem contida nesse
ficheiro. A descrição tecla é utilizada com os mesmos propósitos referidos para as linhas e grupos, o
fornecimento de um feedback auditivo ao utilizador durante o varrimento. A designação tecla permite
atribuir uma designação à tecla, que à semelhança do tipo da tecla pode ser utilizada no exterior do
objecto CTecladoEcra com um determinado propósito. O Quadro 5-4 apresenta parte de um ficheiro
de texto com a definição de uma disposição de teclado. Neste ficheiro encontram-se definidas duas
linhas para uma disposição de teclado. A primeira linha contém apenas um grupo com cinco teclas.
Destas teclas a primeira é uma tecla vazia e as quatro seguintes destinam-se à apresentação de palavras
preditas. A linha que se segue possui dois grupos de teclas, cada um destes com seis teclas. O primeiro
grupo possui uma tecla vazia e uma outra associada ao espaço. As restantes teclas do primeiro grupo e
todas as teclas do segundo grupo encontram-se associadas aos vários algarismos.
Desenvolvemos várias disposições de teclas para o nosso teclado de ecrã. Estas disposições, que listamos no Quadro 5-5, encontram-se incorporadas na instalação do nosso sistema. As disposições de
teclado com denominação iniciada por Abcdef apresentam as teclas por ordem alfabética. Estas disposições são importantes para crianças em fase de aprendizagem da leitura e escrita. Tendo como base
esta ordenação de teclas desenvolvemos algumas variantes. A disposição AbcdefSimples possui um
conjunto de teclas mínimo para a escrita na Língua Portuguesa. A disposição AbcdefAvançado possui
mais algumas teclas para o apoio à edição de texto. Estas duas disposições apenas possuem um grupo
de teclas em cada linha, e por isso destinam-se essencialmente à escrita com o recurso a um dispositivo de ponteiro. Para a escrita com o recurso ao mecanismo de varrimento foram desenvolvidas disposições em tudo idênticas às anteriores com a excepção de que cada linha possui dois grupos de teclas.
Estas disposições denominam-se respectivamente AbcdefDivisãoSimples e AbcdefDivisãoAvançado.
Para a ordenação de teclas Qwerty também foram desenvolvidas quatro disposições semelhantes às
anteriores.
98
(2)
(1)
Figura 5-5 - Matriz de Varrimento Linha-Coluna com a indicação
da quantidade de passos necessários à selecção de cada item. Em
(1) são percorridas as várias linhas; em (2) os elementos da linha
seleccionada.
Desenvolvemos também um conjunto de disposições que permitem acelerar a escrita de pessoas que
utilizam o mecanismo de varrimento. Estas disposições baseiam-se num estudo efectuado por Garcia
(1998) no qual é proposto uma disposição de teclas que permite acelerar a escrita de pessoas que utilizam o mecanismo de varrimento no formato linha-coluna. Segundo este estudo a disposição proposta
permite reduzir em 25% o número de passos do mecanismo de varrimento quando comparada com a
disposição qwerty. O varrimento no formato linha-coluna percorre numa primeira fase as várias linhas
de um teclado e numa segunda fase as várias teclas da linha escolhida. A disposição proposta tira partido do facto de existirem na Língua Portuguesa, como em qualquer outra língua, letras que são mais
utilizadas que outras na formação das várias palavras. Para tal foram obtidos valores aproximados para
a frequência das várias letras na Língua Portuguesa. Com base nestes valores foram ordenadas por
ordem decrescente de frequência as várias letras utilizadas na Língua Portuguesa: e, a, o, i, s, r, d, n, t,
c, m, u, l, p, g, v, f, ç, b, q, h, z, j, x, y, k, w. Para a disposição das teclas foi ainda considerada a quantidade de passos a efectuar pelo mecanismo de varrimento para o acesso a cada um dos itens. Para o
varrimento no formato linha-coluna a Figura 5-5 assinala a quantidade de passos associada a cada
uma das teclas. A disposição proposta coloca as letras mais frequentes nas teclas cujo acesso requer
Figura 5-6 - A disposição de teclas EaoisrVarrimentoSimples.
99
Figura 5-7 - A disposição de teclas EaoisrVarrimentoDivisãoSimples.
uma menor quantidade de passos. Para os utilizadores deste tipo de varrimento desenvolvemos uma
disposição que denominámos de EaoisrVarrimentoSimples e apresentamos na Figura 5-6. Esta disposição possui apenas um grupo de teclas por cada linha do teclado e por isso o varrimento é efectuado
no formato linha-coluna. Nesta disposição decidimos colocar as palavras preditas na primeira linha do
teclado. A disposição EaoisrVarrimentoAvançado é semelhante à anterior, possuindo apenas mais
algumas teclas para edição do texto.
Na sequência das duas disposições anteriores desenvolvemos as disposições EaoisrVarrimentoDivisãoSimples e EaoisrVarrimentoDivisãoAvançado. A diferença em relação às disposições anteriores
reside no facto destas possuírem dois grupos de teclas em cada linha. Desta forma a quantidade de
passos a efectuar pelo mecanismo de varrimento para a selecção de cada elemento do teclado é diferente da apresentada na Figura 5-5. Nestas disposições as várias letras foram distribuídas tendo em
consideração estes novos valores. Na Figura 5-7 apresentamos a disposição de teclas EaoisrVarrimentoDivisãoSimples.
As disposições EaoisrCentroSimples e EaoisrCentroAvançado possuem as letras mais frequentes no
centro do teclado. Desenvolvemos estas disposições para pessoas que escrevem através de um dispositivo de ponteiro mas que possuem dificuldades na execução de movimentos de grande amplitude. Desta forma reduzimos ao máximo os deslocamentos do dispositivo de ponteiro. Para uma maior eficácia
destes teclados deve ser utilizada uma fonte de tamanho reduzido.
As disposições Coluna e Linha apenas possuem teclas para a apresentação e selecção das palavras
preditas. Estes teclados destinam-se a utilizadores que escrevem através do teclado do computador e
que desejam acelerar a escrita através da predição de palavras.
100
void CTecla::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruc ){
CDC *cd = CDC::FromHandle( lpDrawItemStruc->hDC );
//Cria uma brush e selecciona a cor de fundo
CBrush pincel;
if( m_ratoSobre || m_seleccionada ){
pincel.CreateSolidBrush( m_corFundoDestaque );
cd->SetBkColor( m_corFundoDestaque );
}
else{
brush.CreateSolidBrush( m_corFundo );
dc->SetBkColor( m_corFundo );
}
//Preenche o fundo com o pincel
CRect rect;
GetClientRect( &rect );
CBrush *pPincelAntigo = cd->SelectObject( &pincel );
cd->Rectangle( &rect );
cd->SelectObject( pPincelAntigo );
//Coloca a cor do texto
if(m_ratoSobre || m_seleccionada )
cd->SetTextColor( m_corTextoDestaque );
else
cd->SetTextColor( m_corTexto );
if( TextoContemNomeFicheiroBitmap() )
DesenharBitmap( cd );
else
DesenharTexto( cd );
}
Quadro 5-6 - Função responsável pelo desenho de um objecto CTecla no ecrã do computador.
5.2.3 Adaptação do Teclado de Ecrã às Capacidades do Utilizador
Após a criação da estrutura do teclado é necessária proceder à apresentação dos seus elementos de
acordo com as configurações do utilizador. As várias teclas pertencentes a um mesmo agrupamento
devem ser dispostas numa sequência horizontal. O mesmo deve suceder com os grupos de teclas pertencentes a uma mesma linha. Finalmente as várias linhas do teclado devem ser dispostas numa sequência vertical. Cada objecto que representa um destes elementos está associado a uma janela do
sistema. Os objectos CLinha e CGrupo são objectos do tipo CWnd e os objectos CTecla são do tipo
CButton. As áreas das janelas dos objectos CLinha e CGrupo encontram-se cobertas por objectos do
tipo CTecla.
Como os objectos CTecla são derivados da classe CButton, o código que efectua o desenho deste objectos no ecrã do computador encontra-se por defeito localizado no interior da classe CButton. Para o
controlo das várias características visuais dos objectos CTecla, ou seja a cor de fundo, a cor das letras,
o tamanho e o tipo de fonte das letras foi necessário assumir o responsabilidade do desenho destes
objectos no ecrã do computador. O desenho destes objectos passou assim a ser efectuado no interior da
classe CTecla. Para tal foi efectuada a sobrecarga da função virtual void CButton::DrawItem(
101
(1)
(2)
(3)
Figura 5-8 - Teclado de Ecrã a executar o mecanismo de varrimento sobre os dois
grupos da quinta linha. Em (1) são percorridas as várias linhas; em (2) os grupos da
linha seleccionada; em (3) os elementos do grupo seleccionado.
LPDRAWITEMSTRUCT lpDrawItemStruc). O sistema operativo provoca a chamada desta função
sempre que é necessário actualizar o desenho de um destes objectos. A implementação desta função na
classe CTecla encontra-se apresentada no Quadro 5-6.
Verifiquemos como é efectuado o desenho de uma tecla. A função responsável por esta operação,
CTecla::DrawItem começa por adquirir um contexto para o dispositivo (device context) no qual vai ser
efectuado o desenho da tecla. O contexto de dispositivo é uma abstracção do sistema operativo Windows que permite uniformizar o processo de desenho de um objecto num dispositivo, seja este o ecrã,
a impressora ou outro. Neste caso o contexto de dispositivo representa a parte do ecrã na qual vai ser
efectuado o desenho da tecla. Este contexto de dispositivo disponibiliza um conjunto de funções
membro para a realização de um desenho. A classe CDC é a classe da MFC que representa um contexto de dispositivo nesta plataforma.
Após a obtenção de um contexto de dispositivo, através das função CDC::FromHandle, a função
CTecla::DrawItem selecciona a cor para o fundo e para o texto da tecla. As cores utilizadas dependem
do estado da tecla. Caso possua o ponteiro do rato sobre a sua área ou esteja seleccionada pelo mecanismo de varrimento, situações assinaladas respectivamente pelas variáveis membro m_ratoSobre,
m_seleccionada, então a tecla é desenhada com as cores de destaque. Caso contrário são utilizadas as
cores normais da tecla. As cores utilizadas para o destaque de uma tecla são apenas as cores normais
invertidas. Na Figura 5-8 é possível observar o destaque visual de um grupo de teclas no decurso de
uma operação de varrimento. Depois de seleccionadas as cores, é preenchido o fundo da tecla. A seguir é decidido o que inscrever sobre a tecla. Se o texto da tecla consistir no nome de um ficheiro bmp
então a imagem contida no ficheiro é colocado na área da tecla. A imagem contida neste ficheiro deverá possuir apenas duas cores, o preto e o branco. As partes brancas serão preenchidas com a cor de
fundo e as partes pretas com a cor do texto. No caso de não se tratar de um nome de um ficheiro então
o próprio texto é escrito sobre a tecla. Nesta escrita é considerado o tipo de letra, o tamanho da letra e
as cores definidas. A altura das teclas é calculada com base no tipo e tamanho da letra utilizada. Esta
altura também é mantida nas teclas que possuem uma imagem. A imagem é devidamente ajustada a
102
esta altura. O comprimento das várias teclas pode variar entre si por se encontrar ajustado ao texto ou
à imagem bmp da tecla.
Como referimos anteriormente cada objecto CGrupo é responsável por disposição horizontal das várias teclas que o compõem. A mesma operação é efectuada por cada objecto CLinha relativamente aos
grupos de teclas que a constituem. Na disposição das várias teclas, grupos e linhas são introduzidos de
forma propositada intervalos entre os objectos. Estas divisórias possibilitam uma identificação da estrutura do teclado ao utilizador. As divisórias utilizadas entre as teclas são estreitas, as divisórias entre
os grupos e linhas são mais largas. Podemos observar estas divisórias na Figura 5-8. A identificação
visual dos vários elementos de um teclado de ecrã é particularmente importante quando é utilizada a
Selecção por Varrimento. Neste tipo de selecção o utilizador necessita de identificar o grupo e a linha
que contêm a tecla pretendida antes de iniciar o mecanismo de varrimento. Por isso é importante que
estes se encontrem perfeitamente identificados. A seguir, com o mecanismo de varrimento em andamento, o utilizador deve seleccionar a linha correcta através de um primeiro varrimento, o grupo correcto através de um segundo varrimento, e finalmente a tecla pretendida através de um terceiro varrimento.
Como as teclas possuem textos e imagens diferentes o comprimento destas é como já referimos variável. Estas teclas formam por isso linhas no teclado de ecrã com comprimentos diferentes. Para além
disso, mesmo que todas as teclas possuíssem o mesmo comprimento, poderiam existir linhas com um
maior ou menor número de teclas e assim um maior ou menor comprimento. Por forma a evitar esta
situação desenvolvemos um algoritmo que iguala o comprimento das várias linhas. Este algoritmo
começa por obter a linha com maior comprimento. Em seguida acresce a cada uma das outras linhas o
tamanho necessário para igualar este comprimento. Este acréscimo é distribuído de forma igual por
todas as teclas da linha. Cada uma das teclas do teclado é assim alargada.
Depois de inicializado, o teclado de ecrã permite a selecção de qualquer uma das suas teclas através de
duas formas diferentes, Selecção Directa com Dispositivo de Ponteiro ou Selecção Indirecta por Varrimento. Veremos de seguida como foram implementados estes dois métodos de selecção.
5.2.4 Selecção Directa com Dispositivo de Ponteiro
Este tipo de selecção é utilizado por pessoas com dificuldades na manipulação de um teclado de computador mas com capacidades para a utilização de um dispositivo de ponteiro, como um rato ou trackball. As várias letras, e outros elementos do Conjunto de Selecção são seleccionados através de um
clique sobre a tecla associada. O objecto CTecladoEcra que desenvolvemos desconhece quais as operações associadas a cada tecla. Ao ser seleccionada uma das suas teclas este componente limita-se a
enviar ao objecto que o criou uma mensagem informando-o da ocorrência do evento. Este objecto
deve conhecer as operações associadas a cada tecla. Ao ser informado do clique numa das teclas deve
103
efectuar a operação associada. Esta operação pode consistir por exemplo, na escrita de uma letra ou
expansão de uma abreviatura na aplicação activa.
Na estrutura do teclado de ecrã o primeiro objecto a ser informado sobre um clique numa tecla é o
próprio objecto CTecla. Este evento é assinalado através de uma mensagem enviada pelo sistema operativo ao objecto. Ao receber esta mensagem o objecto CTecla poderia informar directamente o objecto CTecladoEcra sobre a ocorrência do clique. No entanto decidimos assinalar a ocorrência deste
evento, assim como todos os outros, ao longo da hierarquia de objectos do teclado de ecrã. Desta forma todos os objectos da hierarquia são informados do acontecimento. O clique sobre uma tecla é assinalado através da mensagem WM_CLIQUE_RATO_TECLA. O objecto CTecla envia esta mensagem
para o objecto CGrupo que o contém, este reenvia a mensagem para o objecto CLinha no qual se encontra incorporado, e por fim o objecto CLinha reenvia a mensagem ao objecto CTecladoEcra.
Ao reenviar a mensagem WM_CLIQUE_RATO_TECLA cada objecto adiciona à mensagem o seu
identificador. Cada tecla possui um identificador único no grupo. A primeira tecla de um grupo possui
o número zero, a segunda, o número um, e assim sucessivamente. A mesma numeração é efectuada
sobre os grupos de uma linha e sobre as linhas do teclado. Os números atribuídos às teclas e grupos
são por isso identificadores relativos ao passo que os números atribuídos às linhas são identificadores
absolutos. A mensagem WM_CLIQUE_RATO_TECLA ao chegar ao objecto CTecladoEcra encontrase assim etiquetada com estes três identificadores, o número da tecla, do grupo e da linha, através dos
quais circulou a mensagem. O conjunto destes três identificadores permite identificar cada tecla do
teclado de ecrã. Ao assinalar este evento para o exterior o objecto CTecladoEcra fornece também este
identificador. Com este identificador o objecto notificado pode assim aceder às propriedades da tecla
sobre a qual foi efectuada o clique.
O clique que o utilizador efectua para a selecção de uma tecla levanta no entanto um problema que foi
preciso solucionar. Em qualquer sistema operativo, e em particular no sistema operativo Windows, um
clique sobre um elemento gráfico de uma aplicação permite que essa aplicação se torne a aplicação
activa do sistema, ou seja aquela para a qual é direccionada toda a interacção proveniente dos dispositivos de entrada. Um clique sobre uma tecla do teclado de ecrã provoca assim a desactivação da aplicação na qual o utilizador está a escrever. Para que o processo seja completamente transparente esta
situação não deve acontecer. A aplicação sobre a qual o utilizador está a trabalhar deve permanecer
activa como se a escrita estivesse a ser efectuada a partir do teclado do computador. Por isso foi necessário impedir a desactivação desta aplicação na sequência de um clique sobre uma tecla do teclado de
ecrã.
Como
resultado
de
um
clique,
o
sistema
operativo
Windows
envia
a
mensagem
WM_MOUSEACTIVATE à janela sobre a qual foi efectuada esta operação. Esta mensagem permite
informar uma janela sobre a iminência da sua activação. Ao receber a mensagem
WM_MOUSEACTIVATE a aplicação associada à janela pode assim desenvolver um conjunto de inicializações necessárias à interacção com o utilizador. Existe também a possibilidade da janela recusar
104
int CTecla::OnMouseActivate( CWnd* pDesktopWnd, UINT nHitTest, UINT message ){
if( m_hwndJanelaActiva != NULL )
::SetForegroundWindow( m_hwndJanelaActiva );
m_pCWndPai -> PostMessage(WM_CLIQUE_RATO_TECLA, m_numero, 0);
return MA_NOACTIVATEANDEAT;
}
Quadro 5-7 - Rotina que evita a activação da aplicação ao ser efectuado um clique sobre
uma das teclas do Teclado de Ecrã.
a activação. Para tal deve retornar o valor MA_NOACTIVATEANDEAT no final da rotina de tratamento desta mensagem. O retorno deste valor também indica que a mensagem não deve ser reflectida através da hierarquia de janelas da aplicação. A mensagem não será assim processada em nenhum ponto
da aplicação. Desta forma a mensagem também não chegará à janela principal da aplicação e por isso
a preparação da aplicação para a activação também não será efectuada.
A recusa da nossa aplicação em ser activada não é suficiente para manutenção da outra aplicação activa. Isto porque o sistema operativo antes de activar a nova aplicação desactiva a aplicação anteriormente nesse estado. Para resolver este problema a nossa aplicação também deve repor a aplicação
activa. O Quadro 5-7 mostra como esta operação é efectuada na rotina de tratamento da mensagem
WM_MOUSEACTIVATE. Esta rotina envia ainda a mensagem WM_CLIQUE_RATO_TECLA através
da hierarquia de elementos do teclado de ecrã. Desta forma este acontecimento é assinalado para o
exterior do objecto.
Para repor a aplicação activa cada objecto CTecla mantém uma variável com o identificador da janela
associada à aplicação activa em cada momento. Sempre que necessário estes objectos utilizam o identificador armazenado para repor a aplicação activa. Como a janela activa pode ser alterada por vontade
do utilizador estes objectos devem conseguir actualizar o identificador associado. Os objectos CTecla
apenas actualizam este valor quando detectam a entrada do ponteiro do rato sobre a sua área. A actualização deste identificador é apenas efectuada nestes momentos porque somente nesta situação pode
surgir um clique e nessa altura será então necessário repor a aplicação activa.
Os objectos CTecla detectam a entrada do ponteiro do rato sobre a sua área através da mensagem
WM_MOUSEMOVE. O sistema operativo Windows envia esta mensagem de uma forma contínua à
janela situada por baixo do ponteiro do rato. Através destas mensagens a janela pode monitorizar o
percurso do ponteiro do rato. A primeira destas mensagens é utilizada pelos objectos CTecla para a
detecção da entrada do ponteiro do rato na área da sua janela. Nesta situação o objecto CTecla deve
preparar-se para um eventual clique. O Quadro 5-8 mostra a função que efectua o tratamento da mensagem WM_MOUSEMOVE.
105
void CTecla::OnMouseMove( UINT nFlags, CPoint point ){
if( ! m_ratoSobre ){
m_ratoSobre = 1;
m_foregroundHwnd = ::GetForegroundWindow();
Invalidate();
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof( tme );
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = m_hWnd;
tme.dwHoverTime = HOVER_DEFAULT;
::_TrackMouseEvent( &tme );
}
}
Quadro 5-8 - Função que detecta a entrada do ponteiro do rato sobre um tecla do
teclado de ecrã.
Para detectar a primeira mensagem, de uma sequência de mensagens WM_MOUSEMOVE, esta função
utiliza a variável membro m_ratoSobre. Esta variável encontra-se igual a zero quando o ponteiro do
rato se encontra fora da tecla. No tratamento de uma mensagem WM_MOUSEMOVE esta função verifica o valor a variável m_ratoSobre. Caso a variável seja igual a 0 então a função está a tratar a primeira de uma sequência de mensagens WM_MOUSEMOVE. A entrada do ponteiro do rato sobre a área da
tecla está assim detectada. A variável m_ratoSobre é imediatamente colocada com o valor 1 para que
as próximas mensagens WM_MOUSEMOVE não sejam processadas pela rotina de tratamento. Durante o tratamento da primeira mensagem WM_MOUSEMOVE a função obtém o identificador da janela
activa. Este identificador é armazenado na variável membro m_hwndJanelaActiva. Caso seja efectuado um clique sobre a tecla este identificador pode ser utilizado para a reposição da aplicação activa.
Como o ponteiro do rato se encontra sobre a área da tecla a sua apresentação gráfica deve ser efectuada na forma destacada. Para que a tecla seja redesenhada nesta nova condição é chamada a função
Invalidate(). Entre outras operações esta função membro da classe CWnd irá provocar a chamada da
função CTecla::DrawItem. Esta última função irá efectuar o desenho da tecla no ecrã do computador
tendo em consideração a nova situação da tecla.
Para além destas operações também é requerido ao sistema operativo a sinalização de dois eventos
relativos ao rato que normalmente não assinalados às aplicações. O pedido para a sinalização destes
eventos é efectuado através da função _TrackMouseEvent. O primeiro destes eventos, identificado por
TM_HOVER (track mouse hover), assinala a imobilização do ponteiro do rato sobre a área da tecla
durante um certo tempo definido. Estabelecemos para este tempo o valor por defeito, cerca de 500 ms.
O segundo evento, identificado por TM_LEAVE (track mouse leave), assinala a saída do rato da área
da tecla. Ambos os eventos são assinalados aos objectos CTecla através de mensagens do sistema, a
mensagem WM_MOUSEHOVER para o primeiro evento, e a mensagem WM_MOUSELEAVE para o
segundo evento. Para cada uma destas mensagens os objectos CTecla possuem uma rotina de tratamento.
A rotina para o tratamento da primeira mensagem enviará para o exterior do objecto CTecladoEcra a
informação de que o rato permaneceu imobilizado no interior de uma tecla durante um certo tempo.
106
Tal como noutras situações o evento será assinalado através de uma mensagem definida pela nossa
aplicação. Neste caso denominámos esta mensagem de WM_RATO_SOBRE_TECLA. A mensagem
chegará ao objecto CTecladoEcra através da hierarquia de elementos do teclado. O objecto CTecladoEcra por sua vez reenviará a mensagem ao objecto que se registou como receptor dos eventos. Este
último objecto tomará assim conhecimento de que o ponteiro do rato se encontra há algum tempo sobre a tecla. Nesta situação pode supor-se que o utilizador precisa de apoio para a selecção da tecla.
Para o apoiar o utilizador nesta situação o sistema sintetiza para fala a descrição da tecla. Este evento
continuará a ser assinalado pelo teclado de ecrã até ser atingido um número de vezes definido pelo
utilizador.
A rotina para o tratamento da segunda mensagem, WM_MOUSELEAVE, que assinala a saída do ponteiro do rato da tecla, limita-se a repor o valor 0 na variável m_ratoSobre. Também é requerido que a
tecla actualize a sua apresentação gráfica. A tecla será então desenhada com as suas cores normais.
5.2.5 Selecção Indirecta com Varrimento
Determinadas dificuldades motoras podem impedir uma pessoa de utilizar um teclado de computador
ou um dispositivo de ponteiro. Em muitas situações a pessoa apenas dispõe de um ou dois movimentos
funcionais. Estes movimentos permitem accionar somente um ou dois interruptores. Nestas circunstâncias a pessoa pode recorrer ao mecanismo de varrimento para a selecção de uma das teclas de um
teclado de ecrã. Para o controlo deste método de selecção apenas é necessária a utilização de um ou
dois interruptores.
5.2.5.1 Interruptores do Mecanismo de Varrimento
Figura 5-9 - Interacção entre os objectos CProcessadorTexto, Controlador do Sistema
e CTecladoEcra durante o mecanismo de varrimento.
107
O nosso sistema disponibiliza ao utilizador três variantes do método de varrimento, varrimento regular, varrimento inverso e varrimento passo-a-passo. Nas duas primeiras variantes o sistema percorre
automaticamente os elementos do teclado de ecrã, numa primeira fase as linhas, depois os grupos da
linha seleccionada, e por fim as teclas do grupo seleccionado. Em cada fase, para seleccionar um dos
elementos, seja uma linha, grupo ou tecla, o utilizador deve alterar o estado de um interruptor. Esta
operação deve ser efectuada no momento preciso que o elemento estiver a ser percorrido pelo sistema.
No varrimento regular, o interruptor deve encontrar-se aberto enquanto os vários elementos são percorridos pelo sistema. Para a selecção de um dos elementos o utilizador deve fechar o interruptor. No
varrimento inverso a situação é contrária. Durante o varrimento o interruptor deve permanecer fechado, pelo que ao ser solto é assinalada a selecção do elemento percorrido naquele instante. O varrimento inverso é utilizada por pessoas que possuem uma maior precisão na libertação de um interruptor do
que na sua pressão. No varrimento regular e inverso é apenas utilizado um interruptor e por isso a pessoa apenas necessita de possuir um movimento funcional, qualquer que este seja. O varrimento passoa-passo é totalmente comandado pelo utilizador. Para tal a pessoa deve conseguir controlar dois interruptores. Através da sucessiva activação de um dos interruptores pode percorrer de uma forma autónoma os vários elementos do teclado de ecrã. Esta tarefa era efectuada de forma automática nas variantes anteriores. Um segundo interruptor permite seleccionar o elemento percorrido em cada momento.
O objecto CTecladoEcra não interage directamente com os interruptores. Para este objecto a função
dos interruptores pode ser efectuada por teclas do computador, botões do rato, ou interruptores ligados a uma porta de entrada do computador. O objecto que contém o teclado de ecrã, ou seja o objecto
Controlador do Sistema, deve monitorizar os interruptores ligados ao sistema e traduzir as operações
efectuadas pelo utilizador em chamadas a duas funções membro da classe CTecladoEcra denominadas InterruptorBaixo( int numeroInterruptor ) e InterruptorCima( int numeroInterruptor ). A primeira
função deve ser chamada quando o utilizador pressiona um interruptor e a segunda quando solta um
Figura 5-10 –Adaptação ao rato que permite a substituição dos
botões esquerdo e direito por dois interruptores externos.
108
interruptor. Actualmente estão a ser utilizados os botões esquerdo e direito do rato como interruptores
do mecanismo de varrimento.
Durante o funcionamento do sistema o processador de texto utilizado pela pessoa é a aplicação activa.
Por este motivo todas as entradas provocadas pelo utilizador são encaminhadas para esta aplicação.
Assim o objecto CProcessadorTexto deve detectar e informar o objecto CControladorSistema relativamente a todas as operações efectuadas sobre os botões do rato. A Figura 5-9 ilustra a interacção
entre este objecto e o objecto CTecladoEcra durante o mecanismo de varrimento.
Na maioria das situações os botões de um rato não são adequados à manipulação por parte de utilizadores destes sistemas. Para a utilização de um manípulo adequado é necessário proceder à adaptação
do rato que se ilustra na Figura 5-10. Esta adaptação consiste na colocação de duas fichas que permitem a ligação de dois interruptores externos que fecham os circuitos nos quais se encontram inseridos
os botões esquerdo e direito do rato.
Para a utilização de um dos métodos de varrimento disponibilizados pelo nosso sistema o utilizador
deve possuir um ou dois movimentos funcionais para a activação dos interruptores. Por vezes o controlo sobre estes movimentos não é total e nalgumas situações a pessoa pode sofrer de movimentos
involuntários. Estes movimentos involuntários podem activar os interruptores do mecanismo de varrimento e conduzir o utilizador a selecções indesejadas. Como já referimos anteriormente a utilização de
teclas vazias num teclado de ecrã permite minimizar os efeitos de selecções mal efectuadas. Seleccionando uma destas teclas vazias o utilizador aborta a operação de varrimento em curso. Não é assim
necessário a escolha uma tecla indesejada cujo efeito teria de ser anulado numa operação seguinte. De
qualquer forma esta selecção acaba por atrasar o processo de escrita do utilizador. Para evitar selecções indesejadas, resultantes de movimentos involuntários, o nosso sistema permite alterar o tempo de
resposta, ou latência dos interruptores intervenientes no mecanismo de varrimento. Desta forma o sistema apenas assume um novo estado para um interruptor se esse interruptor permanecer nesse novo
estado, quer em baixo, quer em cima, durante um certo período de tempo estabelecido. Este tempo de
resposta dos interruptores pode ser configurado de modo a impedir que determinados movimentos
involuntários, geralmente rápidos, activem o mecanismo de varrimento.
5.2.5.2 Temporizadores do Mecanismo de Varrimento
Para a implementação desta capacidade é necessário contar o tempo durante o qual o interruptor permanece num determinado estado, seja em baixo seja em cima. Ao fim do tempo estabelecido esse
estado é considerado válido. Para a contagem do tempo um programa pode utilizar um temporizador.
No sistema operativo Windows um programa ou objecto pode criar um temporizador com a função
SetTimer. Na chamada desta função deve ser indicado o tempo que se pretende contar. No final deste
tempo o temporizador envia a mensagem WM_TIMER ao programa, indicando que a contagem chegou
ao fim. No Windows este temporizador continuará a enviar esta mensagem sempre que termine uma
109
parcela de tempo igual ao valor indicado. Para terminar este aviso o objecto deve destruir o temporizador através da função KillTimer.
Para a implementação dos mecanismos de varrimento regular e inverso também é necessário efectuar
contagens de tempo. Estes mecanismos para percorrerem de forma automática os vários elementos do
teclado de ecrã necessitam de contar o tempo ao fim do qual devem avançar para um novo elemento.
Este tempo encontra-se relacionado de forma inversa com a velocidade de varrimento. Quanto maior
este tempo menor a velocidade de varrimento. O nosso sistema permite ajustar este tempo, e por isso a
velocidade de varrimento às capacidades do utilizador.
Os temporizadores constituem recursos limitados num sistema operativo. Por isso através do recurso a
um temporizador desenvolvemos os três temporizadores necessários ao mecanismo de varrimento. O
primeiro é activado através da chamada da função InterruptorBaixo( int numeroInterruptor ). Findo o
tempo de latência dos interruptores o temporizador despoleta a chamada da função ProcessarInterruptorBaixo(). O segundo temporizador é activado através da chamada da função InterruptorCima( int
numeroInterruptor ). Findo o tempo de latência dos interruptores o temporizador despoleta a chamada
da função ProcessarInterruptorCima(). O terceiro temporizador é utilizado para o avanço automático
sobre os elementos do teclado de ecrã.
5.2.5.3 Métodos de Varrimento
Dependendo do método de varrimento utilizado assim serão efectuadas determinadas acções sobre o
mecanismo de varrimento. Por este motivo organizámos o código das funções ProcessarInterruptorBaixo() e ProcessarInterruptorCima() em dois níveis de decisão. Num primeiro nível é verificado qual
o método de varrimento em utilização, num segundo nível é verificado o interruptor envolvido. Tendo
em consideração estes dois factores são efectuadas as acções necessárias sobre o mecanismo de varrimento. No Quadro 5-9 apresentamos parte da função ProcessarInterruptorBaixo(). A função ProcessarInterruptorCima() encontra-se implementada de forma semelhante. O código apresentado mostra
as acções efectuadas quando é utilizado o método de varrimento regular. Lembremo-nos que neste
método apenas é utilizado um interruptor. A activação deste interruptor permite iniciar o varrimento.
Para além disso, com o varrimento em andamento, a activação deste mesmo interruptor permite seleccionar o elemento percorrido naquele instante. Atribuímos este papel ao interruptor número 1.
110
void CTecladoEcra::ProcessarInterruptorBaixo(){
if( m_metodoVarrimento == "Regular" ){
if( m_numeroInterruptorBaixo == 1 ){
if( ! VarrimentoActivo() )
IniciarVarrimento();
else{
PararTemporizadorVarrimento();
SeleccionarElementoVarrido();
}
if( VarrimentoActivo() )
IniciarTemporizadorVarrimento();
}
else
if(m_numeroInterruptorBaixo == 2 ){
//Nao e utilizado
}
}
else
if(m_metodoVarrimento == "Passo-a-Passo" ){
...
}
else
if(m_metodoVarrimento == "Inverso" ){
...
}
}
Quadro 5-9 - Função que reflecte no mecanismo de varrimento o facto de um
interruptor ter sido colocado em baixo.
Após ser chamada, a função ProcessarInterruptorBaixo() verifica qual o método de varrimento utilizado e qual o interruptor envolvido. No caso de estar a ser utilizado o varrimento regular e de ter sido
activado o interruptor número 1 então a função verifica o estado do varrimento. Tal é efectuado através da função VarrimentoActivo(). O varrimento pode estar parado, ou seja no estado inactivo, ou em
andamento, ou seja no estado activo. Se o varrimento estiver parado então o interruptor em baixo significa que o varrimento deve ser iniciado. Para isso o sistema deve começar a varrer as várias linhas do
teclado de ecrã. Para tal é chamada a função IniciarVarrimento(). Se o varrimento já estiver em andamento então a colocação do interruptor em baixo significa que o utilizador pretende seleccionar o elemento percorrido naquele momento. Para evitar um próximo avanço do varrimento é parado o temporizador do varrimento. De seguida é seleccionado através da função SeleccionarElementoVarrido() o
elemento percorrido naquele momento. Após estas operações a função verifica novamente o estado do
varrimento. Este ainda pode continuar activo. Tal acontece se tiver sido seleccionada uma linha ou um
grupo de teclas. Neste caso o temporizador do varrimento deve ser novamente activado para um avanço posterior do varrimento. Como o interruptor número 2 não desempenha qualquer função neste método de varrimento a parte do código relativa a este interruptor encontra-se vazia. Relativamente aos
outros métodos de varrimento a função encontra-se programada de forma semelhante. Para cada um
destes métodos de varrimento a função dispõe do conjunto de acções a efectuar caso o interruptor número 1 ou o interruptor número 2 sejam colocados em baixo.
111
WM_RATO_SOBRE_TECLA: O ponteiro do rato encontra-se sobre uma tecla há um certo tempo.
WM_CLIQUE_RATO_TECLA: Foi efectuado um clique sobre uma das teclas.
WM_AVANCO_VARRIMENTO: O mecanismo de varrimento avançou para um novo elemento.
WM_ TECLA_SELECCIONADA_VARRIMENTO: Foi seleccionada uma tecla com o mecanismo de varrimento.
Quadro 5-10 - Eventos assinalados pelo Teclado de Ecrã ao exterior.
As funções apresentadas anteriormente recorrem a várias funções auxiliares para a realização de operações sobre o mecanismo de varrimento, nomeadamente as funções int VarrimentoActivo(), void IniciarVarrimento(), void AvancarVarrimento() e void SeleccionarElementoVarrido(). Estas funções
permitem respectivamente, verificar se um varrimento do teclado de ecrã está em curso ou não, iniciar
um novo varrimento, avançar o varrimento para um novo elemento e seleccionar o elemento varrido
num determinado momento. Estas operações também provocam o envio de mensagens por parte do
teclado de ecrã a outros objectos. Desta forma um objecto exterior pode acompanhar o desenrolar de
uma selecção por varrimento. Por exemplo um sintetizador de fala ao ser informado do elemento que
se encontra a ser percorrido pode sintetizar para fala a sua descrição.
No Quadro 5-10 resumimos os eventos assinalados pelo objecto CTecladoEcra ao objecto Controlador do Sistema. Os dois primeiros eventos são assinalados quando estão a ser efectuadas selecções
através de um dispositivo de ponteiro. Os dois últimos eventos são assinalados quando as selecções
estão a ser efectuadas através do mecanismo do varrimento.
5.3 Incorporação de um Sintetizador de Fala
Um sintetizador de fala é uma ferramenta que permite transformar texto escrito em fala. Esta operação, denominada de síntese de fala, pode apoiar a CAA em vários níveis. Ao nível da composição da
mensagem pode auxiliar a selecção de uma tecla do teclado de ecrã. Caso a pessoa esteja a utilizar um
dispositivo de ponteiro o sistema pode sintetizar para fala a descrição da tecla sobre a qual se encontra
o ponteiro. Este feedback auditivo pode assim complementar a informação visual fornecida por cada
tecla. Também pode ser fornecido um feedback semelhante caso a pessoa esteja a utilizar um dos métodos de varrimento. Sempre que o varrimento avança para um novo elemento, seja uma linha, um
grupo ou tecla, o sintetizador de fala pode ser utilizado para descrever de forma auditiva o elemento
percorrido naquele momento. O destaque visual do elemento percorrido em cada momento pode assim ser reforçado com um feedback auditivo. Para a selecção de uma das palavras preditas, ou expansão de uma das abreviaturas, também pode ser conveniente a sua audição prévia. Após ouvir a palavra
predita ou a expansão de uma abreviatura o utilizador pode então decidir sobre a sua selecção ou não.
112
Para a detecção de certos tipos de erros, ortográficos, gramaticais ou semânticos também pode ser útil
o recurso a um sintetizador de fala. Ouvindo a mensagem escrita até ao momento o utilizador pode
detectar determinados erros que de outra forma passariam desapercebidos. No caso do sistema estar a
ser utilizado para a conversação então o sintetizador de fala será ainda o elemento responsável pela
transmissão da mensagem ao interlocutor. Estas possibilidades que descrevemos podem ser opcionalmente activadas no nosso sistema. Dependendo da finalidade com que o sistema é utilizado, para a
escrita, para a conversação, ou para a aprendizagem da leitura e escrita, assim determinadas opções
relativas à síntese de fala podem ser activadas ou não.
Para uniformizar o acesso das aplicações aos vários sintetizadores de fala existentes no sistema, o sistema operativo Windows possui uma interface de programação denominada Speech Application Programming Interface – SAPI. Através da utilização desta interface uma aplicação pode aceder a qualquer sintetizador de fala compatível. No nosso sistema, era acima de tudo necessária a utilização de
um sintetizador de fala para o Português Europeu. Como o sintetizador de fala DIXI+ dispõe actualmente de uma interface SAPI, versão 4, implementámos no nosso sistema a capacidade de interacção
com qualquer sintetizador de fala SAPI 4. O sistema operativo Windows desenvolveu recentemente
uma nova versão para esta interface, a SAPI 5, infelizmente incompatível com a anterior, pelo que será
conveniente num futuro próximo a utilização desta nova interface, quer no sintetizador de fala DIXI+
quer no nosso sistema.
A interface SAPI de cada sintetizador de fala é implementada através de um servidor COM que disponibiliza para o exterior um conjunto de interfaces COM predefinidas. Estas interfaces COM possibilitam o acesso de uma aplicação externa aos vários serviços do sintetizador de fala. Para o acesso a estes
serviços a aplicação interessada deve implementar internamente um cliente COM. Para a SAPI 4 a
implementação deste cliente COM pode ser efectuado de três formas distintas: (1) recorrendo directamente às interfaces COM; (2) recorrendo a classes C++ que encapsulam o acesso a estas interfaces
COM; (3) ou então incorporando na aplicação objectos Active X, estes últimos objectos gráficos autónomos (controls), que em última instância também recorrem às interfaces COM para o acesso às funcionalidades do sintetizador de fala.
class CSintetizadorFala{
public:
CSintetizadorFala();
~CSintetizadorFala();
int ObterNomesSintetizadoresFala(CArray<CString, CString&>& nomesSintetizadoresFala
);
int Inicializar( CString nomeSintetizadorFala );
void Terminar();
int Falar( CString text );
private:
PCTTSMode pSintetizadorFala;
...
};
Quadro 5-11 - Parte da definição da classe CSintetizadorFala.
113
No nosso sistema implementámos o cliente COM com o recurso as classes C++ predefinidas que encapsulam o acesso às interfaces COM da SAPI4. Estão disponíveis dois conjuntos de classes para este
tipo de acesso. Um dos conjuntos, denominado Voice Text API, é bastante simples e de mais alto nível
mas apenas disponibiliza o acesso aos serviços básicos de um sintetizador de fala. O outro conjunto de
classes, denominado Direct Text to Speech API, é de mais baixo nível e por isso bastante mais completo. Este último permite o acesso a todas as funcionalidades das interfaces COM da SAPI 4. Recorremos a este último conjunto de classes porque o outro não disponibilizava determinadas funcionalidades necessárias à nossa aplicação, como por exemplo a possibilidade de interrupção de uma operação
de síntese em curso, ou a enumeração de todos os sintetizadores SAPI 4 existentes no sistema. Para
isolarmos os componentes do nosso SACAA das especificidades relativas ao acesso a um sintetizador
de fala SAPI 4, desenvolvemos uma classe denominada CSintetizadorFala. No Quadro 5-11 apresentamos parte da definição desta classe.
O objecto CSintetizadorFala do nosso sistema disponibiliza o acesso aos vários sintetizadores de fala
instalados no sistema operativo. Através da função membro ObterNomesSintetizadoresFala esta classe
possibilita a obtenção de um vector com o nome dos sintetizadores de fala disponíveis no sistema. Esta
lista de nomes pode ser apresentada ao utilizador para que seja seleccionado o sintetizador de fala mais
adequado. O objecto CSintetizadorFala deve ser inicializado através da chamada da função Inicializar
com o nome do sintetizador de fala como parâmetro. Internamente esta função deve criar um cliente
SAPI 4 para o estabelecimento de uma ligação ao servidor SAPI 4 do sintetizador de fala indicado.
Para a implementação de um cliente SAPI no interior da classe CSintetizadorFala utilizamos a classe
CTTSMode. Esta classe implementa internamente o cliente pretendido. Para tal definimos na classe
CSintetizadorFala uma variável membro do tipo apontador para CTTSMode (PCTTSMode) que denominámos de m_pSintetizadorFala. Através desta variável é assim possível a criação e destruição
dinâmica de um cliente SAPI 4. A partir do momento que o cliente SAPI 4 está criado os serviços do
sintetizador de fala são acedidos através da variável membro m_pSintetizadorFala. Através desta variável podem ser invocadas as várias funções membro da classe CTTSMode. Estas funções encapsulam
os acessos às interfaces COM implementadas no servidor SAPI 4. Em qualquer momento é possível a
alteração do sintetizador de fala em utilização. Para tal basta chamar a função membro Terminar. Esta
função destrói o cliente SAPI 4. De seguida deve ser chamada a função Inicializar com o nome do
novo sintetizador de fala. Para ilustrarmos a implementação da classe CSintetizadorFala apresentamos
no Quadro 5-12 a função membro Falar.
114
int CSintetizadorFala::Falar( CString texto ){
if( m_pSintetizadorFala ){
HRESULT
hRes;
hRes = m_pSintetizadorFala->AudioReset();
if( hRes != S_OK )
return 0;
hRes = m_pSintetizadorFala->Speak( A2W( LPCTSTR( texto ) ) );
if( hRes != S_OK )
return 0;
return 1;
}
else
return 0;
}
Quadro 5-12 - A função Falar da classe CSintetizadorFala.
Esta função começa por verificar se existe algum sintetizador de fala activo através da validação da
variável membro m_pSintetizadorFala. Se tal acontecer termina uma possível síntese em curso através
da chamada da função CTTSMode::AudioReset() e em seguida inicia a nova síntese de fala através da
função CTTSMode::Speak(PCWSTR text). Esta última função requer como parâmetro uma cadeia de
caracteres UNICODE. Por este motivo são utilizadas as macros A2W e LPCTRSTR que convertem um
objecto CString numa cadeia de caracteres UNICODE.
5.4 Incorporação de um Agente de Interface
Para aumentarmos a capacidade de interacção do nosso sistema foi integrado um agente de interface.
Este agente foi implementado com o recurso aos Ms Agents. A utilização do agente também é opcional. Através deste agente pensamos aumentar a capacidade do programa em participar no processo de
aprendizagem da leitura e da escrita. Um estudo recente mostrou que a existência de expressões faciais
na interface de um programa promove um maior envolvimento e atenção por parte do utilizador. No
entanto também foi verificado que este tipo de interacção requer da parte do utilizador um maior esforço. Por este motivo estas técnicas de interacção são mais aconselháveis nas áreas da educação ou o
treino (Koda, 1996).
A capacidade de interacção do agente é no entanto ainda muito reduzida. Actualmente é utilizado
principalmente como estratégia para o envolvimento dos utilizadores mais novos. No inicio faz uma
vénia, na predição acena positivamente com a cabeça caso encontre palavras, caso não encontre faz
uma expressão triste. Para completar uma palavra lança uns pós mágicos. Podemos observar esta animação na Figura 5-11. No final despede-se acenando com a mão. Enquanto o utilizador se encontra a
escrever, o agente vai efectuando outras acções de uma forma automática, como piscar os olhos ou o
115
Figura 5-11 - O Agente de Interface a fazer magia para completar uma
palavra.
olhar para um lado e para outro. Apesar destas acções o agente mantém sempre a sua posição junto do
teclado de ecrã.
O feedback fornecido pelo agente será melhorado no futuro. Através deste componente será possível
transmitir determinado tipo de informação importante para os utilizadores destes programas, como por
exemplo a confiança do sistema na predição de palavras efectuada. Neste momento apenas são tratadas duas situações opostas: encontrou ou não encontrou palavras. Na primeira situação o agente apresenta uma expressão feliz, na segunda uma expressão triste. Para além destes casos extremos seria
interessante a expressão de outros níveis de confiança intermédios. No futuro a síntese de fala também
poderá ser efectuada através do agente de interface. Desta forma o agente também poderá falar com o
utilizador. Actualmente os Ms Agents já dispõe de um mecanismo que permitem a sincronização labial
do agente com a saída do sintetizador de fala, mas para tal este último componente terá de ser compatível com a SAPI 5. Como o DIXI+ ainda não possui uma interface SAPI 5 adiámos a utilização desta
funcionalidade para o futuro.
Os serviços dos Ms Agents também se encontram implementados no sistema operativo Windows através de um servidor OLE Automation. Como nas situações anteriores o acesso a estes serviços deve ser
efectuado através um cliente OLE Automation. Implementámos este cliente numa classe que denominámos CAgenteInterface. A manipulação do agente por parte de outros componentes do sistema ficou
assim simplificada. O Quadro 5-13 apresenta parte da definição desta classe.
116
class CAgenteInterface{
public:
CAgenteInterface();
~CAgenteInterface();
int Inicializar( CString nomePersonagem, int x, int y );
void Terminar();
int AlterarPersonagem( CString nomePersonagem );
void AnimarPersonagem( const unsigned short *idAnimacao);
void MoverPersonagem( int x, int y, int tempoMovimento );
...
private:
IAgentEx *m_pInterfaceMsAgents; //interface para os msagents
IAgentCharacterEx *m_pInterfacePersonagem; //interface para a personagem
...
};
Quadro 5-13 - Parte da definição da classe CAgenteInterface.
Esta classe implementa internamente um Cliente ou Controlador de Automação para o acesso aos serviços dos Ms Agents. Como vimos anteriormente existem duas formas diferentes de implementar um
Controlador de Automação. Um Controlador pode recorrer unicamente à interface standard IDispatch,
que depois possibilita o acesso às várias propriedades e métodos dos objectos através da utilização da
função IDispatch::Invoke, ou então pode aceder directamente às várias interfaces do Servidor de Automação. Estas últimas fornecem um acesso directo às propriedades e métodos dos objectos. Como o
nosso sistema foi implementado na linguagem C++ qualquer um dos métodos poderia ser utilizado.
Para a implementação do Controlador de Automação acedemos directamente às interfaces do Servidor
de Automação.
O Controlador de Automação é inicializado através da função int Inicializar( CString nomePersonagem, int x, int y ) da classe CAgenteInterface. Apresentamos esta função no Quadro 5-14. Através do
código da função podemos verificar que a ligação do Cliente ao Servidor de Automação é efectuada
através da função CoCreateInstance. Esta função cria uma instância do servidor de automação dos Ms
Agents e disponibiliza à aplicação a interface principal do servidor. O apontador para esta interface
COM é armazenado na variável membro m_pInterfaceMsAgents. Com o recurso a esta interface é
depois possível carregar uma das personagens disponíveis. Ao carregarmos uma personagem também
nos
é
fornecida
uma
outra
interface
COM.
Armazenamos
na
variável
membro
m_pInterfacePersonagem o apontador para esta interface. Esta interface permite depois a manipulação da personagem seleccionada. No Quadro 5-15 é apresentada também a função MoverPersonagem.
Esta função permite movimentar o agente no ecrã do computador através do acesso à interface referenciada por m_pInterfacePersonagem.
117
int CAgenteInterface::Inicializar( CString nomeAgente, int x, int y ){
HRESULT
hRes;
hRes = CoCreateInstance(CLSID_AgentServer, NULL,
CLSCTX_SERVER,IID_IAgentEx,(LPVOID *)& m_pInterfaceMsAgents);
if (FAILED(hRes)) {
AfxMessageBox("MsAgents não encontrado");
return 0;
}
else{
if( CarregarAgente( nomeAgente, x, y ) )
return 1;
else
return 0;
}
}
Quadro 5-14 - A função Inicializar da classe CAgenteInterface.
void CAgenteInterface::MoverPersonagem( int x, int y, int tempoMovimentacao ){
HRESULT hRes;
long lRequestID;
hRes = m_pInterfacePersonagem->MoveTo( x, y, tempoMovimentacao,
&lRequestID);
if (FAILED(hRes)) {
AfxMessageBox("Erro na movimentação do personagem");
}
}
Quadro 5-15 - A função MoverPersonagem da classe CAgenteInterface.
118
6. Arquitectura do Sistema
O sistema que desenvolvemos destina-se a apoiar a composição e transmissão de mensagens no Português Europeu. Em termos conceptuais o nosso sistema baseia-se na estrutura proposta por Cook e
Hussey (1995: 482) para um SACAA. Esta estrutura é composta por três elementos distintos: (1) Processador; (2) Interface do Utilizador; (3) Saída do Sistema. A Interface do Utilizador (IU) possibilita o
acesso da pessoa às várias funcionalidades do sistema. O Processador implementa estas funcionalidades. As funcionalidades do sistema devem possibilitar a composição e transmissão de mensagens.
Como resultado da operação do sistema é gerada uma Saída que transmite a mensagem ao interlocutor.
6.1 Componentes do Sistema
A pessoa interage com o sistema através da IU. É através desta Interface que a pessoa acede às funcionalidades do sistema. Todo o feedback considerado necessário à construção da mensagem também é
enviado ao utilizador através deste componente. A IU pode ser decomposta em três elementos: o Conjunto de Selecção (e.g. letras do alfabeto), o Método de Selecção (e.g. Selecção Directa com Teclado
de Ecrã) e o Dispositivo de Controlo (e.g. rato).
O Conjunto de Selecção contém os vários elementos da interface que o utilizador pode seleccionar.
Cada um destes elementos encontra-se associado a uma operação ou funcionalidade do sistema. Existem elementos que possibilitam a escrita de uma letra, número, sinal de pontuação ou acento. Também
existem elementos associados a operações que permitem alterar ou formatar o texto escrito, como por
exemplo o apagar um caracter ou o introduzir uma nova linha na mensagem. O Conjunto de Selecção
contém ainda elementos que possibilitam o acesso aos mecanismos que permitem acelerar a escrita. A
predição de palavra utiliza vários elementos do Conjunto de Selecção para a apresentação das palavras
preditas em cada momento. Através da selecção de um destes elementos o utilizador pode completar
de uma forma automática a palavra que se encontra a escrever.
Para a selecção de elementos da interface a pessoa deve utilizar um método adequado às suas capacidades. Existem essencialmente dois grupos de métodos de selecção. Os Métodos de Selecção Directa e
os Métodos de Selecção Indirecta. Através de um método de Selecção Directa a pessoa consegue referenciar de uma forma directa o elemento que pretende seleccionar. Tal acontece por exemplo quando a
pessoa pressiona uma tecla do teclado. Estes métodos permitem selecções rápidas mas também são
mais exigentes em termos de destreza motora. Os métodos de Selecção Indirecta são menos exigentes
relativamente às capacidades motoras mas também são mais lentos. Um método de Selecção Indirecta
bastante utilizado é o Varrimento. No Varrimento os vários elementos do Conjunto de Selecção são
percorridos de uma forma automática. Para efectuar uma selecção a pessoa deve esperar que o elemen-
119
Figura 6-1 – Os objectos principais do sistema.
to pretendido seja percorrido pelo mecanismo varrimento. Nesse momento o elemento pode ser seleccionado através da activação de um interruptor.
O Dispositivo de Controlo é a parte da IU com a qual a pessoa interage ao nível físico. Pode consistir
num teclado, num rato ou noutro dispositivo. Este dispositivo deve encontrar-se adequado ao Método
de Selecção utilizado. Com um Dispositivo de Controlo e Método de Selecção apropriado o utilizador
pode assim seleccionar os elementos do Conjunto de Selecção necessários à construção de uma mensagem. O nosso sistema permite a utilização de vários Dispositivos de Controlo e vários Métodos de
Selecção.
O nosso sistema destina-se a apoiar a CAA para o Português Europeu. Por este motivo o Processador
dispõe de um conjunto de capacidades de edição de texto que permitem a composição de frases nesta
língua. Para a aceleração da escrita o sistema também possui mecanismos que evitam a escrita de uma
frase letra a letra. Estão disponíveis dois mecanismos para a aceleração da escrita, a predição de palavras e a expansão de abreviaturas. Para a implementação destas técnicas é necessário um conjunto de
conhecimentos sobre a língua utilizada que denominamos de Léxico.
O trabalho conjunto entre o utilizador e o sistema tem como principal objectivo a produção de uma
mensagem. Esta mensagem, que consistirá na Saída do Sistema, pode ser transmitida ao interlocutor
através de várias formas: escrita em papel, escrita num documento electrónico ou transformada em
fala através de um sintetizador. O Processador deve possibilitar ao utilizador um certo controlo sob a
forma como a mensagem é transmitida ao interlocutor.
O sistema que desenvolvemos foi implementado no sistema operativo Windows com o recurso ao
Visual C++. Os vários componentes do sistema foram implementados através de objectos C++. Em
termos conceptuais estes objectos encontram-se divididos em dois grupos: os objectos que implemen-
120
Figura 6-2 - Mensagens enviadas ao Controlador do Sistema que assinalam a ocorrência de eventos
em componentes do sistema.
tam a IU e os objectos que implementam o Processador do SACAA. Na Figura 6-1 apresentamos os
principais objectos do nosso sistema.
Estes objectos foram abordados pormenorizadamente em capítulos anteriores. A IU é composta essencialmente por três objectos, um Teclado de Ecrã, um Sintetizador de Fala e um Agente de Interface. O
Teclado de Ecrã permite a selecção de elementos do Conjunto de Selecção a pessoas com dificuldades
na utilização de um teclado de computador. Este componente possibilita a utilização de vários Dispositivos de Controlo e Métodos de Selecção. O Sintetizador de Fala quando necessário possibilita o
fornecimento de feedback sob a forma de fala ao utilizador. Também pode ser utilizado para a transmissão de uma mensagem falada ao interlocutor. Na interface do sistema foi ainda incorporado um
Agente com o objectivo de estimular a utilização do sistema por parte de crianças em fase de aprendizagem da leitura e escrita.
No Processador do nosso sistema destacamos cinco objectos: o Processador de Texto, o Preditor de
Palavras, o Dicionário, o Perfil de Utilizador e o Controlador do Sistema. O nosso sistema não dispõe
de um processador de texto próprio. A pessoa pode utilizar qualquer processador de texto ou outra
aplicação do sistema para a construção da sua mensagem. O objecto Processador de Texto representa a
aplicação externa na qual o utilizador se encontra a trabalhar. Conhecendo o texto escrito o sistema
pode tentar adivinhar, ou predizer, a palavra que o utilizador está a escrever. Caso tal aconteça a palavra pode ser completada automaticamente evitando ao utilizador a escrita dos restantes caracteres. Esta
operação é efectuada pelo Preditor de Palavras. Para o desenvolvimento de uma predição de palavras
este componente recorre ao texto existente no Processador de Texto e a um conjunto de informação
sobre a Língua Portuguesa disponibilizada pelo Dicionário. Tal como outras operações a predição de
palavras é efectuada tendo em consideração as opções armazenadas no Perfil de Utilizador.
Os vários objectos do sistema são controlados por um objecto que denominámos de Controlador do
Sistema. No arranque do sistema este objecto é responsável pela criação e inicialização dos restantes
objectos. Durante o funcionamento do sistema o Controlador do Sistema aguarda a sinalização de determinados eventos por parte destes objectos. Estes eventos são assinalados através do mecanismo de
mensagens do sistema operativo Windows. Na Figura 6-2 apresentamos as mensagens enviadas ao
Controlador do Sistema como sinal da ocorrência de um determinado evento num componente do
sistema. O Controlador do Sistema como consequência da chegada de uma mensagem pode desenca-
121
dear um conjunto de acções sobre um ou mais objectos do sistema. A manipulação dos vários objectos
é efectuada através de chamadas às suas funções públicas.
6.2 A Plataforma MFC de Suporte aos Componentes do
Sistema
Para o desenvolvimento de uma aplicação não basta a implementação dos objectos que solucionam o
problema específico. Também é necessário desenvolver componentes de suporte a estes objectos como
sejam os menus, a barras de ferramentas, as caixas de diálogo e outros. Para que não seja necessário
desenvolver estes componentes de raiz, o Visual C++ através da MFC (Microsoft Foundation Classes)
disponibiliza uma plataforma sobre a qual pode ser desenvolvida uma aplicação. Esta plataforma implementa com o recurso a objectos C++ os componentes e mecanismos utilizados pela generalidade
das aplicações. Sobre esta plataforma podem assim ser desenvolvidas diferentes aplicações com objectivos específicos. Para o desenvolvimento de uma aplicação com a MFC as classes específicas da aplicação devem ser incorporadas na plataforma disponibilizada. Para tal é necessário a compreensão desta estrutura e dos mecanismos de comunicação entre os seus componentes.
Para possibilitar o desenvolvimento de diferentes tipos de aplicação a MFC disponibiliza três modelos:
(1)Aplicação Baseada em Caixas de Diálogo (Dialog-Based); (2)Aplicação com Documento Único
(Single Document Interface); (3)Aplicação com Múltiplos Documentos (Multiple Document Interface).
O primeiro modelo destina-se ao desenvolvimento de aplicações que consistem numa sequência de
caixas de diálogo. Como exemplos deste tipo de aplicações temos os programas instaladores de outras
aplicações. Num caso limite a aplicação pode conter apenas uma caixa de diálogo. Neste caso o utilizador interagirá com a aplicação através dos vários elementos de controlo existentes na caixa de diálogo.
Figura 6-3 - A incorporação dos objectos do sistema no modelo Documento-Vista da MFC.
122
Os outros dois modelos destinam-se ao desenvolvimento de aplicações que manipulam um conjunto
de dados produzidos pelo utilizador. Estes dados são mantidos em documentos e apresentados ao utilizador através de várias formas ou vistas. Este modelo é denominado de Documento-Vista. Neste modelo a classe que implementa o componente Documento assegura o armazenamento dos dados quer
em memória quer em disco. As classes que implementam as Vistas possibilitam a apresentação destes
dados sob várias formas ao utilizador. As Vistas possuem existência gráfica e por isso são responsáveis por grande parte da interacção com o utilizador. O modelo Documento-Vista também permite
canalizar para a Vista a notificação de vários eventos ocorridos na aplicação. Por este motivo a Vista
desempenha também o papel de controlador dos vários objectos da aplicação.
As aplicações de Documento Único e de Múltiplos Documentos ambas incorporam o modelo Documento-Vista. A diferença entre estas consiste no número de documentos que se podem encontrar abertos em cada momento. Na primeira situação apenas é possível a abertura de um documento ao passo
que na segunda é possível a abertura de vários documentos em simultâneo. Em quaisquer das situações
podem encontrar-se abertas várias vistas sobre um documento. O Ms Word é o exemplo de uma aplicação que assenta sobre o modelo Documento-Vista. O Documento permite armazenar o texto escrito
e formatado pelo utilizador. Sobre cada Documento o utilizador dispõe de um conjunto de Vistas que
permitem a visualização do texto sob diferentes perspectivas, nomeadamente a Vista Normal, Vista de
Esquema On-Line, Vista de Esquema de Página e Vista de Destaques. O Ms Word é uma aplicação de
Documentos Múltiplos e por isso permite que o utilizador possua vários documentos abertos em
simultâneo.
O modelo Documento-Vista adapta-se bem ao nosso programa. Para a aplicação deste modelo podemos dividir os objectos do nosso sistema em dois grupos. Um grupo constituído pelos objectos que
armazenam e disponibilizam os dados necessários aos vários componentes do sistema. Este grupo é
composto pelo objecto Dicionario que contém o Léxico do sistema e o objecto Perfil de Utilizador que
armazena um conjunto de parâmetros que permitem adaptar o sistema às necessidades e capacidades
do utilizador. Num outro grupo encontram-se os objectos que implementam as várias funcionalidades
do SACAA, como por exemplo o Preditor de Palavras ou o Teclado de Ecrã. Estes últimos utilizam a
informação disponibilizada pelos primeiros para o desempenho das suas funções. Por exemplo o Preditor de Palavra necessita de recorrer ao Léxico e ao Perfil de Utilizador para o desenvolvimento de
uma predição de palavras adaptada ao utilizador. O Teclado de Ecrã também necessita de recorrer ao
Perfil de Utilizador para adaptar a matriz do teclado às capacidades de interacção do utilizador.
class CDocumentoSACAA : public CDocument
{
...
public:
CDicionario m_dicionario;
CPerfilUtilizador m_perfilUtilizador;
...
}
Quadro 6-1 - Definição parcial da classe CDocumentoSACAA.
123
class CVistaSACAA : public CView
{
public:
CDocumentoSACAA* GetDocument();
private:
//Preditor de palavras
CPredictorPalavras m_PreditorPalavras;
//Processador de texto
CProcessadorTexto *m_pProcessadorTexto;
//Agente de Interface
CAgenteInterface m_agentInterface;
//Sintetizador de Fala
CSintetizadorFala m_sintetizadorFala;
...
};
Quadro 6-2 - Definição parcial da classe CVistaSACAA (Controlador do Sistema)
Desta forma os objectos que armazenam e disponibilizam informação aos vários componentes do sistema foram integrados no componente Documento. Os objectos que desempenham as várias funcionalidades do sistema foram integrados no componente Vista. A Figura 6-3 ilustra a incorporação dos
vários objectos do sistema no modelo Documento-Vista da MFC. Como podemos verificar por este
esquema a Vista desempenha o papel de Controlador do Sistema.
Para os objectivos da nossa aplicação apenas é necessário manter aberto, em cada momento, um Documento e uma Vista. O Documento armazena e disponibiliza os dados necessários ao sistema, a Vista implementa as várias funcionalidades do sistema e interage com o utilizador. Por este motivo a nossa aplicação poderia basear-se no modelo de Documento Único. No entanto como este modelo é um
caso particular do modelo de Múltiplos Documentos adoptámos este último para o desenvolvimento
da nossa aplicação. Assim no futuro poderemos incorporar na aplicação outros mecanismos existentes
no modelo de Múltiplos Documentos.
Quando solicitado para a criação de uma aplicação com Múltiplos Documentos o Visual C++ gera
automaticamente uma aplicação mínima formada por um conjunto de classes C++ relacionadas entre
si. Estas classes implementam os vários mecanismos necessários ao funcionamento de uma aplicação
com múltiplos documentos, entre os quais o mecanismo Documento-Vista. Este mecanismo é implementado pela MFC através das classes CDocument e CView da MFC. Para a adaptação do modelo
Figura 6-4 - Caixa de diálogo para a aceitação do Perfil
de Utilizador.
124
Documento-Vista às necessidades de cada programa são geradas na aplicação classes derivadas das
classes CDocument e CView. Na nossa aplicação as classes derivadas foram denominadas respectivamente de CDocumentoSACAA e CVistaSACAA. A adaptação do mecanismo Documento-Vista à nossa
aplicação foi efectuada através da incorporação dos vários objectos do nosso sistema nestas classes. O
Quadro 6-1 e Quadro 6-2 apresentam definições parciais destas classes. O código apresentado ilustra
a forma como foram incorporados nas classes os vários objectos do sistema.
6.3 Inicialização do Sistema
No arranque da aplicação são criados os vários objectos da plataforma MFC entre os quais os objectos
CDocumentoSACAA e CVistaSACAA. Cada um destes objectos é depois responsável pela criação dos
seus objectos constituintes. O objecto CDocumentoSACAA é criado em primeiro lugar. Depois deste
objecto se encontrar inicializado é então criado o objecto CVistaSACAA. Os objectos constituintes
deste último objecto são inicializados com o recurso aos dados disponibilizados pelo objecto CDocu-
Figura 6-5 - Um conteúdo possível para o ficheiro de configuração do sistema.
125
Figura 6-6 - Caixa de diálogo que permite a configuração das opções principais do sistema.
mentoSACAA. Para aceder a estes dados o objecto CVistaSACAA utiliza a função GetDocument() fornecida pela MFC. Esta função devolve um apontador para o objecto CDocumentoSACAA através do
qual é depois possível consultar a informação contida nos objectos CDicionario e CPerfilUtilizador.
Para a inicialização dos seus objectos constituintes o objecto CDocumentoSACAA solicita a escolha de
um perfil de utilizador. Esta operação é efectuada através da caixa de diálogo que se apresenta na
Figura 6-4. Esta caixa de diálogo também permite a criação de um novo perfil de utilizador. A lista
com os perfis de utilizadores conhecidos pelo sistema encontra-se armazenada num ficheiro de texto
denominado utils. Este ficheiro, tal como todos os outros encontra-se localizado na pasta que contém a
instalação do sistema. O caminho para esta pasta é na versão portuguesa do Windows 98
C:\Programas\SNRIPD-INESC-ESTIG-CPCB\Preditor Palavras. Cada perfil de utilizador encontra-se
associado a quatro ficheiros que contêm informação que permite adaptar o sistema a um utilizador em
particular. Dois destes ficheiros contêm informação estatística sobre a utilização de palavras e pares de
palavras naquele perfil de utilizador. Um terceiro ficheiro contém as abreviaturas utilizadas no perfil
de utilizador. Estes dados juntamente com o conjunto de informação estatística sobre a Língua Portuguesa são carregados para o objecto CDicionario.
O quarto ficheiro associado a um perfil de utilizador contém um conjunto de parâmetros que permite
configurar os vários componentes do sistema. Na Figura 6-5 apresentamos um conteúdo possível para
este ficheiro. Este ficheiro contém um conjunto de valores para cada parâmetro do perfil de utilizador.
Tentámos atribuir designações elucidativas a cada um dos parâmetros. Por exemplo os primeiros dois
parâmetros do ficheiro permitem definir a posição inicial da aplicação no ecrã do computador. Estes
parâmetros podem ser alterados através da edição directa do ficheiro ou então através das caixas de
diálogo apresentadas na Figura 6-6 e Figura 6-7. Os valores para os vários parâmetros são carregados
126
Figura 6-7 - Caixa de diálogo para a configuração das opções avançadas
da predição.
para o objecto CPerfilUtilizador. Este objecto disponibiliza aos outros objectos do sistema funções
membro que permitem a consulta destes parâmetros.
Após a inicialização do objecto CDocumentoSACAA a plataforma MFC da aplicação cria o objecto
CVistaSACAA e este por sua vez os seus objectos constituintes. Estes objectos são inicializados com o
recurso à informação contida no objecto CDocumentoSACAA.
6.4 Interacção entre os Componentes do Sistema
Depois de todos os objectos do sistema se encontrarem inicializados o objecto CVistaSACAA, ou seja
o Controlador do Sistema, fica a aguardar a sinalização de eventos por parte dos outros componentes
do sistema. Como referimos anteriormente estes eventos são assinalados através de mensagens do
sistema operativo Windows. A chegada de uma destas mensagens ao objecto CVistaSACAA provoca a
chamada da rotina de tratamento associada. Em cada uma destas rotinas é desencadeado um conjunto
de operações que responde ao evento assinalado. Como exemplo a Figura 6-8 a ilustra a chegada da
mensagem WM_TECLA_PRESSIONADA ao objecto CVistaSACAA. Esta mensagem é enviada pelo
objecto CProcessadorTexto sempre que o utilizador pressiona uma tecla.
127
void CVistaSACAA::TratarTeclaPressionada(WPARAM wParam, LPARAM lParam){
...
int codigoTecla = (int) wParam;
//Verifica se foi pressionada uma tecla para completar uma palavra predita
int numeroPalavraPredita;
if( TeclaParaCompletar( codigoTecla, numeroPalavraPredita ) ){
CString palavra = ObterPalavraPredita(numeroPalavraPredita );
CompletarPalavra( palavra );
}
//Verifica se foi pressionada uma tecla para expandir uma abreviatura
if( TeclaParaExpandirAbreviatura( codigoTecla ) ){
CString expansao = ObterExpansaoAbreviatura();
ExpandirAbbreviatura( expansao );
}
//Verifica se foi pressionada a tecla para sintetizar a palavra escrita
if( TeclaParaSintetizarPalavra( codigoTecla ) )
SintetizarPalavra();
//Verifica se foi pressionada a tecla para sintetizar a frase escrita no
//processador de texto
if( TeclaParaSintetizarFrase( codigoTecla ) )
SintetizarFrase();
//Como foi pressionada uma tecla e iniciada a contagem do tempo para
//uma nova predicao
IniciarTempoPredicao();
}
Quadro 6-3 - Rotina de tratamento da mensagem WM_TECLA_PRESSIONADA.
O Quadro 6-3 apresenta de uma forma simplificada a rotina que efectua o tratamento da mensagem
WM_TECLA_PRESSIONADA. Junto a esta mensagem é enviado também o código virtual da tecla
pressionada. Este código permite referenciar ao nível das aplicações cada uma das teclas de um teclado. Para o tratamento da mensagem a rotina verifica se a tecla pressionada se encontra associada a
alguma função especial do SACAA. Se tal acontecer a rotina efectua essa função. Poderá tratar-se de
uma tecla para completar uma palavra predita, da tecla para expandir uma abreviatura ou da tecla para
efectuar a síntese em fala da palavra ou frase escrita no processador de texto. No final da função, e
para qualquer tecla pressionada, é reiniciado um temporizar que findo um tempo configurado provoca
uma nova predição de palavras. Este temporizador evita a execução de predições de palavras desnecessárias. Através do reinicio desta contagem de tempo o sistema adia consecutivamente a execução
de uma predição de palavras até o utilizador efectuar uma pausa na escrita. Neste momento o sistema
considera que o utilizador está a precisar de apoio e por isso desencadeia esta operação. Tal é efectuado através da chamada da função EfectuarPredicao() que apresentamos no Quadro 6-4.
A função CVistaSACAA::EfectuarPredicao começa por obter um apontador para o Documento asso-
Figura 6-8 - Envio da mensagem WM_TECLA_PRESSIONADA ao objecto
CVistaSACAA.
128
void CVistaSACAA::EfectuarPredicao(){
//Obtem um apontador para o documento
CPreditorPalavrasDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//Obtem o prefixo e a palavra anterior do processador de texto
CString prefixo = m_pProcessadorTexto ->ObterPrefixo();
CString palavraAnterior = m_pProcessadorTexto ->ObterPalavraAnterior();
//Efectua a predicao de palavras
palavrasPreditas.SetSize( NUM_MAX_PALAVRAS_PREDITAS );
int m_nPalavrasPreditas = m_PreditorPalavras.EfectuarPredicao( pDoc>m_dicionario, pDoc->m_perfilUtilizador, palavraAnterior, prefixo,
NUM_MAX_PALAVRAS_PREDITAS, m_palavrasPreditas );
//Anima o agente dependendo do exito da operacao
if( pDoc -> m_perfilUtilizador.ObterAgenteActivo() )
if(m_nPalavrasPreditas == 0 ){
//Animação Agente: Não há palavras
m_agenteInterface.EfectuarAnimacao(L"Confused");
m_agenteInterface.EfectuarAnimacao(L"RestPose");
}
else{
//Animação Agente: Há palavras
m_agenteInterface.EfectuarAnimacao(L"Acknowledge");
}
//A janela da vista é invalidada para que as novas palavra preditas
//sejam apresentadas ao utilizador
Invalidate(TRUE);
}
Quadro 6-4 - A função que desencadeia uma predição de palavras.
ciado à Vista. Neste documento encontram-se armazenados como já referimos os objectos CDicionario e CPerfilUtilizador. Estes objectos contêm parte da informação necessária ao processo de predição
de palavras. Para esta operação também é necessária a obtenção da palavra anterior e do prefixo escrito pelo utilizador no processador de texto. Depois de adquiridos estes dados é chamada a função CPreditorPalavras::EfectuarPredição. Esta função irá devolver um vector de palavras e as respectivas
classificações no processo de predição de palavras. Estas palavras são armazenadas numa variável
membro. Dependendo do resultado da predição de palavras também é solicitada ao agente de interface
uma determinada animação. No final da função é provocada a actualização da janela associada ao
objecto CVistaSACAA através da chamada da função Invalidate(). Nesta actualização as novas palavras preditas serão apresentadas ao utilizador nas teclas apropriadas do teclado de ecrã.
129
130
7. Testes, Conclusões e Trabalho Futuro
7.1 Testes Qualitativos do Sistema
Os testes qualitativos da primeira versão do nosso sistema foram desenvolvidos no Centro de Paralisia
Cerebral de Beja com o apoio das professoras e outros técnicos nas várias salas de aula.
As crianças participantes foram avaliadas para a utilização destas tecnologias e em seguida iniciaram
os primeiros contactos com o sistema. Para a obtenção de algum feedback por parte das professoras
propusemos o desenvolvimento de actividades livres utilizando o sistema. Para o registo deste primeiro contacto efectuámos um questionário a duas professoras e a uma engenheira informática pertencentes à equipa de avaliação do centro. Estes questionários encontram-se preenchidos no Apêndice H.
Apesar da pouco expressividade numérica dos questionários pensámos ser útil efectuar uma pequena
apreciação das respostas obtidas. A maioria achou que o preditor era mais útil para a aprendizagem da
escrita e da leitura em detrimento da aceleração da escrita. Também foi considerado que o preditor
continha um número razoável de palavras e que estas eram apropriadas para as crianças.
Foram indicadas como as opções de interacção mais importantes a possibilidade de alteração do número de palavras e a possibilidade de alteração das teclas para completar as palavras. Como menos importantes foram indicadas a possibilidade de activação e desactivação do agente animado, alteração
das coordenadas iniciais da janela do preditor e a configuração individual de cada uma das opções de
interacção para cada aluno.
Relativamente às opções sobre a predição de palavras os técnicos também foram questionados sobre
quais as opções mais importantes. Foi indicada como mais importante a capacidade do preditor aprender novas palavras através do utilizador. Como menos importante foi indicada a possibilidade de alteração do tempo ao fim do qual o preditor inicia uma nova predição.
Como o sintetizador de fala DIXI+ foi utilizado em conjunção com o preditor também colocámos no
questionário algumas questões relativas à utilização deste sintetizador. Nestas questões os técnicos
indicaram que no trabalho com os alunos, era mais importante a síntese de palavras, seguida da síntese
de frases, depois dos parágrafos e finalmente a síntese de texto seleccionado. Também indicaram como principais campos de aplicação do sintetizador a comunicação alternativa e o apoio na escrita livre.
A qualidade do sintetizador foi considerada adequada para a comunicação alternativa.
Finalmente quanto a melhorias a introduzir no preditor de palavras os técnicos indicaram como prioritária a disponibilização de dicionários gerais adaptados a vários grupos etários: crianças, jovens e
adultos. Também foi considerado importante a possibilidade de correcção de palavras no dicionário. A
131
apresentação das palavras preditas na horizontal também foi apontada como uma das principais melhorias a introduzir no futuro. A primeira versão do sistema apenas permitia a escrita através do teclado do computador. Por este motivo os técnicos referiram que seria importante a escrita através de outros dispositivos alternativos. As melhorias relativas à interacção do agente animado, como por exemplo o desenvolvimento de novas animações e este falar para as crianças, foram consideradas menos
urgentes.
A primeira versão do nosso sistema também foi também avaliada pela Unidade Acesso do Ministério
da Ciência e Tecnologia. A equipa desta unidade considerou que o sistema dispunha de um conjunto
de características que permitia o acesso por parte de pessoas com um variado conjunto de dificuldades.
Como melhoria foi indicada a possibilidade de reposicionamento automático da janela tendo em consideração a localização do cursor de texto.
O sistema foi disponibilizado através da Internet e assegurado algum apoio aos utilizadores via e-mail.
Através destes contactos recebemos respostas bastante positivas e corrigimos alguns problemas no
sistema.
A segunda versão do nosso sistema já incorpora muitas das funcionalidades solicitadas, nomeadamente um teclado de ecrã com um conjunto de características que permite o acesso por parte de utilizadores com grandes dificuldades motoras, a possibilidade de apresentação das palavras preditas na horizontal e o reposicionamento desta lista de palavras tendo em consideração a localização do cursor de
texto.
7.2 Testes Quantitativos do Sistema
No futuro iremos desenvolver alguns testes para a obtenção de resultados quantitativos como a rapidez
e quantidade de erros na produção de escrita. No entanto estes testes terão de ser realizados com alguns cuidados especiais. Os utilizadores destes sistemas apresentam entre si grandes diferenças ao
nível das suas capacidades. Por este motivo determinadas características do sistema poderão beneficiar
a prestação de um utilizador e prejudicar a prestação de outro. As dificuldades particulares de um determinado utilizador poderão mascarar inclusivamente os benefícios de uma certa funcionalidade do
sistema. Para a avaliação de cada característica será assim necessária uma selecção criteriosa dos participantes no teste. A forma como devem ser efectuados estes testes é actualmente tema de investigação. Uma das questões importantes relativamente a este tema diz respeito à validade e benefícios da
participação de pessoas sem quaisquer dificuldades físicas ou cognitivas na realização destes testes
(Higginbotham, 1995)(Higginbotham e Bedrosian, 1995). Alguma investigação também aponta para a
necessidade de estudos de longo prazo, dado que os utilizadores destes sistemas requerem tempos de
treino mais prolongados (Newell et al., 1992).
132
Como adiámos de momento a realização deste tipo de testes decidimos desenvolver um simulador que
se comporta como um utilizador perfeito do sistema. Este utilizador virtual escreve os vários caracteres de um texto fornecido e por cada caracter escrito consulta a lista de palavras preditas. Ao encontrar
a palavra pretendida completa-a imediatamente e passa para a seguinte. Na realização de cada simulação são considerados os valores dos parâmetros do sistema com influência na predição de palavras.
Entre estes os vários factores de predição e o tamanho da lista de palavras preditas. Desta forma conseguimos obter para cada parametrização específica a eficácia máxima do sistema. Dependendo das
dificuldades do utilizador real serão verificadas maiores ou menores baixas nos valores obtidos. A
Figura 7-1 apresenta a caixa de diálogo que permite o acesso ao Simulador de Predição de Palavras.
Para a medição da eficácia do sistema o simulador fornece um conjunto de indicadores que actualiza
ao longo da simulação. São estes o número de caracteres escritos pelo utilizador, a percentagem de
caracteres poupados, o número de predições com sucesso, a posição média das palavras preditas na
lista e o número de caracteres necessários para uma predição correcta.
O texto utilizado para a simulação pode ser fornecido através do clipboard ou através de um ficheiro
de texto. Como sabemos o texto escrito num computador é composto por várias palavras, espaços
entre estas, sinais de pontuação e outros caracteres necessários à formatação do texto como por exemplo a mudança de linha. Através deste simulador pretendemos determinar a capacidade de predição
das palavras do sistema independentemente da quantidade de sinais de pontuação, espaços entre palavras, tabulações ou mudanças de linha envolvidas na formatação do texto. Por este motivo na simulação da escrita de um texto apenas considerámos a escrita das várias palavras e a introdução de um
único espaço separador. O simulador não considera espaços extra que existam entre as palavras, sinais
Figura 7-1 - Caixa de diálogo do Simulador de Predição de Palavras.
133
Nº de Caracteres
Nº de Palavras
Nº de Linhas
Textos de Jovem
29.196
4.554
1.085
E-mail de Adulto
124.435
20.409
2.132
Textos Diário Minho
491.461
75.805
7.774
Quadro 7-1 - Dimensões dos textos utilizados nas simulações de predição de palavras (obtidas
com o comando wc do unix).
de pontuação, ou mudanças de linha, ou outros caracteres.
Para determinarmos a eficácia do nosso sistema relativamente à predição de palavras e para estudarmos a influência dos vários factores de predição neste processo desenvolvemos um conjunto de simulações. Nestas simulações utilizámos três compilações de textos provenientes de três fontes distintas:
(1) textos escolares desenvolvidos por um jovem com necessidades especiais; (2) textos de e-mail de
um dos autores deste trabalho; (3) textos provenientes de várias edições do Diário do Minho. No
Quadro 7-1 apresentamos alguns dados relativos às dimensões das três colecções de textos utilizados
nas simulações.
Começámos por estudar a influência de cada factor de predição na eficácia do sistema. Para cada uma
das três colecções de texto desenvolvemos um conjunto de simulações nas quais introduzimos sucessivamente os vários factores de predição. A introdução de um factor nas várias simulações foi efectuada através da passagem abrupta do seu coeficiente de ponderação de 0% para 100%. Nestas simulações foi utilizada uma lista de palavras preditas com 5 palavras. No Quadro 7-2 apresentamos o conjunto de factores de predição utilizados em cada grupo de simulações. Por exemplo nas simulações
com o conjunto de factores FP1 apenas é considerada a probabilidade da palavra em termos gerais e
com um coeficiente de importância de 100%. Nas simulações com o conjunto de factores FP2 é acrescentado a este factor, que permanece a 100%, a probabilidade condicional da palavra também a 100%,
e assim sucessivamente ao longo dos vários conjunto de factores FP3, FP4 e FP5. No Quadro 7-2
Frequência da Palavra
Frequência Condicional
da Palavra
Frequência Condicional
da Categoria Gramatical
Frequência da Palavra
para o Utilizador
Factores de
Predição 1
(FP1)
•
Factores de
Predição 2
(FP2)
•
•
Factores de
Predição 3
(FP3)
•
•
Factores de
Predição 4
(FP4)
•
•
Factores de
Predição 5
(FP5)
•
•
•
•
Frequência Condicional
da Palavra para o Utilizador
•
•
Quadro 7-2 - Os diferentes conjuntos de Factores de Predição utilizados nas simulações.
134
Figura 7-2 - Percentagem de caracteres poupados
ao longo do conjunto de simulações onde cada
factor foi introduzido de forma abrupta (100%).
Figura 7-3 - Média dos caracteres necessários para
a predição ao longo do conjunto de simulações
onde cada factor foi introduzido de forma abrupta
(100%).
encontram-se assinalados os factores presentes em cada conjunto. Para cada um destes conjuntos de
factores foi simulada a escrita de cada uma das três colecções de textos. Nos gráficos da Figura 7-2 e
Figura 7-3 apresentamos as percentagens de caracteres poupados e o número de caracteres necessários
nas predições com sucesso, obtidos ao longo das várias simulações. Podemos verificar através destes
gráficos que à excepção Frequência Condicional das Categorias Gramaticais a introdução dos vários
factores se traduziu em melhorias em ambos os indicadores. A percentagem de caracteres poupados
subiu e a média de caracteres necessários para uma predição com sucesso baixou. Também verificámos melhorias na percentagem de predições efectuadas com sucesso. O gráfico da Figura 7-4 ilustra
este facto. Ao verificarmos que a participação do factor Frequência Condicional das Categorias Gramaticais prejudicava a eficácia do sistema decidimos não o incorporar nas simulações seguintes. Pensamos que esta situação resulta do facto de não termos atribuído classes gramaticais às palavras que
possuem a mesma forma gráfica mas significados diferentes. Assim, quando este factor é utilizado na
predição, estas palavras são sistematicamente discriminadas em relação às que se encontram classificadas quanto à categoria gramatical. Esta discriminação, que introduzimos para simplificar a abordagem do problema, traduziu-se num decréscimo da performance do sistema. No futuro a melhoria desta
abordagem é como já referimos um dos pontos prioritários.
Para o conjunto de factores FP1, FP2 e FP3 a percentagem de poupança de caracteres foi sempre superior para os textos do Diário do Minho. Tal deve-se ao facto de termos utilizado textos semelhantes na
construção do Léxico do sistema (textos do Público). No entanto quando foram incorporados no processo de predição factores de adaptação ao utilizador (FP4 e FP5) obtivemos percentagens de poupança de caracteres superiores para as outras colecções de textos. Este resultado mostra que o preditor de
palavras conseguiu adaptar-se ao estilo de escrita do utilizador. Os outros indicadores também seguiram a mesma tendência da percentagem de caracteres poupados. Para as mesmas colecções de texto e
com o conjunto de factores FP5 o simulador indicou que eram necessários 1.5, 1.5 e 1.7 caracteres nas
135
Figura 7-4 - Percentagens de predições com
sucesso ao longo do conjunto de simulações
onde cada factor foi introduzido de forma abrupta (100%).
Figura 7-5 - Percentagem de caracteres poupados ao
longo de simulações nas quais cada factor de predição foi introduzido gradualmente (0%-100%).
predições correctas. Nas mesmas condições a percentagem de predições com sucesso foram respectivamente 32%, 33% e 29%.
Com o conjunto de factores FP5 foram obtidas as melhores percentagens de poupança de caracteres,
que foram de 47%, 51% e 48% para as três fontes de texto, respectivamente. Estes valores equiparamse aos valores reportados para sistemas semelhantes.
O simulador também fornece em cada simulação a posição média das palavras preditas. Ao longo de
todas as simulações este indicador rondou o valor 1.5, ou seja um pouco acima do meio da lista (2.5).
A introdução dos vários factores no conjunto de simulações anterior foi efectuada através da passagem
abrupta do seu coeficiente de participação de 0% para 100%. Por este motivo decidimos efectuar um
conjunto de simulações, semelhantes às anteriores, mas agora com a introdução gradual de cada factor
no processo de predição. Ao longo de várias simulações variámos a importância de cada factor desde
0% até 100%. Depois de estudado, cada factor continuava a participar no processo de predição mas
com um coeficiente de importância fixado em 50%. Assim o factor estudado em cada momento podia
partir de uma situação onde tinha menos importância que todos os outros factores (0%) até a uma situação final onde possuía mais importância que os outros (100%). Tal como sucedeu no estudo anterior, o factor Frequência Condicional das Categorias Gramaticais foi colocado com um coeficiente de
importância de 0% depois de estudado pois prejudicava a eficácia do sistema. Nestas simulações apenas utilizámos a colecção de textos do jovem com necessidades especiais. No gráfico da Figura 7-5
apresentamos a percentagem de caracteres poupados nestas simulações. Nesta simulações verificámos
que a variação da importância de um factor de predição não introduziu grandes variações nos vários
indicadores do simulador, nomeadamente na percentagem de caracteres poupados. Os valores obtidos
para os indicadores do simulador, utilizando um coeficiente de participação de 2% eram desde logo
bastante aproximados dos valores obtidos com um coeficiente de 100%. Estes resultados mostram que
a ponderação dos vários factores não introduz grandes alterações na eficácia do sistema, basta sim-
136
Figura 7-6 - Percentagem de caracteres poupados
utilizando uma lista de 5 e 10 palavras utilizando o
conjunto de factores FP5.
Figura 7-7 - Percentagem de predições com sucesso
utilizando uma lista de 5 e 10 palavras e o conjunto
de factores FP5.
plesmente introduzir o factor no processo de predição. Os melhores resultados foram obtidos com o
conjunto de factores FP5.
Para estudarmos a influência do comprimento da lista de palavras decidimos comparar os indicadores
fornecidos pelo simulador quando é utilizada uma lista com 5 e 10 palavras. Os vários indicadores
fornecidos pelo simulador encontram-se apresentados nos gráficos da Figura 7-6, Figura 7-7 e Figura
7-8. Como podemos verificar pelos gráficos a introdução de uma lista com mais palavras permite melhorar a percentagem de caracteres poupados e a percentagem de predições com sucesso. No entanto o
indicador posição média das palavras preditas na lista piora. Este resultado era previsível uma vez que
nesta situação a lista de palavras preditas possui capacidade para 10 palavras. Por este motivo as palavras preditas de forma correcta irão distribuir-se ao longo desta lista. Ainda assim a posição média das
palavras correctamente preditas, que é de 2.5, 2.6 e 2.7, para as três fontes de textos, respectivamente,
situou-se bastante acima da posição média da lista (5).
Apesar das melhorias obtidas nos indicadores anteriores a inspecção de uma lista de maiores dimensões demora mais tempo e pode assim anular os benefícios obtidos, tal como tem vindo a ser referido
em diversos estudos. Apesar deste resultado os benefícios proporcionados por uma lista de palavras
preditas mais longa podem ser úteis para a aprendizagem da leitura e da escrita, pois nestas actividades
o tempo despendido na inspecção da lista de palavras preditas não é um factor critico.
Figura 7-8 - Posição média das palavras preditas
utilizando uma lista com 5 e 10 palavras e o conjunto
de factores FP5.
137
7.3 Conclusões e Trabalho Futuro
Foi desenvolvido um SACAA para o Português Europeu, que denominámos de Eugénio – O Génio
das
Palavras.
A
versão
1.0
do
Eugénio
está
disponível
na
Internet,
em
http://www.l2f.inesc.pt/~lco/eugenio. Muito brevemente disponibilizaremos também a versão apresentada nesta tese, o Eugénio 2.0. Ambas as versões possuem programas instaladores que automatizam o
processo de instalação. Para cada uma destas versões também desenvolvemos manuais de utilização.
Para esta última versão do sistema disponibilizámos o manual de utilização em vários formatos, html,
doc e pdf. A leitura deste manual pode assim ser efectuada através do programa considerado mais adequado para o utilizador. A versão doc encontra-se no Apêndice I. Desta forma tentámos criar um conjunto de condições mínimas para que o nosso sistema possa ser utilizado com sucesso por um número
de pessoas cada vez maior. Os contactos que temos recebido dos utilizadores têm sido muito positivos
e gratificantes.
O sistema desenvolvido é constituído por vários componentes distintos, nomeadamente o Preditor de
Palavras, o Teclado de Ecrã, o Sintetizador de Fala, o Agente de Software e o Processador de Texto.
Alguns destes componentes representam internamente determinados programas externos ao sistema
como é o caso do Sintetizador de Fala, do Agente de Software e o Processador de Texto. Através destes componentes os programas externos são assim adaptados às necessidades do sistema.
Tentámos desenvolver um SACAA para o Português Europeu equiparável aos sistemas existentes para
outras línguas. Por isso foram utilizadas técnicas estado de arte no desenvolvimento dos vários componentes do sistema. O Preditor de Palavras encontra-se dotado de um modelo de língua estatístico.
Com base num conjunto de factores estatísticos, sobre a Língua Portuguesa, e no contexto de escrita
do utilizador, este componente consegue inferir em cada momento, um conjunto de palavras prováveis
que de seguida propõe ao utilizador. No caso de uma destas palavras ser aquela o utilizador pretende
escrever, o sistema pode completá-la automaticamente poupando ao utilizador a escrita dos restantes
caracteres. O mecanismo de predição de palavras pode ser adaptado ao utilizador. Para além de permitir especificar a importância de cada factor na predição de palavras o nosso sistema possui ainda um
mecanismo que actualiza continuamente o conjunto de informação estatística através da escrita de
cada utilizador. Desta forma o preditor de palavras consegue tornar-se mais eficaz com o passar do
tempo. Para medir a eficácia do preditor de palavras desenvolvemos um componente que simula um
utilizador perfeito do nosso sistema. Com determinados conjuntos de factores este componente forneceu-nos resultados comparáveis aos melhores sistemas desenvolvidos para outras línguas, 51%.
Como complemento à predição de palavras também iniciámos o desenvolvimento de um componente
que permite a expansão de abreviaturas. Através deste mecanismo o utilizador pode escrever uma palavra ou frase mediante a utilização de uma abreviatura.
138
O componente Processador de Texto isola os vários componentes do sistema das diferenças existentes
nos vários mecanismos de interacção com os processadores de texto externos. Este componente dispõe
de um mecanismo básico que assegura a interacção com qualquer aplicação externa mas também a
introdução de mecanismos de interacção, mais ricos, com determinadas aplicações específicas, como
aconteceu com o processador de texto Ms Word.
A interacção com o utilizador também foi um aspecto bastante cuidado ao longo do desenvolvimento
deste sistema. Para pessoas com dificuldades em utilizar um teclado standard de computador o nosso
sistema dispõe de um Teclado de Ecrã. Este componente apresenta no ecrã uma matriz com os vários
caracteres disponíveis. A escrita de um dos caracteres no processador de texto pode ser efectuada através de um clique do rato no elemento da matriz com caracter pretendido ou então pode ser solicitado
ao sistema, o varrimento automático dos vários elementos. Nesta modalidade o utilizador deverá pressionar um interruptor quando o elemento com o caracter pretendido estiver a ser percorrido. Nesta
altura o caracter será escrito no processador de texto. Para uma adaptação do sistema às necessidades e
capacidades do utilizador é possível configurar várias características do teclado de ecrã. Podem ser
alteradas algumas características visuais da matriz, como a localização das palavras preditas, a disposição dos vários caracteres, o tipo de letra, o seu tamanho, as cores do fundo e dos caracteres. Mas
também outros aspectos, como por exemplo a forma como os vários elementos da matriz são varridos
quando este método de selecção é utilizado.
Através da introdução de um Agente de Software, Ms Agent, pretendemos aumentar a capacidade de
interacção do sistema com crianças. Como estudos recentes apontam que a predição de palavras também pode ser utilizada como uma ferramenta de apoio à aprendizagem da leitura e da escrita, pretendemos através deste agente explorar melhor este aspecto. A interacção desta agente com o utilizador é
no entanto ainda um pouco reduzida. Apenas efectua algumas animações de modo a fornecer algum
feedback ao utilizador.
Este sistema também permite a utilização de um Sintetizador de Fala para o apoio à CAA. O utilizador
pode seleccionar o sintetizador mais adequado de entre os sintetizadores SAPI disponíveis no sistema
operativo. Em particular pode ser utilizado o sintetizador DIXI+ para o Português Europeu. O sintetizador pode ser utilizado durante o processo de escrita, para a pessoa poder ouvir uma das palavras da
lista de palavras preditas, ou o caracter associado a uma das teclas do teclado de ecrã, mas também
pode ser utilizado depois da mensagem construída para a sua transmissão ao interlocutor, ou para o
próprio verificar a validade do texto escrito.
Alguns destes componentes encontram-se mais desenvolvidos que outros. Mas como o sistema foi
construído de uma forma modular vamos poder continuar a introduzir melhorias.
No futuro próximo iremos continuar os testes do sistema e corrigir alguns problemas que sejam detectados entretanto. Também seria importante a realização de testes quantitativos formais com utilizadores reais. Entre as melhorias mais próximas encontra-se também a forma como utilizámos o factor
139
categorial gramatical no processo de predição. Para que este factor possa contribuir de uma forma
positiva para a predição de palavras teremos de atribuir uma categoria gramatical ou várias categorias
gramaticais possíveis a cada palavra do léxico. O sistema terá de lidar com a possibilidade de uma
representação gráfica de uma palavra estar associada a várias categorias gramaticais para assim conseguir efectuar predições gramaticalmente mais correctas. O correcto funcionamento deste factor também deverá introduzir um aumento na taxa de poupança de caracteres entre 3% e 5%.
Verificámos que a introdução dos vários factores no processo de predição influenciou positivamente a
eficácia do sistema à excepção do factor categoria gramatical pelos motivos já discutidos. Também
observámos que alteração da importância de cada factor no processo de predição não introduziu alterações significativas na eficácia do sistema. Nos testes realizados obtivemos praticamente os mesmos
resultados de performance com o factor a 1% e a 100%. No entanto a relação entre os vários factores
de predição e a optimização dos coeficientes de ponderação de cada um destes também será um aspecto a estudar no futuro.
Também pensamos introduzir novas técnicas de predição de palavras no nosso sistema. Estas técnicas
deverão estudar alternativas diferentes para o Algoritmo de Predição e para o Léxico a utilizar. Podemos introduzir novos algoritmos de predição que utilizem outros factores estatísticos sobre Língua
Portuguesa ou que possibilitem a utilização de um maior contexto de escrita no processo de predição.
A introdução de regras gramaticais neste processo também poderá ser um ponto a estudar. Para a implementação destes algoritmos podem ser experimentadas outras técnicas entre as quais as redes neuronais ou o reconhecimento de padrões. A constituição do léxico, tendo em consideração o algoritmo
de predição utilizado, também deve ser estudado. Podem também ser desenvolvidos Léxicos adaptados a determinados grupos etários ou estilos de escrita.
Também podem ser explorados novos mecanismos que possibilitem a interacção do sistema com as
aplicações externas. O MSAA poderá ser um mecanismo a utilizar de uma forma mais extensa, nesta
interacção.
A capacidade de interacção do agente de software também deve ser melhorada para ser fornecido um
maior nível de feedback ao utilizador. Podem por exemplo ser utilizadas novas animações para traduzir o grau de confiança do sistema na predição efectuada.
Numa outra fase também seria interessante colocar os vários componentes do sistema a funcionar em
ambientes portáteis de modo a permitir um apoio mais eficaz à conversação.
140
Bibliografia
BAILEY, Robert W. Human Performance Engeneering. 3ª ed. Prentice-Hall. New Jersey. 1995.
BAKER, Bruce R. Semantic Compactation: An Approach to a Formal Definition. Proceedings of
1994 Minspeak Conference. 1994.
BAKER, Bruce R. What Words Produce Pictures. Proceedings of 1996 Minspeak Conference. 1996.
BROCKSCHMIDT, Kraig. What OLE Is Really About. OLE Team, Microsoft Corporation. Julho,
1996.
CLARK, David, Brenda L. Matteson. OLE Automation Programmer’s Reference. Microsoft Press.
1996.
COOK, Albert M. e Susan M. Hussey. Assistive Technologies: Principles And Practice. Mosby. Missouri. 1995.
CORDEIRO, Maria Eulália A R. S. A Utilização das Novas Tecnologias de Informação pela Pessoa
Portadora de Deficiência Motora Severa: Construção de um Modelo de Avaliação. Tese de Mestrado, Faculdade de Motricidade Humana, Universidade Técnica de Lisboa. Lisboa.1994.
FERREIRA, Maria C. R., Maria M. Nunes da Ponte, Luís M. F. Azevedo e Maria R Carvalho. Inovação Curricular na Implementação de Meios Alternativos de Comunicação em Crianças com Deficiência Neuromotora Grave. Relatório do Projecto PCED/C/DCI/15/91, Junta Nacional de Investigação Científica, Instituto de Inovação Educacional. Lisboa. 1995.
GARCIA, Luis. Desenvolvimento de uma Disposição de Teclas para Acelerar a Escrita de Textos
Formais Utilizando o Varrimento no Formato Linha-Coluna. 4º Workshop em Engenharia Biomédica e Inteligência Artificial BIOMED'99 - Mestrado Engenharia Electrotécnica do Instituto Superior
Técnico. 1999.
HART-DAVIS, Guy. Word 97 Macro & VBA Handbook. Sybex. 1997.
HIGGINBOTHAM, D. Jeffery. Evaluation of Keystroke Savings across Five Assistive Communication Technologies. AAC Augmentative Alternative Communication. 1992.
HIGGINBOTHAM, D. Jeffery, Jan L. Bedrosian. Subject Selection in AAC Research: Decision
Points. AAC Augmentative and Alternative Communication 1995. ISAAC. Março, 1995.
141
HIGGINBOTHAM, D. Jeffery. Use of Nondisabled Sujects in AAC Research: Confessions of a Research Infidel. AAC Augmentative and Alternative Communication 1995. ISAAC. Março, 1995.
HUTCHENS, Jason L. Natural Language Grammatical Inference. Tese Dept. of E & E Engineering,
University of Western Australia. 1995.
KLUND, Jamie, Mark Novak If Word Prediction Can Help, Wich Program Do You Choose?. Trace
Research & Development Center. 2001. http://trace.wisc.edu/docs/wordprediction2001/ (01/2003).
KODA, Tomoko, Patie Maes. Agents with Faces: The Effects of Personification of Agents.
Proceedings of HCI'96. Londres. 1996.
KOESTER, Heidi Horstmann, Levine, Simon P. Learning and Performance of Able-Bodied
Individuals Using Scanning Systems with and without Word Prediction. Assistive Technologies
1994. RESNA. 1994.
KOESTER, Heidi Horstmann, Levine, Simon P. Validating Quantitative Models of User
Performance with Word Prediction Systems. RESNA 95. Junho, 1995.
KOESTER, Heidi Horstmann, Levine, Simon P. Effect of a Word Prediction Feature on User
Performance. AAC Augmentative and Alternative Communication 1996. ISAAC. Setembro, 1996.
KOESTER, Heidi Horstmann, Levine, Simon P. Keystroke-Level Models for User Performance with
Word Prediction. AAC Augmentative and Alternative Communication 1997. ISAAC. Dezembro,
1997.
KOESTER, Heidi Horstmann, Levine, Simon P. Model Simulation of User Performance with Word
Prediction. AAC Augmentative and Alternative Communication 1998. ISAAC. Março, 1998.
LESHER, Gregory W., Bryan J. Moulton, Jefferey Higginbotham, Brenna Alsofrom. Limits os
Human Word Prediction Performance. CSUN 2002, California State University, Northridge. 2002.
LESHER, Gregory W., Bryan Moulton, Gerard Rinkus, Jeffery Higginbotham. A Universal Logging
Format for Augmentative Communication. CSNU 2000. 2000.
LIEBERMAN, Henry. Integrating User Interface Agents with Conventional Applications.
Proceedings of the ACM Conference on Intelligent User Interfaces. San Francisco. 1998.
MAGNUSON, Tina. Word Prediction as Linguistic Support for Individuals with Reading and
Writing Difficulties. Proceedings of the 2nd TIDE Congress. IOS Press, Paris, 1995, 320-323.
142
MORRIS, Corine, Alan Newell, Lynda Booth, Ian Ricketts, John Arnott. Syntax PAL: A System to
Improve the Written Syntax of Language-Imparied Users. Assistive Technologies 1992. RESNA.
1992.
NEWELL, Alan F., John L. Arnott, Lynda Booth, Wialliam Beattie, Bernadette Brophy, Ian W.
Ricketts. Effect of The “PAL” Word Prediction System on the Quality and Quantity of Text
Generation. AAC Augmentative and Alternative Communication 1992. ISAAC. Março, 1992.
SEVCIK, Rose A. e MaryAnn Romski. ACC: More Than Three Decades of Growth and
Development.
American
Speech-Language-Hearing
Association
(ASHA).
1997.
http://www.asha.org/aac-more-than-three-decades-of-growth-and-development.cfm (01/2003).
STROUSTRUP, Bjarne. The C++ Programming Language. Setembro, 1997.
STUM, Gregg M., Patrick W. Demasco, Kathleen F. McCoy. Automatic Abbreviation Generation.
RESNA 1991. 1991.
STUM, Gregg M., Patrick W. Demasco. Flexible Abbreviation Expansion. RESNA 1992. 1992.
TYVAND, Steiner, Patrick Demasco. Syntax Statistics In Word Prediction. Proceedings ECART 2.
The Swedish Handicap Institute , Estocolmo, 1993, 11.2.
VENKATAGIRI, Horabail S. Effect of Window Size on Rate of Communication in a Lexical
Prediction AAC System. AAC Augmentative Alternative Communication. 1994.
WILLIAMS, Sara, Charlie Kindel. The Component Object Model: A Technical Overview. Microsoft
Corporation. Outubro, 1994.
YANG, Gijoo, Kathleen McCoy, Patrick Demasco. Word Prediction Using a Systemic Tree
Adjoining Grammar. Proceedings RESNA 1990. 1990.
143
144
Apêndices
145
146
Apêndice A - Caracteres Existentes no Corpus
1313916
! 200
" 321
$ 25
% 47
& 56
' 449
( 2663
) 2672
* 107
+9
, 114594
- 21604
. 57991
/ 987
0 10112
1 12785
2 7128
3 4571
4 3916
5 4895
6 3315
7 3174
8 3853
9 7050
: 3694
; 1945
= 15
? 383
@ 13
A 10831
B 3943
C 8270
D 3824
E 6436
F 3626
G 3082
H 1467
I 3706
J 2589
K 649
L 3776
M 6256
N 3992
O 6183
P 8127
Q 612
R 3744
S 6706
T 3520
U 2040
V 1883
W 539
X 181
Y 145
Z 213
[ 77
] 76
147
` 103
a 882569
b 67612
c 263852
d 398327
e 824075
f 72197
g 87941
h 49926
i 479113
j 22821
k 5252
l 202714
m 292280
n 384089
o 744549
p 201767
q 59662
r 496790
s 557385
t 353261
u 266526
v 94398
w 2804
x 17130
y 3744
z 23385
~1
‚ 14
ƒ 16
ª 118
« 7641
´9
· 2
º 285
» 7595
À 103
Á 253
 13
à 30
Ç 31
È1
É 476
Ê8
Í 51
Ñ1
Ó 64
Õ8
Ù1
Ú 352
à 8971
á 33583
â 3997
ã 58818
ä5
ç 50547
è 45
é 27882
ê 11537
ë 15
148
ì1
í 20558
î2
ï3
ñ 17
ò1
ó 17489
ô 631
õ 13475
ö9
ù2
ú 9003
ü8
149
150
Apêndice B - Script para a determinação do número de ocorrências de cada palavra no
Corpus
#AUTOR: Luis Garcia
#DATA: 09/06/2000
#FUNCAO: Conta o numero de ocorrencias de cada palavra no ficheiro fornecido
#UTILIZACAO: gawk -f con_oco_pal.awk <nome ficheiro>
#Funcao que coloca uma palavra em minusculas. As letras maiusculas acentuadas
#do Portugues tambem sao convertidas.
function PortugueseToLower( s ){
ls = tolower( s );
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
"Á",
"É",
"Í",
"Ó",
"Ú",
"À",
"Â",
"Ê",
"Ô",
"Ã",
"Õ",
"Ç",
"á",
"é",
"í",
"ó",
"ú",
"à",
"â",
"ê",
"ô",
"ã",
"õ",
"ç",
ls
ls
ls
ls
ls
ls
ls
ls
ls
ls
ls
ls
);
);
);
);
);
);
);
);
);
);
);
);
#´a
#´e
#´i
#´o
#´u
#`a
# ^a
#^e
#^o
#~a
#~o
# ,c
return ls;
}
BEGIN{
#Caracteres que separam as palavras
RS="[ \n\t,.«»:)(;/?\"!]+";
}
#Para ser considerada palavra tem de ser constituida por os caracteres indicados && nao conter dois travessoes seguidos
( $0 ~ /^[-A-Za-záéíóúÁÉÍÓÚàÀâÂêÊôÔãÃõÕçÇ]+$/ ) && ( $0 !~ /\-\-/) {
palavra = PortugueseToLower( $0 );
if( palavra in tabelaOcorrencias )
tabelaOcorrencias[ palavra ] ++;
else
tabelaOcorrencias[ palavra ] = 1;
}
END{
for( palavra in tabelaOcorrencias )
print palavra, tabelaOcorrencias[ palavra ];
}
151
152
Apêndice C - Script para a determinação do número de ocorrências de cada bigrama de
palavras no Corpus
#AUTOR: Luis Garcia
#DATA: 09/06/2000
#FUNCAO: Conta o numero de ocorrencias de cada par.
#UTILIZACAO: gawk -f con_oco_pares.awk <nome ficheiro>
#Funcao que coloca uma palavra em minusculas. As letras acentuadas do Portugues tambem sao convertidas.
function PortugueseToLower( s ){
ls = tolower( s );
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
"Á",
"É",
"Í",
"Ó",
"Ú",
"À",
"Â",
"Ê",
"Ô",
"Ã",
"Õ",
"Ç",
"á",
"é",
"í",
"ó",
"ú",
"à",
"â",
"ê",
"ô",
"ã",
"õ",
"ç",
ls
ls
ls
ls
ls
ls
ls
ls
ls
ls
ls
ls
);
);
);
);
);
);
);
);
);
);
);
);
#´a
#´e
#´i
#´o
#´u
#`a
# ^a
#^e
#^o
#~a
#~o
# ,c
return ls;
}
BEGIN{
#Caracteres que separam as palavras
RS="[ \n\t,.«»:)(;/?\"!]+";
numeroPares = 0;
palavraAnterior = "NADA";
palavraActual = "NADA";
}
#Para ser considerada palavra tem de ser constituida por os caracteres indicados && nao conter dois travessoes seguidos
( $0 ~ /^[-A-Za-záéíóúÁÉÍÓÚàÀâÂêÊôÔãÃõÕçÇ]+$/ ) && ( $0 !~ /\-\-/) {
palavraAnterior = palavraActual;
palavraActual = PortugueseToLower( $0 );
par = palavraAnterior " " palavraActual;
if( par in tabelaOcorrencias )
tabelaOcorrencias[ par ]++;
else{
tabelaOcorrencias[ par ] = 1;
numeroPares++;
}
print " Pares: " numeroPares > "/dev/stderr";
}
END{
for( par in tabelaOcorrencias ){
print par " " tabelaOcorrencias[ par ];
}
}
153
154
Apêndice D - Script para a determinação do número de ocorrências de cada classe
gramatical no Corpus
#AUTOR: Luis Garcia
#DATA: 21/08/2002
#FUNCAO: Conta o numero de ocorrencias de cada classe de palavras.
#UTILIZACAO: gawk -f con_oco_classes.awk -v fich_pal=<nome ficheiro palavras classes> <nome ficheiro texto>
#Funcao que coloca uma palavra em minusculas. As letras acentuadas
#do Portugues tambem sao convertidas.
function PortugueseToLower( s ){
ls = tolower( s );
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
"Á",
"É",
"Í",
"Ó",
"Ú",
"À",
"Â",
"Ê",
"Ô",
"Ã",
"Õ",
"Ç",
"á",
"é",
"í",
"ó",
"ú",
"à",
"â",
"ê",
"ô",
"ã",
"õ",
"ç",
ls
ls
ls
ls
ls
ls
ls
ls
ls
ls
ls
ls
);
);
);
);
);
);
);
);
);
);
);
);
#´a
#´e
#´i
#´o
#´u
#`a
# ^a
#^e
#^o
#~a
#~o
# ,c
return ls;
}
BEGIN{
#Leitura das palavras com a frequencia e as classes
while( getline < fich_pal ){
if( NF == 3 ){
palavra = $1;
classe = $3;
tabelaPalavrasClasses[ palavra ] = classe;
#print $1 " " $3;
}
}
#Caracteres que separam as palavras no ficheiro de texto
RS="[ \n\t,.«»:)(;/?\"!]+";
numeroClasses = 0;
}
#Para ser considerada palavra tem de ser constituida por os caracteres indicados && nao conter dois travessoes seguidos
( $0 ~ /^[-A-Za-záéíóúÁÉÍÓÚàÀâÂêÊôÔãÃõÕçÇ]+$/ ) && ( $0 !~ /\-\-/) {
palavraActual = PortugueseToLower( $0 );
if( palavraActual in tabelaPalavrasClasses ) {
classePalavraActual = tabelaPalavrasClasses[ palavraActual ];
if( classePalavraActual in tabelaOcorrenciasClasses )
tabelaOcorrenciasClasses[ classePalavraActual ]++;
else{
tabelaOcorrenciasClasses[ classePalavraActual ] = 1;
numeroClasses++;
print " Classes: " numeroClasses > "/dev/stderr";
}
}
}
END{
for( classe in tabelaOcorrenciasClasses ){
print classe " " tabelaOcorrenciasClasses[ classe ];
}
}
155
156
Apêndice E - Script para a determinação do número de ocorrências de cada par de classes
gramaticais no Corpus
#AUTOR: Luis Garcia
#DATA: 09/06/2000
#FUNCAO: Conta o numero de ocorrencias de cada par de classes de palavras.
#UTILIZACAO: gawk -f con_oco_pares_classes.awk -v fich_pal=<nome ficheiro palavras ocorrencias classes>
<nome ficheiro texto>
#Funcao que coloca uma palavra em minusculas. As letras acentuadas
#do Portugues tambem sao convertidas.
function PortugueseToLower( s ){
ls = tolower( s );
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
gsub(
"Á",
"É",
"Í",
"Ó",
"Ú",
"À",
"Â",
"Ê",
"Ô",
"Ã",
"Õ",
"Ç",
"á",
"é",
"í",
"ó",
"ú",
"à",
"â",
"ê",
"ô",
"ã",
"õ",
"ç",
ls
ls
ls
ls
ls
ls
ls
ls
ls
ls
ls
ls
);
);
);
);
);
);
);
);
);
);
);
);
#´a
#´e
#´i
#´o
#´u
#`a
# ^a
#^e
#^o
#~a
#~o
# ,c
return ls;
}
BEGIN{
#Leitura das palavras com a frequencia e as classes
while( getline < fich_pal ){
if( NF == 3 ){
palavra = $1;
classe = $3;
tabelaClasses[ palavra ] = classe;
#print $1 " " $3;
}
}
#Caracteres que separam as palavras no ficheiro de texto
RS="[ \n\t,.«»:)(;/?\"!]+";
numeroPares = 0;
classesPalavraAnterior = "DESCONHECIDA";
classesPalavraActual = "DESCONHECIDA";
}
#Para ser considerada palavra tem de ser constituida por os caracteres indicados && nao conter dois travessoes seguidos
( $0 ~ /^[-A-Za-záéíóúÁÉÍÓÚàÀâÂêÊôÔãÃõÕçÇ]+$/ ) && ( $0 !~ /\-\-/) {
classesPalavraAnterior = classesPalavraActual;
palavraActual = PortugueseToLower( $0 );
if( palavraActual in tabelaClasses )
classesPalavraActual = tabelaClasses[ palavraActual ];
else
classesPalavraActual = "DESCONHECIDA";
if( ( classesPalavraAnterior != "DESCONHECIDA" ) && ( classesPalavraActual != "DESCONHECIDA" ) ){
parClasses = classesPalavraAnterior " " classesPalavraActual;
if( parClasses in tabelaParesClasses )
tabelaParesClasses[ parClasses ]++;
else{
tabelaParesClasses[ parClasses ] = 1;
numeroPares++;
print " Pares: " numeroPares > "/dev/stderr";
}
}
}
END{
for( par in tabelaParesClasses ){
print par " " tabelaParesClasses[ par ];
}
}
157
158
Apêndice F - Lista com o número de palavras iniciadas por cada caracter
c 7413
a 6938
p 5752
d 4872
e 4820
s 4523
r 4134
m 3774
i 3406
t 2817
f 2622
b 2488
l 2031
v 1784
g 1686
o 1288
n 1203
h 1147
j 776
k 512
u 467
q 408
w 314
z 204
y 107
á 76
x 61
ó 47
é 47
í 36
à 20
ú 17
â 11
- 11
ê5
ã2
ç1
159
160
Apêndice G - Lista das vinte palavras com maior número de palavras seguintes
de 3969
a 2761
o 1787
e 1660
da 1320
do 1257
que 1256
em 923
um 916
os 887
uma 818
dos 714
se 683
na 672
as 618
para 605
no 558
à 550
ao 500
das 486
161
162
Apêndice H - Questionários sobre o Preditor de Palavras
163
164
Inquérito sobre o Preditor de Palavras
1. Objectivos e Actividades
1.1 Os principais objectivos de um preditor de palavras é apoiar a aprendizagem da leitura, aprendizagem da escrita e aceleração da escrita. Indique a importância de cada um destes objectivos. Atribua
uma classificação a cada uma das opções: 1 (primeira classificada) até 3 (última classificada).
2
Aprendizagem da leitura
1
Aprendizagem da escrita
3
Aceleração da escrita
1.2 Quais as actividades que desenvolveu em maior quantidade com o apoio do preditor. Atribua uma
classificação a cada uma das opções: 1 (primeira classificada) até 5 (última classificada).
1
Cópias
2
Ditados
3
Fichas de Trabalho
5
Comunicação
4
Escrita livre
2. Dicionário de Palavras
2.1 Acha que o dicionário do preditor possui muitas, poucas, ou um número razoável de palavras?
Coloque uma cruz na opção mais próxima da sua resposta.
Poucas palavras
x
Número razoável de palavras
Muitas palavras
165
2.2 Quando começou a utilizar o Preditor de Palavras achou que as palavras sugeridas eram mais adequadas a que grupo etário? Coloque uma cruz na opção mais próxima da sua resposta.
x
Crianças
Jovens
Adultos
3. Opções Disponíveis
3.1 As opções de interacção com o utilizador permitem ajustar o preditor às capacidades do utilizador.
Quais destas características considera mais importantes? Atribua uma classificação a cada uma das
opções: 1 (primeira classificada) até 7 (última classificada).
3
Alteração do tamanho das letras das palavra sugeridas
1
Alteração do número máximo de palavras sugeridas
4
Alteração das letras das palavras sugeridas para maiúsculas ou minúsculas
3
Alteração das coordenadas iniciais da janela do preditor
2
Alteração das teclas para completar uma palavra
7
Activação ou desactivação do génio
6
Configuração diferente destas características para cada utilizador
3.2 Algumas das opções anteriores apresentam uma forma de utilização mais fácil. Classifique cada
uma destas opções de acordo com a facilidade com que são alteradas? Atribua uma classificação a
cada uma das opções: 1 (primeira classificada) até 7 (última classificada).
7
Alteração do tamanho das letras das palavra sugeridas
6
Alteração do número máximo de palavras sugeridas
5
Alteração das letras das palavras sugeridas para maiúsculas ou minúsculas
4
Alteração das coordenadas iniciais da janela do preditor
3
Alteração das teclas para completar uma palavra
1
Activação ou desactivação do génio
2
Configuração diferente destas características para cada utilizador
166
3.3 As opções de predição permitem ajustar a predição às necessidades do utilizador. Quais destas
características considera mais importantes? Atribua uma classificação a cada uma das opções: 1 (primeira classificada) até 3 (última classificada).
3
Alteração do tempo ao fim do qual é feita uma nova sugestão de palavras
2
Alteração da importância de vários factores na predição
1
Aprendizagem de novas palavras introduzidas pelo utilizador
3.4 Algumas das opções anteriores apresentam uma forma de utilização mais fácil. Classifique cada
uma destas opções de acordo com a facilidade com que são alteradas? Atribua uma classificação a
cada uma das opções: 1 (primeira classificada) até 3 (última classificada).
3
Alteração do tempo ao fim do qual é feita uma nova sugestão de palavras
2
Alteração da importância de vários factores na predição
1
Aprendizagem de novas palavras introduzidas pelo utilizador
4. O preditor e o sintetizador Dixi+
4.1 Através do sintetizador Dixi+ é possível ouvir uma palavras, frase, parágrafo ou o texto seleccionado que o utilizador escreveu, com o apoio do preditor, de cada vez. Indique a importância de cada
uma destas possibilidades? Atribua uma classificação a cada uma das opções: 1 (primeira classificada)
até 4 (última classificada).
1
Ouvir uma palavra de cada vez
2
Ouvir uma frase de cada vez
3
Ouvir um parágrafo de cada vez
4
Ouvir o texto seleccionado
4.2 O sintetizador Dixi+ permite aos utilizadores ouvirem texto escrito por outras pessoas ou pelos
próprios. Indique a importância do sintetizador de texto nas seguintes actividades. Atribua uma classificação a cada uma das opções: 1 (primeira classificada) até 4 (última classificada).
3
Cópias
5
Ditados
4
Fichas de Trabalho
167
1
Comunicação
2
Escrita livre
4.3 Para quais das actividades acha a qualidade da voz do sintetizador adequada. Coloque uma cruz
nas opções seleccionadas.
4
Cópias
2
Ditados
5
Fichas de Trabalho
1
Comunicação
3
Escrita livre
5. Melhorias
5.1 O preditor irá ser melhorado em alguns aspectos. Indique quais os mais prioritários. Atribua uma
classificação a cada uma das opções: 1 (primeira classificada) até 9 (última classificada).
6
Seleccionar as palavras através do rato
7
Seleccionar as palavras através de varrimento
1
Disponibilizar dicionários gerais adequados a cada nível etário: crianças, jovens, adultos
2
Possibilidade das palavras serem sugeridas na horizontal
5
Possibilidade da lista das palavras sugeridas acompanhar o cursor no ecrã
3
Acesso ao dicionário de palavras para correcção de erros e introdução de novas palavras
4
Possibilidade de ouvir as várias palavras sugeridas através do sintetizador
8
O agente efectuar mais animações
9
O agente falar com o utilizador em alguns momentos
10
Medições da eficácia do Preditor no apoio à escrita
Muito Obrigado pela colaboração,
Luis Garcia
168
Inquérito sobre o Preditor de Palavras
1. Objectivos e Actividades
1.1 Os principais objectivos de um preditor de palavras é apoiar a aprendizagem da leitura, aprendizagem da escrita e aceleração da escrita. Indique a importância de cada um destes objectivos. Atribua
uma classificação a cada uma das opções: 1 (primeira classificada) até 3 (última classificada).
2
Aprendizagem da leitura
1
Aprendizagem da escrita
3
Aceleração da escrita
1.2 Quais as actividades que desenvolveu em maior quantidade com o apoio do preditor. Atribua uma
classificação a cada uma das opções: 1 (primeira classificada) até 5 (última classificada).
2
Cópias
5
Ditados
3
Fichas de Trabalho
1
Comunicação
4
Escrita livre
2. Dicionário de Palavras
2.1 Acha que o dicionário do preditor possui muitas, poucas, ou um número razoável de palavras?
Coloque uma cruz na opção mais próxima da sua resposta.
Poucas palavras
X Número razoável de palavras
Muitas palavras
2.2 Quando começou a utilizar o Preditor de Palavras achou que as palavras sugeridas eram mais adequadas a que grupo etário? Coloque uma cruz na opção mais próxima da sua resposta.
169
X Crianças
Jovens
Adultos
3. Opções Disponíveis
3.1 As opções de interacção com o utilizador permitem ajustar o preditor às capacidades do utilizador.
Quais destas características considera mais importantes? Atribua uma classificação a cada uma das
opções: 1 (primeira classificada) até 7 (última classificada).
3
Alteração do tamanho das letras das palavra sugeridas
1
Alteração do número máximo de palavras sugeridas
4
Alteração das letras das palavras sugeridas para maiúsculas ou minúsculas
5
Alteração das coordenadas iniciais da janela do preditor
2
Alteração das teclas para completar uma palavra
7
Activação ou desactivação do génio
6
Configuração diferente destas características para cada utilizador
3.2 Algumas das opções anteriores apresentam uma forma de utilização mais fácil. Classifique cada
uma destas opções de acordo com a facilidade com que são alteradas? Atribua uma classificação a
cada uma das opções: 1 (primeira classificada) até 7 (última classificada).
7
Alteração do tamanho das letras das palavra sugeridas
6
Alteração do número máximo de palavras sugeridas
5
Alteração das letras das palavras sugeridas para maiúsculas ou minúsculas
4
Alteração das coordenadas iniciais da janela do preditor
3
Alteração das teclas para completar uma palavra
1
Activação ou desactivação do génio
2
Configuração diferente destas características para cada utilizador
170
3.3 As opções de predição permitem ajustar a predição às necessidades do utilizador. Quais destas
características considera mais importantes? Atribua uma classificação a cada uma das opções: 1 (primeira classificada) até 3 (última classificada).
3
Alteração do tempo ao fim do qual é feita uma nova sugestão de palavras
2
Alteração da importância de vários factores na predição
1
Aprendizagem de novas palavras introduzidas pelo utilizador
3.4 Algumas das opções anteriores apresentam uma forma de utilização mais fácil. Classifique cada
uma destas opções de acordo com a facilidade com que são alteradas? Atribua uma classificação a
cada uma das opções: 1 (primeira classificada) até 3 (última classificada).
3
Alteração do tempo ao fim do qual é feita uma nova sugestão de palavras
2
Alteração da importância de vários factores na predição
1
Aprendizagem de novas palavras introduzidas pelo utilizador
4. O preditor e o sintetizador Dixi+
4.1 Através do sintetizador Dixi+ é possível ouvir uma palavras, frase, parágrafo ou o texto seleccionado que o utilizador escreveu, com o apoio do preditor, de cada vez. Indique a importância de cada
uma destas possibilidades? Atribua uma classificação a cada uma das opções: 1 (primeira classificada)
até 4 (última classificada).
1
Ouvir uma palavra de cada vez
2
Ouvir uma frase de cada vez
3
Ouvir um parágrafo de cada vez
4
Ouvir o texto seleccionado
4.2 O sintetizador Dixi+ permite aos utilizadores ouvirem texto escrito por outras pessoas ou pelos
próprios. Indique a importância do sintetizador de texto nas seguintes actividades. Atribua uma classificação a cada uma das opções: 1 (primeira classificada) até 4 (última classificada).
5
Cópias
4
Ditados
171
3
Fichas de Trabalho
1
Comunicação
2
Escrita livre
4.3 Para quais das actividades acha a qualidade da voz do sintetizador adequada. Coloque uma cruz
nas opções seleccionadas.
4
Cópias
2
Ditados
5
Fichas de Trabalho
1
Comunicação
3
Escrita livre
5. Melhorias
5.1 O preditor irá ser melhorado em alguns aspectos. Indique quais os mais prioritários. Atribua uma
classificação a cada uma das opções: 1 (primeira classificada) até 9 (última classificada).
6
Seleccionar as palavras através do rato
7
Seleccionar as palavras através de varrimento
1
Disponibilizar dicionários gerais adequados a cada nível etário: crianças, jovens, adultos
2
Possibilidade das palavras serem sugeridas na horizontal
5
Possibilidade da lista das palavras sugeridas acompanhar o cursor no ecrã
3
Acesso ao dicionário de palavras para correcção de erros e introdução de novas palavras
4
Possibilidade de ouvir as várias palavras sugeridas através do sintetizador
9
O agente efectuar mais animações
8
O agente falar com o utilizador em alguns momentos
10
Medidações da eficácia do Preditor no apoio à escrita
Muito Obrigado pela colaboração,
Luis Garcia
172
Inquérito sobre o Preditor de Palavras
1. Objectivos e Actividades
1.1 Os principais objectivos de um preditor de palavras é apoiar a aprendizagem da leitura, aprendizagem da escrita e aceleração da escrita. Indique a importância de cada um destes objectivos. Atribua
uma classificação a cada uma das opções: 1 (primeira classificada) até 3 (última classificada).
3
Aprendizagem da leitura
2
Aprendizagem da escrita
1
Aceleração da escrita
1.2 Quais as actividades que desenvolveu em maior quantidade com o apoio do preditor. Atribua uma
classificação a cada uma das opções: 1 (primeira classificada) até 5 (última classificada).
2
Cópias
1
Ditados
5
Fichas de Trabalho
3
Comunicação
4
Escrita livre
2. Dicionário de Palavras
2.1 Acha que o dicionário do preditor possui muitas, poucas, ou um número razoável de palavras?
Coloque uma cruz na opção mais próxima da sua resposta.
Poucas palavras
X Número razoável de palavras
Muitas palavras
2.2 Quando começou a utilizar o Preditor de Palavras achou que as palavras sugeridas eram mais adequadas a que grupo etário? Coloque uma cruz na opção mais próxima da sua resposta.
173
Crianças
X Jovens
Adultos
3. Opções Disponíveis
3.1 As opções de interacção com o utilizador permitem ajustar o preditor às capacidades do utilizador.
Quais destas características considera mais importantes? Atribua uma classificação a cada uma das
opções: 1 (primeira classificada) até 7 (última classificada).
3
Alteração do tamanho das letras das palavra sugeridas
1
Alteração do número máximo de palavras sugeridas
4
Alteração das letras das palavras sugeridas para maiúsculas ou minúsculas
6
Alteração das coordenadas iniciais da janela do preditor
2
Alteração das teclas para completar uma palavra
7
Activação ou desactivação do génio
5
Configuração diferente destas características para cada utilizador
3.2 Algumas das opções anteriores apresentam uma forma de utilização mais fácil. Classifique cada
uma destas opções de acordo com a facilidade com que são alteradas? Atribua uma classificação a
cada uma das opções: 1 (primeira classificada) até 7 (última classificada).
2
Alteração do tamanho das letras das palavra sugeridas
3
Alteração do número máximo de palavras sugeridas
5
Alteração das letras das palavras sugeridas para maiúsculas ou minúsculas
7
Alteração das coordenadas iniciais da janela do preditor
4
Alteração das teclas para completar uma palavra
1
Activação ou desactivação do génio
6
Configuração diferente destas características para cada utilizador
174
3.3 As opções de predição permitem ajustar a predição às necessidades do utilizador. Quais destas
características considera mais importantes? Atribua uma classificação a cada uma das opções: 1 (primeira classificada) até 3 (última classificada).
1
Alteração do tempo ao fim do qual é feita uma nova sugestão de palavras
2
Alteração da importância de vários factores na predição
3
Aprendizagem de novas palavras introduzidas pelo utilizador
3.4 Algumas das opções anteriores apresentam uma forma de utilização mais fácil. Classifique cada
uma destas opções de acordo com a facilidade com que são alteradas? Atribua uma classificação a
cada uma das opções: 1 (primeira classificada) até 3 (última classificada).
1
Alteração do tempo ao fim do qual é feita uma nova sugestão de palavras
1
Alteração da importância de vários factores na predição
1
Aprendizagem de novas palavras introduzidas pelo utilizador
4. O preditor e o sintetizador Dixi+
4.1 Através do sintetizador Dixi+ é possível ouvir uma palavras, frase, parágrafo ou o texto seleccionado que o utilizador escreveu, com o apoio do preditor, de cada vez. Indique a importância de cada
uma destas possibilidades? Atribua uma classificação a cada uma das opções: 1 (primeira classificada)
até 4 (última classificada).
1
Ouvir uma palavra de cada vez
2
Ouvir uma frase de cada vez
3
Ouvir um parágrafo de cada vez
4
Ouvir o texto seleccionado
4.2 O sintetizador Dixi+ permite aos utilizadores ouvirem texto escrito por outras pessoas ou pelos
próprios. Indique a importância do sintetizador de texto nas seguintes actividades. Atribua uma classificação a cada uma das opções: 1 (primeira classificada) até 4 (última classificada).
2
Cópias
1
Ditados
175
5
Fichas de Trabalho
3
Comunicação
4
Escrita livre
4.3 Para quais das actividades acha a qualidade da voz do sintetizador adequada. Coloque uma cruz
nas opções seleccionadas.
2
Cópias
1
Ditados
5
Fichas de Trabalho
3
Comunicação
4
Escrita livre
5. Melhorias
5.1 O preditor irá ser melhorado em alguns aspectos. Indique quais os mais prioritários. Atribua uma
classificação a cada uma das opções: 1 (primeira classificada) até 9 (última classificada).
6
Seleccionar as palavras através do rato
7
Seleccionar as palavras através de varrimento
1
Disponibilizar dicionários gerais adequados a cada nível etário: crianças, jovens, adultos
Possibilidade das palavras serem sugeridas na horizontal
4
Possibilidade da lista das palavras sugeridas acompanhar o cursor no ecrã
2
Acesso ao dicionário de palavras para correcção de erros e introdução de novas palavras
5
Possibilidade de ouvir as várias palavras sugeridas através do sintetizador
9
O agente efectuar mais animações
8
O agente falar com o utilizador em alguns momentos
3
Medidações da eficácia do Preditor no apoio à escrita
Muito Obrigado pela colaboração,
Luis Garcia
176
Apêndice I - Manual do Eugénio.
177
178
Eugénio – O Génio das Palavras 2.0
Manual de Utilização
Beja 2002
179
180
1. Introdução
Certas incapacidades físicas ou cognitivas reduzem total ou parcialmente a capacidade de comunicação oral ou escrita. Por isso têm sido desenvolvidas várias tecnologias que apoiam o
processo de comunicação – Tecnologias de Apoio à Comunicação (TAC’s). Entre estas tecnologias encontram-se os Preditores de Palavras cuja principal função consiste em acelerar a escrita. Desta forma os preditores de palavras constituem uma ferramenta muito importante quer para
a comunicação escrita quer para a comunicação oral. Nesta última situação o texto produzido é
enviado para um sintetizador que o transforma em fala. Alguns estudos também indicam que os
preditores de palavras ajudam a pessoa a criar textos com menos erros e com uma melhor qualidade global, sendo por isso também indicados para a aprendizagem da escrita.
O nosso Preditor de Palavras, que recentemente denominámos “Eugénio – O Génio das Palavras”, foi desenvolvido para o apoio dos dois objectivos acima referidos: (1) a aprendizagem e
(2) a aceleração da escrita na Língua Portuguesa. Para tal o Eugénio, na sua primeira versão, já
fornecia um elevado grau de interacção com o utilizador e tinha em consideração um sofisticado
conjunto de factores no processo de predição.
Nesta segunda versão do Eugénio foram incorporadas muitas capacidades novas deixando por
isso de ser apenas um preditor de palavras, para se tornar num completo Sistema de Comunicação Alternativa.
Para a interacção com o utilizador o Eugénio continua a recorrer a um agente animado, ilustrado
na Figura 1, que vai fornecendo algum feedback ao utilizador e participando no processo de
escrita em determinadas situações. Desta forma acreditamos que o utilizador ficará mais envolvido no processo de escrita.
Nesta segunda versão é agora possível a configuração de um grande conjunto de características
como o tamanho das letras das palavras preditas, a utilização de letras maiúsculas ou minúsculas, cor das letras, cor de fundo, tipo de letra, etc.
Para predizer a palavra que o utilizador pretende escrever, e assim o apoiar na escrita, o Eugénio
tem em consideração o conjunto de factores que indicamos na Figura 2. Como resultado da predição o Eugénio apresenta ao utilizador um conjunto de palavras coerentes com o que está a ser
escrito.
181
Figura 1 – O Eugénio a completar uma palavra.
A. As letras já introduzidas da palavra
B. A frequência da utilização da palavra na língua em geral
C. A frequência da ocorrência da palavra conhecendo a palavra anterior no geral
D. A frequência da ocorrência da palavra conhecendo o género da palavra anterior
no geral
E. A frequência da ocorrência da palavra conhecendo o número da palavra anterior no geral
F.
A frequência da ocorrência da palavra conhecendo a categoria gramatical da
palavra anterior no geral
G. A última vez que a palavra foi utilizada
H. A frequência da utilização da palavra pelo próprio utilizador
I.
A frequência de ocorrência da palavra conhecendo a palavra anterior para o
utilizador
Figura 2 – Factores considerados no processo de predição
Caso o Eugénio esteja a ser utilizado na aceleração da escrita e a palavra pretendida se encontre
entre as palavras preditas o utilizador pode completar automaticamente a palavra evitando assim
a escrita dos restantes caracteres. Esta operação encontra-se ilustrada na Figura 1. Para além
disso também são evitados possíveis erros de escrita. Caso o Eugénio esteja a ser utilizado na
leitura e aprendizagem da escrita o aluno pode ler as várias palavras sugeridas para verificar se a
palavra pretendida se encontra entre estas. Caso esteja, o aluno pode escrever por ele próprio a
palavra sem a completar automaticamente.
Com o passar do tempo o Eugénio também se vai adaptando ao estilo de escrita do utilizador,
tornando-se por isso mais eficaz na ajuda prestada.
182
O Eugénio funciona agora com qualquer programa como o Ms Word 97, Ms Word 2000,
WordPad, NotePad, Outlook Express, etc.
Para utilizadores impossibilitados de utilizar o teclado na escrita o Eugénio dispõe de vários
teclados de ecrã (qwerty, alfabético e por frequência dos caracteres na Língua Portuguesa) Figura 3. O “pressionar” de uma destas teclas pode ser efectuado, directamente, através de um
dispositivo de ponteiro ou, indirectamente, através do processo de varrimento. Existem várias
características do varrimento que podem ser alteradas.
Figura 3 – Eugénio com um dos teclados qwerty.
O Eugénio também está capacitado para funcionar com qualquer sintetizador de texto compatível com a SAPI 4. Desta forma é possível, por exemplo, aos utilizadores ouvirem uma palavra
antes de esta ser completada ou sintetizarem uma frase escrita.
Para a aceleração da escrita o Eugénio fornece agora também a possibilidade de expansão de
abreviaturas. Este processo proporciona uma maior rapidez na escrita mas também é extremamente exigente em termos da capacidade de memorização do utilizador.
Nos capítulos seguintes iremos indicar como instalar, correr e configurar o Eugénio. Em algumas situações serão fornecidas informações adicionais para utilizadores mais avançados.
183
184
2. Instalação do Eugénio
2.1 Instalação com o ficheiro descarregado da Internet
Para instalar o Eugénio utilizando o ficheiro descarregado da Internet deve seguir os seguintes
passos:
1. Utilizar o programa WinZip para descompactar o ficheiro para uma pasta no disco, por
exemplo as pasta c:\eugenio. Nessa pasta surgirão três sub-pastas denominadas disk1,
disk2, disk3 e disk4.
Nota: Se quiser colocar a instalação do Eugénio em disquetes, para instalar noutro computador, deve copia o conteúdo de cada uma destas sub-pastas para uma disquete diferente.
2. Abrir a pasta disk1 e correr o programa Setup.
3. Correr o programa MsAgents existente nesta pasta.
4. Correr o programa Genie também existente nesta pasta.
2.2 Instalação utilizando disquetes
Para instalar o Eugénio a partir de disquetes deve seguir os seguintes passos:
1. Introduzir a disquete1 na unidade de disquetes e correr o programa Setup.
2. Fornecer as várias disquetes à medida que estas são pedidas.
3. Introduzir novamente a disquete1 na unidade de disquetes e correr o programa MsAgents.
4. Mantendo a disquete 1 na unidade de disquetes correr o programa Genie.
185
186
3. Correr o Eugénio
Nesta segunda versão, o Eugénio pode ser executado em qualquer momento pois este ficará a
trabalhar com a aplicação activa. Também pode mudar de aplicação que o Eugénio começará a
trabalhar com a nova aplicação activa. Se quiser trabalhar com o Ms Word é preferível chamar
este processador de texto antes de correr o Eugénio. Tal deve-se ao facto do Ms Word ter de
efectuar um conjunto de inicializações necessárias ao funcionamento do Eugénio.
3.1 Perfil de utilizador
O perfil de um utilizador consiste num conjunto de ajustes que permitem ao Eugénio adaptar-se
às necessidades de cada utilizador ou ao mesmo utilizador em situações diferentes. Cada utilizador pode possuir um ou mais perfis de utilizador. Por exemplo, pode ser criado o perfil LuisCartas para o apoio à escrita de cartas, o perfil Luis-Relatórios para o apoio à escrita de relatórios, etc. Para cada um destes perfis o Eugénio vai tornando-se cada vez mais especializado e
por isso mais eficaz.
A criação de um novo perfil de utilizador ou a selecção de um dos perfis disponíveis é efectuada
através da caixa de diálogo apresentada na Figura 4. Esta caixa de diálogo surge logo que o
Eugénio seja chamado.
Figura 4 – Caixa de diálogo para a indicação do perfil do utilizador.
3.2 Criação de um perfil de utilizador
Para criar o perfil para um utilizador devem ser efectuados os seguintes passos:
1. Introduzir o nome do novo perfil de utilizador na caixa de texto Criar Novo Perfil.
2. Carregar no botão Criar.
187
3.3 Selecção de um perfil de utilizador
Para seleccionar o perfil de um utilizador devem ser efectuados os seguintes passos:
1. Carregar na seta assinalada na Figura 4 para visualizar os perfis de utilizador já existentes.
2. Seleccionar o perfil de utilizador pretendido.
3. Carregar no botão OK.
3.4 Informações adicionais
A lista com os perfis de utilizador disponíveis encontra-se guardada no ficheiro de texto utils.
Este e todos os ficheiros utilizados pelo Eugénio encontram-se na pasta na qual o programa se
encontra instalado. O caminho para esta pasta é, na versão portuguesa do Windows 98,
C:\Programas\SNRIPD-INESC-ESTIG-CPCB\Preditor Palavras.
188
4. Configuração
Para o ajustamento do Eugénio às necessidades de cada utilizador existem um conjunto de opções que podem ser alteradas. Este conjunto de opções forma o perfil do utilizador e encontramse divididas em vários grupos: Janela e Agente, Predição e Expansão de Palavras, Síntese de
Fala, Teclado de Ecrã e Opções Avançadas de Predição. Os primeiros quatro grupos de opções,
consideradas as Opções Principais, podem ser alterados através da caixa de diálogo apresentada
na Figura 5. As Opções Avançadas de Predição podem ser alteradas através da caixa de diálogo
apresentado na Figura 6. A seguir iremos indicar as possibilidades de ajustamento de cada uma
destas opções.
Figura 5 – Caixa de diálogo que permite alterar as opções principais do Eugénio.
4.1 Alteração das opções principais
Para configurar as opções principais execute os seguintes passos:
1. Abrir o menu Ver.
2. Seleccionar Opções e a seguir Principais. Irá surgir a caixa de diálogo apresentada na
Figura 5.
189
3. Alterar uma ou mais opções de acordo com as necessidades do utilizador. Consulte as
tabelas Tabela 1, Tabela 2, Tabela 3 e Tabela 4 para obter informações sobre cada uma
das opções.
4. Carregar no botão OK. Carregando em Cancelar as alterações não têm efeito.
Janela e Agente
Coordenadas Iniciais
Iniciar Minimizada
Agente Activo
Nome do Agente
Reposicionamento Automático da
Janela
Perseguir o Cursor de Texto
Coordenadas iniciais da janela do Eugénio no arranque. Para
alterar estas coordenadas posicione a janela e depois pressione o botão Utilizar Posição Actual.
Quando esta opção se encontra activa a janela do Eugénio é
automaticamente minimizada no arranque. Esta possibilidade é importante na expansão de abreviaturas.
Quando esta opção se encontra activa é utilizado um agente
animado para fornecer feedback ao utilizador.
Nome do Agente Animado. Existem quatro agentes disponíveis: Eugénio, Merlin, Papagaio e Robot. O primeiro destes
é instalado quando da instalação do Eugénio. Os restantes
deverão ser descarregados da Internet e instalados no computador. Consulte a página dos Ms Agents da Microsoft para
obter mais informações.
Quando esta opção se encontra activa a janela do Eugénio é
automaticamente reposicionada sempre que o cursor de
texto se aproxima desta. Esta opção só funciona com os
teclados de ecrã: Coluna e Linha (veja a opção Teclados de
Ecrã).
Quando esta opção se encontra activa a janela do Eugénio é
constantemente reposicionada de modo a encontrar-se próxima do cursor de texto. Esta opção só funciona com os
teclados de ecrã: Coluna e Linha(veja a opção Teclados de
Ecrã).
Tabela 1 – Opções da Janela e Agente.
Predição e Expansão de Palavras
Máximo de Palavras
Tamanho das Letras
Maiúsculas
Adaptação ao Utilizador
Ver Antes
Cor das Letras
Cor de Fundo
Número máximo de palavras preditas apresentadas pelo
Eugénio.
Tamanho das letras das palavras preditas, teclas do teclado
de ecrã e texto Ver Antes (veja a opção Ver Antes).
Quando esta opção se encontra activa as palavras preditas
são apresentadas em maiúsculas. Caso contrário são escritas
em minúsculas.
Quando esta opção se encontra activa o Eugénio vai-se
adaptando ao estilo de escrita do utilizador.
Quando esta opção se encontra activa o Eugénio mostra por
cima do cursor de texto a palavra que vai completar, a abreviatura que vai expandir ou a tecla do teclado de ecrã pressionada(veja Figura 8). Para confirmar o utilizador deve
repetir a operação (completar a palavra, expandir a abreviatura ou pressionar a tecla do teclado de ecrã).
Cor das letras das palavras preditas e das teclas do teclado
de ecrã. Esta cor é utilizada como cor de fundo no texto Ver
Antes (veja a opção Ver Antes).
Cor de fundo das palavras preditas e das teclas do teclado de
190
Tipo de Letra
Teclas para Completar
Tecla de Expansão de Abreviaturas
ecrã. Esta cor é utilizada como cor das letras no texto Ver
Antes (veja a opção Ver Antes).
Tipo das letras das palavras preditas, teclas do teclado de
ecrã e texto Ver Antes(veja a opção Ver Antes).
Conjuntos de teclas utilizados para completar uma palavra.
Existem três grupos de teclas disponíveis: teclas de função
(F1-F10), teclas com os números ( 0-9) e teclas do teclado
numérico com os números (0-9)
Tecla utilizada para expandir uma abreviatura. Existem duas
teclas disponíveis para o efeito: tecla Tab e tecla Ins.
Tabela 2 – Opções da Predição e Expansão de Palavras.
Síntese de Fala
Sintetizador
Ouvir com o Rato Sobre
Tecla para Ouvir Palavra
Tecla para Ouvir Frase
Ouvir Antes
Ouvir Depois
Nome do sintetizador de fala que se pretende utilizar. São
listados todos os sintetizadores disponíveis no sistema. Se o
sintetizador escolhido não for compatível com a SAPI 4
então o Eugénio não o vai conseguir utilizar.
Número de vezes que o texto de um determinada tecla ou
palavra predita é sintetizado quando o rato se encontra sobre
esta.
Tecla para ouvir uma palavra escrita no processador de texto
ou noutro programa. O cursor de texto deve encontrar-se
dentro da palavra. Existem três teclas disponíveis para o
efeito: tecla / do teclado numérico, tecla Alt e tecla F11.
Tecla para ouvir uma frase escrita no processador de texto
ou noutro programa. O cursor de texto deve encontrar-se
dentro da frase. Existem três teclas disponíveis para o efeito:
tecla * do teclado numérico, tecla Ctrl e tecla F12.
Quando esta opção se encontra activa o Eugénio sintetiza
primeiro a palavra que vai completar, a abreviatura que vai
expandir ou a tecla do teclado de ecrã pressionada. Para
confirmar o utilizador deve repetir a operação (completar a
palavra ou expandir a abreviatura).
Reforço sintetizado da palavra completada, abreviatura expandida, ou tecla do teclado de ecrã pressionada.
Tabela 3 – Opções da Síntese de Fala.
Teclado de Ecrã
Nome de Teclado
Método de Varrimento
Nome do teclado de ecrã que se pretende utilizar. Existem
teclados de ecrã que apenas servem para apresentar as palavras preditas: teclados Coluna e Linha e existem outros que
também apresentam as várias teclas necessárias à escrita no
computador. O “pressionar” de uma destas teclas pode ser
efectuado, directamente, através de um dispositivo de ponteiro ou, indirectamente, através do processo de varrimento.
Utilizadores mais experientes também podem desenvolver
novos teclados. Para tal abra a directoria na qual se encontra
instalado o Eugénio, copie um dos ficheiros com extensão.tec, forneça-lhe um novo nome e altere a estrutura deste
novo teclado através de um editor de texto.
Método de varrimento utilizado. Encontram-se disponíveis
três métodos diferentes de varrimento: regular, inverso e
191
Ciclos de Varrimento
Velocidade de Varrimento
Latência dos Interruptores
Pista Sonora com Beep
Pista Sintetizada
passo-a-passo. No varrimento regular e inverso apenas é
utilizado um manípulo. Este manípulo deve encontrar-se
ligado ao botão esquerdo do rato. No varrimento passo-apasso são utilizados dois manípulos. O segundo manípulo
deve ser ligado ao botão direito do rato. Para ser possível
ligar os manípulos aos botões do rato é necessária a adaptação do rato por um técnico (veja a Figura 7) . Contacte os
autores do Eugénio para mais informações sobre o assunto.
Número de ciclos durante os quais o Eugénio continua a
varrer as várias teclas. Findo este número de ciclos o varrimento termina e pode ser iniciado novamente.
Velocidade na passagem de um elemento do varrimento
(linha, grupo de teclas ou tecla) para outro.
Latência dos manípulos utilizados no varrimento. Aumentando a latência dos manípulos podem ser evitadas activações involuntárias por parte dos utilizadores nos mesmos.
Quando esta opção se encontra activa é fornecida uma pista
sonora ao utilizador indicando a passagem de um elemento
(linha, grupo de teclas ou tecla) para outro elemento do
varrimento.
Quando esta opção se encontra activa é fornecida uma pista
sintetizada ao utilizador descrevendo o novo elemento do
varrimento (linha, grupo de teclas ou tecla) que se encontra a
ser varrido.
Tabela 4 – Opções do Teclado de Ecrã.
Figura 6 – Caixa de diálogo que permite a alterar as opções avançadas de predição do Eugénio.
192
Figura 7 – Rato adaptado para utilização do varrimento com o Eugénio.
Figura 8 – Eugénio com a opção Ver Antes activa.
193
4.2 Alteração das opções avançadas de predição
Para ajustar a predição ao utilizador execute os seguintes passos:
1. Abrir o menu Ver.
2. Seleccionar Opções e a seguir Avançadas de Predição. Irá surgir a caixa de diálogo
apresentada na Figura 6.
3. Alterar uma das opções assinaladas na Figura 6. Consulte a tabela 5 para obter mais informações sobre cada uma das opções.
4. Carregar no botão OK.
Opções Avançadas Predição
Máximo de Letras nas Palavras
Letras não Pretendidas
Sequências de Letras Não Pretendidas
Importância dos seguintes factores, na predição, utilizando o dicionário geral
Importância dos seguintes factores, na predição, utilizando o dicionário do utilizador
Tempo em milisegundos ao fim do qual é feita
uma nova predição
Número que indica o máximo de letras na palavras preditas. O Eugénio só apresentará ao
utilizador palavras com um número de letras
igual ou inferior a este valor.
Letras não pretendidas nas palavras preditas. O
Eugénio não apresentará ao utilizador palavras
que contenham estas letras. As várias letras
podem ser escritas umas a seguir às outras ou
então separadas por ponto e virgula (e.g. xyz
ou x;y;z ).
Sequências de letras não pretendidas nas palavras preditas. O Eugénio não apresentará ao
utilizador palavras que contenham estas sequências de letras. As várias sequências de
letras devem encontrar-se separadas por ponto
e virgula ( e.g. ch;nh;lh ).
Valorização de cada um dos factores utilizados
na predição tendo em conta as palavras existentes no dicionário geral.
Valorização de cada um dos factores utilizados
na predição tendo em conta as palavras escritas
pelo utilizador.
Tempo em milisegundos ao fim do qual o Eugénio deve efectuar uma nova predição.
Tabela 7 – Opções Avançadas de Predição.
4.3 Simulador de Predição de Palavras
Após o ajustamento das várias opções com influência na predição (Máximo de Palavras, Adaptação ao Utilizador, Máximo de Letras nas Palavras, Letras não Pretendidas, Sequências de Letras Não Pretendidas, Importância Vários Factores Considerados na Predição) é possível testar
a eficácia do Eugénio no apoio à escrita. Para tal possibilita a simulação da escrita de um texto
194
por parte de um utilizador do Eugénio. Na simulação, por cada caracter “escrito” o Eugénio
efectua uma nova predição, caso a palavra pretendida se encontre na lista das palavras preditas a
predição da palavra é considerada bem sucedida, são actualizados um conjunto de indicadores e
inicia-se a “escrita” da próxima palavra.
Para efectuar uma simulação de predição execute os seguintes passos:
1. Ajustar as várias opções com influência sobre o processo de predição.
2. Abrir o menu Ferramentas.
3. Seleccionar a opção Simulador de Predição de Palavras. Irá surgir a caixa de diálogo
da Figura 9.
4. Indicar a origem do texto. Este pode ser fornecido através do clipboard ou através de
um ficheiro.
5. Carregar no botão Iniciar Simulação. A simulação será sempre um processo demorado
uma vez que por cada caracter escrito deverá ser efectuada uma nova predição.
6. No final da simulação pode consultar os vários indicadores fornecidos. Se necessário
poderá alterar novamente opções com influência na predição e correr de seguida uma
nova simulação. Com a opção Adaptação ao Utilizador activa, o Eugénio, no decurso da
simulação vai acrescentando palavras ao dicionário do utilizador. No final de cada simulação retira as palavras acrescentadas de modo a deixar o dicionário intacto.
Figura 9 – Simulador de Predição do Eugénio.
195
4.4 Adaptação ao utilizador
O utilizador pode adaptar o Eugénio ao seu estilo de escrita fornecendo um texto já escrito. O
texto pode ser fornecido através do clipboard ou então através de um ficheiro de texto. A seguir
indicaremos as duas formas de efectuar esta operação.
Para efectuar a adaptação ao utilizador a partir do clipoard efectue os seguintes passos:
1. Numa determinada aplicação, como por exemplo o Ms Word, copiar o texto para o
clipboard.
2. Abrir o menu Ferramentas do Eugénio.
3. Seleccionar a opção Adaptar ao Utilizador e escolher A Partir do Clipboard.
Para efectuar a adaptação ao utilizador a partir de um ficheiro efectue os seguintes passos:
1. Abrir o menu Ferramentas do Eugénio.
2. Seleccionar a opção Adaptar ao Utilizador e escolher A Partir de Ficheiro. Irá surgir
uma caixa de diálogo que permite a escolha de um ficheiro.
3. Escolher o ficheiro que contem o texto pretendido. Este ficheiro terá de ser necessariamente um ficheiro de texto.
4.5 Manutenção das palavras e abreviaturas do utilizador
O Eugénio também permite a realização de um conjunto de operações (introduzir, apagar e alterar) para manutenção dos dicionários de palavras e abreviaturas do utilizador.
Para efectuar operações de manutenção sobre as palavras do utilizador efectue os seguintes passos:
1. Abrir o menu Ver do Eugénio.
2. Seleccionar a opção Dicionário e escolher Palavras do Utilizador. Irá surgir a caixa de
diálogo apresentada na Figura 10.
3. Para introduzir uma nova palavra pressionar o botão Nova. Seleccionando uma palavra
da lista pode apagá-la pressionando o botão Apagar ou então pode alterar o seu número
de ocorrências, alterando assim, a sua importância para o utilizador.
4. Carregar no botão OK para as operações terem efeito.
196
Figura 10 – Caixa de diálogo para manutenção das palavras do utilizador.
Para efectuar operações de manutenção sobre as palavras do utilizador efectue os seguintes passos:
1. Abrir o menu Ver do Eugénio.
2. Seleccionar a opção Dicionário e escolher Abreviaturas do Utilizador. Irá surgir a
caixa de diálogo apresentada na Figura 11.
3. Para introduzir uma nova abreviatura pressionar o botão Nova. Seleccionando uma abreviatura da lista pode apagá-la pressionando o botão Apagar ou então pode alterar a
sua expansão.
4. Carregar no botão OK para as operações terem efeito.
197
Figura 11 – Caixa de diálogo para manutenção das abreviaturas do utilizador.
4.6 Informações adicionais
Estas configurações, quer relativas à interacção, quer relativas à predição, encontram-se guardadas num conjunto de ficheiros.
Para uma adaptação das características de interacção ao utilizador, o Eugénio mantém um ficheiro que discrimina o valor para cada opção disponível. Este ficheiro tem o mesmo nome do
utilizador e extensão.cfg. A Figura 12 apresenta um possível conteúdo deste ficheiro de texto.
Os dados utilizados na adaptação da predição ao utilizador encontram-se guardados em dois
ficheiros. No primeiro, com o nome do utilizador e extensão .pal encontram-se guardadas as
palavras já escritas pelo utilizador assim como o seu número de ocorrências. No segundo, também com o nome do utilizador mas com extensão .par são guardados os pares de palavras já
escritos pelo utilizador assim como o seu número de ocorrências. As abreviaturas do utilizador
encontram-se no ficheiro com o nome do utilizador e extensão .abr. Caso o utilizador não tenha
indicado o seu nome o Eugénio utiliza os ficheiros util.pal, util.par e util.abr.
198
POSICAO_INICIAL_JANELA_X 150
POSICAO_INICIAL_JANELA_Y 200
LARGURA_JANELA 803
ALTURA_JANELA 308
NUMERO_MAXIMO_PALAVRAS_PREDITAS 8
TAMANHO_LETRAS_PALAVRAS_PREDITAS 10
PALAVRAS_PREDITAS_EM_MAIUSCULAS 1
TEMPO_DE_PREDICAO 1000
COEFICIENTE_FREQUENCIA_PALAVRA 100
COEFICIENTE_FREQUENCIA_PAR_PALAVRAS 100
COEFICIENTE_CLASSE_PALAVRA 0
COEFICIENTE_GENERO_PALAVRA 0
COEFICIENTE_NUMERO_PALAVRA 0
AGENTE_ACTIVO 1
TECLAS_COMPLETAR 48
COEFICIENTE_FREQUENCIA_PALAVRA_UTILIZADOR 100
COEFICIENTE_FREQUENCIA_PAR_PALAVRAS_UTILIZADOR 100
ADAPTACAO_UTILIZADOR 1
OUVIR_ANTES_COMPLETAR 0
NUMERO_MAXIMO_LETRAS_PALAVRAS_PREDITAS 12
OUVIR_COM_RATO_SOBRE 1
TECLA_EXPANSAO_ABREVIATURAS Tab
NOME_AGENTE Eugénio
TECLA_SINTESE_PALAVRA F11
TECLA_SINTESE_FRASE F12
COR_LETRAS Azul
COR_FUNDO Amarelo
LETRAS_NAO_PRETENDIDAS
SEQUENCIAS_LETRAS_NAO_PRETENDIDAS
OUVIR_DEPOIS_COMPLETAR 0
INICIAR_JANELA_MINIMIZADA 0
REPOSICIONAR_JANELA 0
PERSEGUIR_CURSOR_TEXTO 0
VER_ANTES_COMPLETAR 0
VELOCIDADE_VARRIMENTO 3000
LATENCIA_INTERRUPTORES_VARRIMENTO 100
PISTA_SONORA_BEEP_VARRIMENTO 0
PISTA_SINTETIZADA_VARRIMENTO 0
NOME_TECLADO QwertySimples
METODO_VARRIMENTO Nenhum
NUMERO_MAXIMO_CICLOS_VARRIMENTO 3
TIPO_LETRA MS;Sans;Serif
NOME_SINTETIZADOR_FALA Nenhum
Figura 12 – Conteúdo das linhas de cada um dos ficheiros de dados.
199
200
5. Contactos
Para mais informações, comentários ou sugestões contactar:
Luís Caldas de Oliveira
Laboratorio de Sistemas de Língua Falada do INESC-ID
Rua Alves Redol 9, 1000-029 Lisboa PORTUGAL
Tel: +351.213100268
Fax: +351.213145843
[email protected]
http://www.l2f.inesc-id.pt/~lco
Luis Garcia
Escola Superior de Tecnologia e Gestão de Beja
Rua Afonso III, 1, 7800-050 Beja PORTUGAL
Tel: +351 284 311 540
Fax: +351 284 327 184
[email protected]
http://www.estig.ipbeja.pt/~lfnhbg
201
202
Anexos
203
204
Anexo A - Grelhas desenvolvidas no Centro de Paralisia Cerebral de Beja para o
registo dos dados obtidos no Processo de Aconselhamento de uma Tecnologia de
Apoio.
205
206
Processo de Intervenção com o Recurso às Tecnologias de Apoio
Nome:_______________________________________
207
208
Plano de Avaliação
Constituição da Equipa
Identificação e Caracterização da Criança
Identificação
Caracterização
Objectivos da Intervenção
Avaliação das Capacidades Sensoriais
Avaliação das Capacidades Cognitivas
Avaliação das Capacidades de Comunicação
Avaliação das Capacidades Físicas: Posicionamento
Avaliação das Capacidades Físicas: Acesso
Aconselhamento
Hardware Aconselhado
Software Aconselhado
Financiamento
Treino
Implementação e Teste
Acompanhamento
209
210
Constituição da Equipa
Coordenador da Equipa:_______________________________________
Função: _____________________________________________________
Membros da Equipa:
Nome
Função
211
Identificação e Caracterização da Criança
Identificação
Nome: ______________________________________________________
Data de Nascimento: ____ / ____/ ____
Nome do Pai: ________________________________________________
Nome da Mãe: _______________________________________________
Morada: ____________________________________________________
Telefone: __________________
Diagnóstico: _________________________________________________
____________________________________________________________
____________________________________________________________
Caracterização
Posicionamento: ______________________________________________
____________________________________________________________
Mobilidade: _________________________________________________
____________________________________________________________
Manipulação: _______________________________________________
____________________________________________________________
Visão: ______________________________________________________
____________________________________________________________
Audição: ___________________________________________________
____________________________________________________________
212
Capacidades Cognitivas: _______________________________________
____________________________________________________________
____________________________________________________________
____________________________________________________________
____________________________________________________________
Nível de Aquisições: __________________________________________
____________________________________________________________
____________________________________________________________
____________________________________________________________
Capacidades Comunicativas: ___________________________________
____________________________________________________________
____________________________________________________________
____________________________________________________________
Comportamento:_____________________________________________
____________________________________________________________
Apoios Educativos e Tecnologia Utilizada até à Data:_______________
____________________________________________________________
____________________________________________________________
____________________________________________________________
Observações: ________________________________________________
____________________________________________________________
____________________________________________________________
213
Objectivos da Intervenção
Actividades, Dificuldades e Local de Trabalho
214
Avaliação das Capacidades Sensoriais
(1) Visão: campo visual, perseguir objectos, procurar objectos, acomodação visual, acuidade
visual; (2) Percepção Visual; (3) Tacto; (4) Audição
215
Avaliação das Capacidades Cognitivas
(1) Memória; (2) Resolução de Problemas; (3) Motivação; (4) Atenção
216
Avaliação das Capacidades de Comunicação
(1) Categorias; (2) Sequências; (3) Iguais; (4) Nível de interacção social; (5) Reconhecimento de letras ou palavras
217
Avaliação das Capacidades Físicas: Posicionamento
(1) Postura; (2) Reflexos; (3) Tónus muscular; (4) Sentar; (5) Posicionamento
218
Avaliação das Capacidades Físicas: Acesso
(1) Identificação dos locais de controlo; (2) Selecção das interfaces candidatas; (3) Realização de testes comparativos
Local de
Interface
Avaliação Quanti-
Avaliação Qualitati-
Controlo
Candidata
tativa
va
Rapidez
Data
Precisão
219
Aconselhamento
Hardware Aconselhado
Software Aconselhado
220
Financiamento
(1) Entidade Financiadora; (2) Contacto na entidade; (3) Prazo de entrega; (4) Montante
envolvido
221
Treino
Horário:
Duração:
Local:
Técnicos:
Programa:
222
Implementação e Teste
Data:
Hora:
Local:
Técnicos:
Notas:
223
Acompanhamento
Data
Hora
Local
Obs
224
Download

Obra completa - Biblioteca Nacional de Portugal