控えめにテキストのレンダリングを変える方法は?


12

音声認識で使用するためのemacs拡張機能を作成しています。特定の機能に関するヘルプを探しています。音声認識エンジン(Dragon)が一貫して認識できない単語もあります。何回訓練してもかまいませんが、特定の単語を認識するのは簡単ではありません。通常、トピックについて書いているときやコーディングしているときは、同じ単語を何度も何度も使用します。

そのため、オーバーレイを使用して、バッファ内の単語のレンダリング方法を変更するモードを作成しました。単語にランダムな文字を使用し、ランダムな色で下線を引き、その上にランダムな発音区別符号(アクセント、ウムラウトなど)を付けます。以下にスクリーンショットを示します(おそらく、マーク/下線を表示するにはズームする必要があります)。

ここに画像の説明を入力してください

次に、「purple p hair」と言うと、「a」の下に紫色の下線が付いた単語が検索されます。そのため、上記のスクリーンショットでは、emacsが「regexp-quote」と入力してしまうと言っています。

これにより、認識機能が一貫して認識に優れている有限の単語セットを使用して、画面上にある既に使用した単語を参照できます。

たまに衝突が発生する場合を除き、非常にうまく機能します。それを行うために(random)、衝突を回避するようにアルゴリズムを変更する代わりに、またはアルゴリズムに変更を割り当てることで、単語のmd5ハッシュからのバイトを使用するのと同じ方法で一貫して単語を参照することを学ぶことができます。私は6つの簡単に区別できる色(下線が1文字幅で1ピクセルの太さだけでは難しい)と3つの簡単に区別できる発音区別記号(互いに区別しやすく、上記の下線と混同しにくい)だけを見つけました線または下線と重なる)、上のソースの上部に表示されます。

衝突の頻度を減らすために、レンダリングを変更する方法がもっと必要です。理想的には、レンダリングの変更は次のようになります。

  • テキストの残りの部分から不快にならないでください。これにより、たとえば、inverse-videoプロパティを却下することになりました。
  • 他の変更と簡単に混同しないでください。上線は、前の行の下線と間違えやすい。フォントサイズが非現実的に大きくない限り、多くの発音区別符号は似ています。
  • 他の変更がある場所の空間的に近くにあります。今、目がターゲティングキャラクターを見つけると、すべての情報、マーカー、下線、文字がそこにあります。
  • ダイアクリティカルマークを正しくレンダリングする固定幅フォント(コーディングに必要)でうまく動作します(マークを正しくレンダリングするには、ConsolasからDejaVu Sans Monoに切り替える必要がありました)
  • ラテン系のアルファベット文字に取り組みます。たとえば、アラビア語の結合マークがありますが、ラテンアルファベット文字では結合しません。
  • 文字の色は変更しないでください。これは既に構文の強調表示に使用されているためです。
  • 実際、emacs lispを使用してemacsで実行可能になります;)

レンダリングを制御する特殊なUnicode文字が悪用されて、新しい可能性が開かれる可能性がありますか?または、より多くの色を簡単に区別できるように下線を太くする方法はありますか?または、Unicode以外の文字の上にマークをレンダリングできる他のあいまいなemacs機能がありますか?


あなたの質問に対する直接的な答えではありませんが、おそらくオーバーレイを使用して新しいキャラクターの外観を与えるいくつかのアイデアです。1つのアイデアは、2つのオーバーレイを連結/サンドイッチすることです-それらを通常の文字と同じスペースに強制的に合わせます-たとえば、最初の文字は色が追加された細い線で(char-to-string ?\uFEFF)、もう1つは縮小されたターゲット文字です両方が収まるようにサイズを調整します。もう一つのアイデアは、垂直裏抜けを使用することで(で利用できるでしょういくつかのライブラリで使用されているものと同様のフォントが、すべてではない)vline.el emacswiki.org/emacs/VlineMode
lawlist

@lawlist:そ​​のユニコード行のアイデアは興味深いです、それは私に「副業」をさせるでしょう。しかし、次のキャラクターのサイズを小さくする方法はありますか?displayプロパティで使用する画像を生成することもできますが、AFAICTはemacsにテキストを画像にレンダリングさせる方法がないため、emacsの外部で画像を作成する必要があります。
ジョセフガービン

このコメントは、(私が削除されたことを)以前のコメントを優先して、次のリンクのコードも同様に更新されました-それは(私が現在のスレッドに下記掲載することを答えと同じであるそのうちの一つ)の三つの例が含まれます。 stackoverflowのを.com / questions / 23744237 /…
ローリスト

回答:


4

別の可能性は、行番号を表示し、単語の前に行番号を言うか、または正確な行番号を取得するのは面倒なので、番号の+または-5または10行以内でアルゴリズムを検索することができますいう。

