텍스트 렌더링을 눈에 띄게 변화시키는 방법은 무엇입니까?


12

음성 인식에 사용할 emacs 확장을 작성 중이며 특정 기능에 대한 도움말을 찾고 있습니다. 음성 인식기 (드래곤)가 지속적으로 제대로 인식하지 못하는 단어는 훈련하는 횟수에 관계없이 특정 단어를 인식하는 데 방해가됩니다. 일반적으로 주제에 대해 글을 쓰거나 코딩 할 때 같은 단어를 여러 번 반복해서 사용하게됩니다.

그래서 오버레이를 사용하여 버퍼에서 단어가 렌더링되는 방식을 변경하는 모드를 작성했습니다. 단어에 임의의 문자를 사용하고 임의의 색으로 밑줄을 긋고 그 위에 임의의 발음 구별 부호 (악센트, 움라우트 등)를 표시합니다. 다음은 스크린 샷입니다 (표시 / 밑줄을 보려면 확대해야 함).

여기에 이미지 설명을 입력하십시오

그런 다음 "보라색 p 머리"라고 말할 수 있으며 'a'아래에 자주색 밑줄이있는 단어가 머리처럼 보이는 발음 구별 부호가있는 단어를 찾아서 입력합니다. 따라서 위의 스크린 샷에서 emacs가 "regexp-quote"를 입력하게 할 것입니다.

아이디어는 인식기가 지속적으로 인식하는 유한 한 단어 세트를 사용하여 화면에 이미 사용 된 단어를 참조 할 수 있다는 것입니다.

때로는 충돌이있는 경우를 제외하고는 꽤 잘 작동합니다. 이를 위해 단어의 md5 해시에서 바이트를 사용하는 대신 (random)알고리즘이 충돌을 피할 수 있도록 변경 사항을 할당하는 것과 동일한 방식으로 단어를 일관되게 참조하는 방법을 배울 수 있습니다 . 나는 쉽게 구별 할 수있는 6 가지 색상 (밑줄이 하나의 문자 너비와 단일 픽셀 두께 일 때 어렵습니다)과 쉽게 구별 할 수있는 발음 구별 표시 3 개 (서로 구분하기 쉽고 위의 밑줄과 혼동 할 수 없음)를 발견했습니다. 위의 소스 상단에서 볼 수 있습니다.

충돌 빈도를 줄이기 위해 렌더링을 변경하는 더 많은 방법이 필요합니다. 이상적으로 렌더링 수정은 다음과 같습니다.

  • 텍스트의 나머지 부분에서 부주의하지 마십시오. 이로 인해 예를 들어 in-video 속성을 무시했습니다.
  • 다른 변경 사항과 쉽게 혼동되지 않습니다. 오버 라인은 이전 라인의 밑줄로 쉽게 착각됩니다. 글꼴 크기가 비실용적으로 크지 않으면 많은 분음 부호가 비슷해 보입니다.
  • 다른 변화가있는 곳에 공간적으로 가까이 있어야합니다. 지금 내 눈이 타겟팅 캐릭터를 찾으면 모든 정보, 마커, 밑줄 및 글자가 있습니다.
  • 분음 부호를 올바르게 렌더링하는 고정 너비 글꼴 (코딩에 필요)을 사용하여 잘 작동합니다 (마크가 올바르게 렌더링되도록 Consolas에서 DejaVu Sans Mono로 전환해야 함)
  • 라틴 알파벳 문자로 작업하십시오. 예를 들어 아랍어 결합 표시가 있지만 라틴 알파벳 문자에는 결합되지 않습니다.
  • 글자 색상은 이미 구문 강조 표시에 사용되고 있기 때문에 변경하지 마십시오.
  • emacs lisp를 가진 emacs에서 실제로 할 수있다;)

어쩌면 새로운 가능성을 열어주기 위해 남용 될 수있는 렌더링을 제어하는 ​​특수 유니 코드 문자가 있습니까? 또는 밑줄을 두껍게하여 더 많은 색상을 쉽게 구별 할 수있는 방법은 무엇입니까? 또는 유니 코드 외에 문자 위에 마크를 렌더링 할 수있는 다른 모호한 이맥스 기능?


질문에 대한 직접적인 대답은 아니지만 오버레이를 사용하여 새로운 등장 인물을 제공하는 몇 가지 아이디어 일 수 있습니다. 한 가지 아이디어는 두 개의 오버레이를 함께 연결 / 샌드위치하여 일반 문자와 동일한 공간에 맞추도록하는 것입니다. 예를 들어 첫 번째 문자는 색상이 추가 된 얇은 선 (char-to-string ?\uFEFF)이고 다른 문자는 축소 된 대상 문자입니다 크기 때문에 둘 다 맞습니다. 또 다른 아이디어는 라이브러리 emacswiki.org/emacs/VlineModevline.el
lawlist

