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