Estoy escribiendo una extensión emacs para usar con reconocimiento de voz, y estoy buscando ayuda con una característica en particular. Algunas palabras que el reconocedor de voz (Dragón) reconoce de manera sistemática de manera deficiente: no importa cuántas veces lo entrenes, simplemente apestará al reconocer ciertas palabras. Al mismo tiempo, generalmente cuando escribe sobre un tema o cuando codifica, usará muchas de las mismas palabras una y otra vez.
Así que he escrito un modo que usa superposiciones para cambiar cómo se representan las palabras en el búfer. Toma una letra aleatoria en la palabra, la subraya en un color aleatorio y coloca una marca diacrítica aleatoria (acento, diéresis, etc.) sobre ella. Aquí hay una captura de pantalla (probablemente necesitará hacer zoom para ver marcas / subrayados):
Luego puede decir "pelo púrpura p" y buscará la palabra con un subrayado púrpura debajo de su 'a' con una marca diacrítica que se parece al cabello y escribirá esa palabra por usted. Entonces, en la captura de pantalla anterior que dice que eso haría que emacs escriba "regexp-quote" por usted.
La idea es que esto le permite referirse a cualquier palabra que ya haya usado que esté en pantalla usando un conjunto finito de palabras que el reconocedor es consistentemente bueno para reconocer.
Funciona bastante bien, excepto que ocasionalmente hay una colisión. Para hacerlo, puedo aprender a referirme constantemente a las palabras de la misma manera que estoy usando bytes del hash md5 de la palabra en lugar de (random)
tener un algoritmo que asigne los cambios para evitar colisiones. Solo he encontrado 6 colores fácilmente distinguibles (es difícil cuando el subrayado tiene solo un carácter de ancho y un solo píxel de grosor) y 3 signos diacríticos fácilmente distinguibles (fáciles de distinguir entre sí y tampoco confusos con un subrayado en el anterior línea o superpuesta con el subrayado), visto en la parte superior de la fuente de arriba.
Necesito más formas de alterar el renderizado para reducir la frecuencia de colisión. Idealmente, una modificación de representación debería:
- No ser discordante con el resto del texto. Esto me ha llevado a descartar, por ejemplo, la propiedad de video inverso.
- No se puede confundir fácilmente con otros cambios. Los overlines se confunden fácilmente con subrayados en la línea anterior. Muchos de los signos diacríticos se ven similares a menos que el tamaño de la fuente sea prácticamente impráctico.
- Esté espacialmente cerca de donde están los otros cambios. En este momento, una vez que mi ojo encuentra el personaje objetivo, toda la información está allí, el marcador, el subrayado y la letra.
- Funciona bien con una fuente de ancho fijo (necesaria para la codificación) que representa correctamente los signos diacríticos (tuve que cambiar a DejaVu Sans Mono de Consolas para que las marcas se procesen correctamente)
- Trabajar en letras del alfabeto latino. Hay marcas de combinación árabes, por ejemplo, pero no se combinan en caracteres del alfabeto latino.
- No cambie el color de la letra, ya que eso ya se está utilizando para resaltar la sintaxis.
- Realmente sea factible en emacs con emacs lisp;)
¿Quizás hay caracteres especiales Unicode que controlan el renderizado que podrían ser abusados para abrir nuevas posibilidades? ¿O una forma de engrosar los subrayados para poder distinguir fácilmente más colores? ¿O alguna otra característica oscura de emacs que le permite representar marcas en la parte superior de los caracteres además de Unicode?
(char-to-string ?\uFEFF)
y el otro es un personaje objetivo que se reduce en tamaño para que ambos quepan. Otra idea sería utilizar un tachado vertical (disponible en algunas fuentes, pero no en todas) similar a lo que se usa en la bibliotecavline.el
emacswiki.org/emacs/VlineMode