@lawlist : 그 유니 코드 라인 아이디어는 흥미 롭습니다. '사이드 라인'을 할 수있게 해줍니다. 그래도 다음 캐릭터의 크기를 줄이는 방법을 알고 있습니까? display 속성과 함께 사용하기 위해 이미지를 생성 할 수는 있지만 AFAICT는 emacs가 텍스트를 이미지로 렌더링하도록 할 수있는 방법이 없으므로 이미지를 emacs 외부로 만들어야합니다.
Joseph Garvin

이 코멘트 (I 제거하는) 이전의 주석을 대체하고 다음 링크의 코드가 아니라 업데이트되었습니다 -이 세 가지 예를 (그 중 하나는 내가 현재의 thread로 아래 게시하는 대답과 동일)이 포함되어 유래를 .com / questions / 23744237 /…
법률리스트

답변:


4

또 다른 가능성은 줄 번호를 표시하고 단어 앞에 줄 번호를 말하거나 정확한 줄 번호를 찾는 것이 귀찮기 때문에 알고리즘을 검색 한 번호의 + 또는-5 또는 10 줄 내에서 말하다.

또는 현재 작업중인 지역이나 함수를 선언하고 모든 검색 만 보도록하십시오. 충돌이 제한 될 것 같아요.

또한 주어진 색상으로 단어의 전후에 유니 코드 기호를 렌더링하여 눈에 잘 띄도록 할 수 있습니다. 또한 다른 색으로 단어를 상자 또는 밑줄로 표시하십시오. 이 방법으로 6 단어 색상 * 6 기호 색상 * N 기호 가능성을 가질 수 있습니다. 10 개의 좋은 기호를 찾고 360 개의 조합을 가질 수 있습니다. 예를 들어 여기에서 cat이라는 단어를 나타 내기 위해 "파란 노랑 별"이라고 말할 수 있습니다.

여기에 이미지 설명을 입력하십시오

별이 너무 왜곡되면 : box와 두 개의 다른 : 밑줄을 연결할 수 있습니다.

여기서 "파랑 노랑 빨강"을 사용하여 216 개의 조합을 사용할 수있는 단어 트리를 참조 할 수 있습니다.

여기에 이미지 설명을 입력하십시오


1
누군가가 다른 트릭을 생각해 내기를 기다리는 동안 잠시 기다렸지 만 기호를 추가하면 들여 쓰기가 중단 될 수 있기 때문에 이중 밑줄 색을 사용할 것입니다. 감사합니다
Joseph Garvin

2

에이스 점프 모드에 대해 들어 보셨습니까 ?

지정한 요구 사항을 충족하지 않지만 달성하려는 목표에 완벽하게 맞는 것처럼 보입니다. 사용자는 2 ~ 3 단어 만 말하여 단어를 지정할 수 있습니다.

제공하는 문자 세트를 정의 할 수 있으므로 구별하기 어려운 자음을 피할 수 있습니다. 그런 다음 사용은 "fix A nine" 이라고 말하고로 시작하는 9 번째 단어를 수정하십시오 a.


ace-jump-mode가 작동하지 않는 이유는 tmalsburg의 게시물에 대한 내 의견을 참조하십시오.
Joseph Garvin

1

흥미로운 질문입니다. 나는 당신이 흥미로운 제안을받을 것이라고 확신합니다.

나에게 발생하는 작은 제안 중 하나는 밑줄에 다른 색상과 스타일을 사용하는 것입니다. Elisp 설명서, 노드 참조 Face Attributes특성에 대한 :underline:color:style구성 요소를.

속성 :box과 다른 선 너비와 스타일을 실험 해 볼 수도 있지만 너무 어색합니다.


1

대상 단어를 선택하는 다른 방법을 제안하여 대답하겠습니다. 단어의 절반을 강조 표시합니다 (임의로 선택). 대상 단어가 강조 표시되면 사용자는 "예"라고 말하고 그렇지 않으면 "아니오"라고 말합니다. 사용자가 "예"라고 답한 경우 강조 표시된 모든 단어를 가져 와서 임의로 절반을 강조 표시하십시오. 사용자가 "아니오"라고 대답 한 경우 강조 표시되지 않은 단어의 절반을 임의로 강조 표시하십시오. 다시 사용자는 "예"또는 "아니오"라고 말하여 대상 단어가 강조 표시되는지 여부를 나타냅니다. 대상 단어 만 강조 표시 될 때까지 반복하십시오.

