Estou escrevendo uma extensão do emacs para uso com reconhecimento de fala e estou procurando ajuda com um recurso específico. Algumas palavras que o reconhecedor de fala (Dragão) reconhece consistentemente mal - não importa quantas vezes você o treine, será uma merda reconhecer algumas palavras. Ao mesmo tempo, normalmente, quando você estiver escrevendo sobre um tópico ou codificando, estará usando muitas das mesmas palavras repetidamente.
Então, eu escrevi um modo que usa sobreposições para alterar a forma como as palavras são renderizadas no buffer. Ele pega uma letra aleatória na palavra, a sublinha em uma cor aleatória e coloca uma marca diacrítica aleatória (acento, trema etc.) por cima dela. Aqui está uma captura de tela (você provavelmente precisará aumentar o zoom para ver marcas / sublinhados):
Então você pode dizer "cabelo p roxo" e ele procurará a palavra com um sublinhado roxo embaixo do 'a' com uma marca diacrítica que se parece com cabelo e digite essa palavra para você. Portanto, na captura de tela acima dizendo que faria com que o emacs digite "regexp-quote" para você.
A idéia é que isso permita que você se refira a qualquer palavra que você já tenha usado na tela usando um conjunto finito de palavras que o reconhecedor é sempre bom em reconhecer.
Funciona muito bem, exceto que ocasionalmente há uma colisão. Para fazer isso, eu posso aprender a me referir consistentemente às palavras da mesma maneira que estou usando bytes do hash md5 da palavra, em vez de (random)
ou ter um algoritmo para atribuir as alterações, para evitar colisões. Encontrei apenas 6 cores facilmente distinguíveis (é difícil quando o sublinhado tem apenas um caractere de largura e um único pixel de espessura) e 3 marcas diacríticas facilmente distinguíveis (fáceis de distinguir uma da outra e também não podem ser confundidas com uma sublinhada acima) sobreposição ou sublinhado), visto na parte superior da fonte acima.
Preciso de mais maneiras de alterar a renderização para reduzir a frequência de colisão. Idealmente, uma modificação de renderização:
- Não seja dissonante com o resto do texto. Isso me levou a descartar, por exemplo, a propriedade inverso-vídeo.
- Não seja facilmente confundível com outras alterações. As sublinhadas são facilmente confundidas com as sublinhadas da linha anterior. Muitas marcas diacríticas parecem semelhantes, a menos que o tamanho da fonte seja impraticávelmente grande.
- Esteja espacialmente próximo de onde estão as outras mudanças. No momento em que meu olho encontra o caractere alvo, todas as informações estão lá, o marcador, o sublinhado e a letra.
- Trabalhe bem com uma fonte de largura fixa (necessária para a codificação) que renderize corretamente as marcas diacríticas (tive que mudar para o DejaVu Sans Mono da Consolas para que as marcas sejam renderizadas corretamente)
- Trabalhar em letras do alfabeto latino. Existem marcas de combinação arábica, por exemplo, mas elas não combinam nos caracteres do alfabeto latino.
- Não altere a cor da letra, pois ela já está sendo usada para realçar a sintaxe.
- Seja factível no emacs com o emacs lisp;)
Talvez haja caracteres unicode especiais controlando a renderização que possam ser abusados para abrir novas possibilidades? Ou uma maneira de engrossar os sublinhados para poder distinguir facilmente mais cores? Ou algum outro recurso obscuro do emacs que permite renderizar marcas sobre os caracteres, além do unicode?
(char-to-string ?\uFEFF)
e o outro é um caractere de destino reduzido em tamanho para que ambos se encaixem. Outra idéia seria usar uma passagem vertical (disponível em algumas fontes, mas não em todas) semelhante ao que é usado na bibliotecavline.el
emacswiki.org/emacs/VlineMode