または、作業中の領域または関数を宣言して、すべての検索をそこにのみ表示させることもできます。私はそれが衝突を制限するだろうと思います。

また、特定の色の単語の前後にユニコードシンボルをレンダリングして、目立つようにすることもできます。また、別の色で単語にボックスまたは下線を付けます。このようにして、6語の色* 6記号の色* N記号の可能性を持たせることができます。おそらく、10個の良いシンボルを見つけ、360個の組み合わせを持つことができます。たとえば、「青黄色の星」と言って、ここで猫という言葉を参照できます。

ここに画像の説明を入力してください

星が非常に不快な場合は、:boxと2つの異なる:underlinesを結合できます。

したがって、ここで「青黄赤」を使用して「tree」という単語を参照すると、216個の組み合わせを使用できます。

ここに画像の説明を入力してください


1
誰かが他のトリックを思い付くかどうかを確認するのをしばらく待ちましたが、シンボルを追加するとインデントがスローされる可能性があるため、おそらく二重下線の色を使用します。受け入れました、ありがとう。
ジョセフガービン

2

ace-jump-modeを聞いたことがありますか?

指定した要件を満たしていませんが、達成しようとしているものに完全に適合するようです。ユーザーは、2語または3語だけを言って、任意の単語を指定できます。

提供される文字セットを定義できるため、区別しにくい子音を避けることができます。次に、使用者は「fix A nine」と言うだけで、で始まる9番目の単語を修正できaます。


ace-jump-modeがうまくいかなかった理由については、tmalsburgの投稿に対する私のコメントをご覧ください。
ジョセフガービン

1

興味深い質問。興味深い提案がいくつかあると思います。

私に起こる小さな提案の1つは、下線に異なる色とスタイルを使用することです。elispのマニュアル、ノード参照のFace Attributes属性について:underline、その:colorおよび:styleコンポーネントを。

属性を試すこともできます :boxやさまざまな線幅とスタイルをますが、それは恐ろしいことです。


1

ターゲットの単語を選択する別の方法を提案して答えます。単語の半分をハイライトします(ランダムに選択)。ユーザーは、対象の単語が強調表示されている場合は「はい」、そうでない場合は「いいえ」と言います。ユーザーが「はい」と言った場合、強調表示されたすべての単語を取り、それらの半分をランダムに強調表示します。ユーザーが「いいえ」と言った場合、強調表示されなかった単語の半分をランダムに強調表示します。繰り返しますが、ユーザーは「はい」または「いいえ」と言って、対象の単語が強調表示されているかどうかを示します。ターゲット単語のみが強調表示されるまで、それを繰り返します。

このアプローチの利点:

  • これは、画面上にいくつの単語があっても動作します。
  • 派手な色、フォント、または記号は必要ありません。モノクロディスプレイで十分です。
  • 単語が強調表示されているかどうかを簡単に判断できるため、非常に低い認知負荷。

欠点:「はい」と「いいえ」を頻繁に言う必要があります。ただし、これは次のバリエーションのアイデアによって修正されます。単語を強調表示せず、色を使用します。簡単に区別できる6色があると言います。つまり、画面に100個の単語がある場合、ターゲット単語を選択するには、平均で2.6色の名前を付ける必要があります。1000個の単語がある場合、平均で3.9色の名前を付ける必要があります。


1
残念ながら、話されている単語の数は誤解を招く指標です。このスタイルのソリューションの問題は、知覚/行動の往復が含まれていることです。色を見て、反応して、見て、反応して、見る必要があります。それぞれの間に目を向けるのを止めずに3つの単語を言うことは、特に低遅延のDragonで行うソリューションよりも実際には速くなければなりません。これらの往復が問題にならない場合は、ace-jump-modeを使用します。ダイアクリティカルマークを使用すると、画面を一度見て、各単語の後にドラゴンが反応するために一時停止することなく、私が言う必要のある文字列全体を知ることができます。
ジョセフガービン

1

以下は、xpmイメージ形式をサポートするグラフィカルEmacsバージョンのxpmイメージでオーバーレイを使用した例です。幅は11ピクセルです。高さ20ピクセル。また、ユーザーが指定した数の4色があります。私は、Mac実行しているのSnow Leopard 10.6.8で午前のEmacsを使用しているとき、私は好むフォントがある-*-Courier-normal-normal-normal-*-18-*-*-*-m-0-iso10646-1- frame-char-width11で、frame-char-height私のように大文字の「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を生成できますが、私が期待していたほど正確ではありませんでした-外部ユーティリティを使用するための指示へのリンク: https:/ /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ビットマップに関する誤った記述を削除しました。
法律家
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.