이 방법의 장점은 다음과 같습니다.

  • 화면에 단어 수에 관계없이 작동합니다.
  • 화려한 색상, 글꼴 또는 기호가 필요하지 않습니다. 흑백 표시면 충분합니다.
  • 단어 강조 표시 여부를 쉽게 알 수 있기 때문에인지 부하가 ​​매우 낮습니다.

단점 : "예"와 "아니오"라고 너무 자주 말해야합니다. 그러나 이것은 다음과 같은 변형 된 아이디어로 수정됩니다. 단어를 강조 표시하지 말고 색상을 사용하십시오. 당신은 당신이 쉽게 구별 할 수있는 6 가지 색상이 있다고 말합니다. 즉, 화면에 100 개의 단어가있는 경우 대상 단어를 선택하려면 평균 2.6 색의 이름을 지정해야합니다. 1000 개의 단어가있는 경우 평균 3.9 색의 이름을 지정해야합니다.


1
불행히도 말한 단어의 수는 잘못된 측정법입니다. 이 스타일의 솔루션의 문제점은 인식 / 액션 왕복이 포함되어 있다는 것입니다. 나는 색깔을보고, 반응하고,보고, 반응하고,보아야합니다. 각 단어 사이를 훑어 보지 않고 3 단어를 말하는 것은 실제로, 특히 지연 시간이 짧은 Dragon의 솔루션보다 더 빠릅니다. 이 왕복 여행이 문제가되지 않으면 ace-jump-mode를 사용하십시오. 분음 부호를 사용하면 화면을 한 번보고 각 단어 다음에 Dragon이 반응하도록 일시 중지하지 않고도 말해야 할 내용의 전체 문자열을 알 수 있습니다.
Joseph Garvin

1

다음은 xpm 이미지 형식을 지원하는 그래픽 Emacs 버전의 xpm 이미지와 함께 오버레이를 사용하는 예입니다. 너비는 11 픽셀입니다. 20 픽셀 높이; 사용자가 4 개의 가능한 색상 수를 지정했습니다. 난 맥 실행 스노우 레오파드 10.6.8에서 오전 이맥스를 사용할 때 선호하는 글꼴입니다 -*-Courier-normal-normal-normal-*-18-*-*-*-m-0-iso10646-1- (가) frame-char-width11과는 frame-char-height내가 int로서 대문자 "A"의 왼쪽에 얇은 수직 노란 선을 추가 한 20입니다 커스텀 이미지를 그리는 방법의 예. 포인트에서 문자의 대체는 프로그래밍 방식으로 (char-after (point))해당 숫자 (이 경우 대문자 "A"에 대해 65 임)를 사용하고 해당 변수를 예를 들어 (cond ((eq (char-after (point)) 65) cap-ltr-a-xpm) . . .- 오버레이 배치-예 :(overlay-put (make-overlay (point) (1+ (point))) 'display cap-ltr-a-xpm). 단어 display중간의 문자에 대한 오버레이 속성으로 인해 단어의 첫 번째 부분이 이전 줄의 끝에 속한다고 생각하지 않기 때문에 잘린 버퍼와 단어 줄 바꿈 모두에서 매우 잘 작동 합니다. . 물론 좋아하는 xpm 이미지의 사용자 정의 라이브러리를 만드는 데 시간이 걸립니다.

ImageMagick은 특정 글꼴 모음과 크기를 기반으로 특정 문자의 반 정확한 xpm을 생성 할 수 있지만, 기대했던 것만 큼 정확하지는 않았습니다. 다음은 해당 외부 유틸리티를 사용하기위한 지침 링크입니다 . /stackoverflow.com/a/14168154/2112489 간단히 말해서는, 사용자는 그 / 그녀가 원하는대로 XPM 이미지를 사용자 정의 시간을 보낼 수 있도록 준비해야한다.

(defun xpm-example ()
(interactive)
"Doc-string"
  (let* (
      (cap-ltr-a-xpm `(image :type xpm :mask nil :ascent center :data
        "/* XPM */
        static char * letters_xpm[] = {
        /* columns rows colors chars-per-pixel */
        /* columns = 1 pixel in width -- see also (frame-char-width) */
        /* rows = 1 pixel in height -- see also (frame-char-height) */
        \"11 20 4 1\",
        \". c #000000\",
        \"+ c #FF0000\",
        \"@ c #7F0000\",
        \"% c yellow\",
        \"%..........\",
        \"%....++....\",
        \"%....++....\",
        \"%..++..++..\",
        \"%..++..++..\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++++++++++\",
        \"%++++++++++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%..........\"};"))  )
    (overlay-put (make-overlay (point) (1+ (point))) 'display cap-ltr-a-xpm)))

@wasamasa-감사합니다. XBM 비트 맵에 대한 잘못된 설명을 제거했습니다.
lawlist
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.