keyboard
keyboard
たまたま、NHKのプラスを見ていたんだ。そしたら、リアルタイムに生字幕を出す舞台裏をやってた。
聴覚障害者にもTVを楽しんでいただけるように生字幕を出すサービスだ。裏では、アナウンサーの声を聞いて、それを文字おこしして表示するって仕掛け。パソコン版の速記だな。速記協会が絶賛後援して番組はできていた。
いかに、正確に、速く、表情豊かに表現するか、普通のニュース、経済の専門用語が混るニュース、後はお楽しみで漫才を、字幕に落とす。
何組かの腕自慢と言うか指自慢のプロが集っての競技大会。みなさん、マイ・キーボードを持参されてましたねぇ。と、言っても別段特殊な改造を施してあるわけでもない(37,000円って言ってたから、高級品だ)。しっかり自分の指に馴染んだやつが良いって事だな。 中には、裁判所で使われる、特殊な速記用のタイプライターで参戦してるグループもあった。
それから、変換は普通の変換と、自分用の辞書を使う組もあった。経済ニュースの部門では、あらかじめトピックが紹介され、15分の自由時間で、その分野を勉強する事が許されていた。 その時間を使って、出てきそうな単語を登録してた。上手くヒットすると、1秒ぐらいは変換が速くなるな。
なお、音声と字幕の遅れは3秒以内が望ましいそうだ。それ以上になると、見る人が違和感を覚えるそうだ。大変な世界だな。
でも、いつまで続くんでしょうかね? AIで、音声認識が爆発的に進んでますからねぇ。だんだん、それに置き換わっていく予感がするぞ。
xev
以前、ひょんな事からキーボードの挙動に疑問をもった。そこで少し調べてみる。挙動で思い出すのは、X環境で、キーが押された/離されたを検出して報告するアプリだ。
sakae@deb:/tmp$ xev : KeyPress event, serial 38, synthetic NO, window 0x800001, root 0x118, subw 0x0, time 7816624, (-351,329), root:(388,353), state 0x1, keycode 24 (keysym 0x51, Q), same_screen YES, XLookupString gives 1 bytes: (51) "Q" XmbLookupString gives 1 bytes: (51) "Q" XFilterEvent returns: False KeyRelease event, serial 38, synthetic NO, window 0x800001, root 0x118, subw 0x0, time 7816786, (-351,329), root:(388,353), state 0x1, keycode 24 (keysym 0x51, Q), same_screen YES, XLookupString gives 1 bytes: (51) "Q" XFilterEvent returns: False
on/off時で返答が異るぞ。一体どゆ事? SHIFT/CTL/ALTキーも同様にイベントを発出してる。
showkey / dumpkeys
リナだとxevの他にコンソール用にshowkeyなんてコマンドが用意されてる。
sakae@deb:/tmp/z$ showkey -k kb mode was UNICODE [ if you are trying this under X, it might not work since the X server is also reading /dev/console ] press any key (program terminates 10s after last keypress)... keycode 28 release keycode 30 press keycode 30 release keycode 1 press keycode 1 release keycode 100 press keycode 100 release
この他に -a -s なんていうオプションが用意されてる。
それから、dumpkeysですよ。-lで詳しく説明モード
keycode range supported by kernel: 1 - 255 max number of actions bindable to a key: 256 number of keymaps in actual use: 128 of which 121 dynamically allocated ranges of action codes supported by kernel: number of function keys supported by kernel: 256 max nr of compose definitions: 256 nr of compose definitions in actual use: 68 Symbols recognized by dumpkeys: (numeric value, symbol) 0x0000 nul 0x0001 Control_a 0x0002 Control_b 0x0003 Control_c : Recognized modifier names and their column numbers: shift 1 altgr 2 control 4 alt 8 shiftl 16 shiftr 32 ctrll 64 ctrlr 128 capsshift 256
余り嬉しい事はないな。
dmesg
そもそもキーボードをどう検出してる? そんな場合はFreeBSDです。10年前のパソコンThinkPad/SL510に入れたもので確認。
[sakae@fb ~]$ dmesg | grep kbd kbd1 at kbdmux0 atkbdc0: <Keyboard controller (i8042)> port 0x60,0x64 irq 1 on acpi0 atkbd0: <AT Keyboard> irq 1 on atkbdc0 kbd0 at atkbd0 atkbd0: [GIANT-LOCKED] psm0: <PS/2 Mouse> irq 12 on atkbdc0
i8042って言う石が使われているのね。それを頼りに調べてみると、 キーボード コントローラ(KBC) こんなのがヒットしたぞ。
/sys/dev/atkbdc に、それ用が鎮座してる事は承知したけど、いきなり実物を見るんじゃ辛い。もっと、おもちゃみたいなのなきかな。昔を思い出せ。
keyboard(4)
scan cntrl alt alt cntrl code base shift cntrl shift alt shift cntrl shift map[n] 0 1 2 3 4 5 6 7 ---- ------------------------------------------------------ 0x1E 'a' 'A' 0x01 0x01 'a' 'A' 0x01 0x01
xv6-public
で、MITのシュミレータですよ。 uart.c って、シリアル制御。昔風に言うとRS232C になるかな。ドライバーだな。
// Intel 8250 serial port (UART). #define COM1 0x3f8 uartinit(void) { : // Announce that we're here. for(p="xv6...\n"; *p; p++) uartputc(*p); } uartgetc(void) { : return inb(COM1+0); }
kbd.c これは、キーボードドライバーだな。
kbdgetc(void) { : st = inb(KBSTATP); if((st & KBS_DIB) == 0) return -1; data = inb(KBDATAP); : shift |= shiftcode[data]; shift ^= togglecode[data]; c = charcode[shift & (CTL | SHIFT)][data]; if(shift & CAPSLOCK){ if('a' <= c && c <= 'z') c += 'A' - 'a'; else if('A' <= c && c <= 'Z') c += 'a' - 'A'; } return c;
kbd.h そして、その定義情報
// PC keyboard interface constants #define KBSTATP 0x64 // kbd controller status port(I) #define KBS_DIB 0x01 // kbd data in buffer #define KBDATAP 0x60 // kbd data port(I) #define SHIFT (1<<0) #define CTL (1<<1) #define ALT (1<<2) #define CAPSLOCK (1<<3) #define NUMLOCK (1<<4) #define SCROLLLOCK (1<<5) #define E0ESC (1<<6)
シフトだとかの修飾キーと、それらがロックされてるかの情報定義。
これらを使っているユーザーサイドのコードが、console.c にあるって理解でいいかな。 console.cの冒頭に
// Console input and output. // Input is from the keyboard or serial port. // Output is written to the screen and serial port.
こんなコメントが入っていた。
ああ、こういうOSを作るための資料サイトが見付かったぞ。 Welcome to OSDev.org
minix1
もう一つ、易しいOSって事で、リナス君も勉強したminixを調べてみる。何を隠そう、家には、1990年製の本があるのさ。久し振りに開いてみたよ。(MINIXオペレーティングシステム第1版) 前半が解説で、後半は付録って事でソースリストがついている。昔の電話帳みたいに厚いやつ。
解説を見ながら、4120行目から始まるコードでは … って感じになってるんだけど、ランダムアクセスみたいに参照先があちこちに飛ぶ。トレースが辛い。
そこでDXですよ。アナログな本からデジタル形式に移行しなさい。政府もディジタル庁を作って、さかんに宣伝してるからね。この話に乘ってみるか。
ソースが電子的にないものかと探してみたら、見付かったぞ。これで、本と首っ引きにならなくてもいいな。tagジャンプなりcscopeを使うなり、好きにしてください。これが現代風な読書習慣。やったねDX。
なお、検索してた時に見付た、ちょっと一服てか脇道です。
kernnels/tty.c
#define KEYBD 0x60 /* I/O port for keyboard data */ #define PORT_B 0x61 /* I/O port for 8255 port B */ PUBLIC keyboard() { /* A keyboard interrupt has occurred. Process it. */ int val, code, k, raw_bit; char stopc; /* Fetch the character from the keyboard hardware and acknowledge it. */ port_in(KEYBD, &code); /* get the scan code for the key struck */ port_in(PORT_B, &val); /* strobe the keyboard to ack the char */ port_out(PORT_B, val | KBIT); /* strobe the bit high */ port_out(PORT_B, val); /* now strobe it low */ /* The IBM keyboard interrupts twice per key, once when depressed, once when * released. Filter out the latter, ignoring all but the shift-type keys. * The shift-type keys, 29, 42, 54, 56, and 69 must be processed normally. */
8255と言う石を使ってるようだ。頭にインテル印のiをつけて検索すると Intel 8255 こんなのがヒットする。インテルはCPUの石だけじゃなくて、周辺も石もガッツリと固めていたんだね。ダイナミックメモリーなんかでも、i1103なんてのを作ってた。パソコンの事なら、何でもインテルにお任せくださいってデパートだったんだな。
それにひきかえ、モトローラは、VAXの血をわけた、MC68000 なんてのをやってたけど、周辺の石と言ったら、CRTのコントローラMC6845ぐらいしかないのか。戦略の間違いが、インテルを増長させる引き金になった。おかげで、世間のプログラマーは大迷惑ですよ。電卓に毛が生えたような石でプログラミングせざるを得なかったですから。
kernels/klib88.asm
; port_out(port, value) writes 'value' on the I/O port 'port'. port_out: push bx ; save bx mov bx,sp ; index off bx push ax ; save ax push dx ; save dx mov dx,4[bx] ; dx = port mov ax,6[bx] ; ax = value out dx,al ; output 1 byte pop dx ; restore dx pop ax ; restore ax pop bx ; restore bx ret ; return to caller
不自由な石。
qemu
サード・オピニオンでqemu
sakae@deb:~/src/qemu/hw/input$ ls adb.c Kconfig ps2.c tsc210x.c adb-internal.h lasips2.c pxa2xx_keypad.c vhost-user-input.c adb-kbd.c lm832x.c stellaris_input.c virtio-input.c adb-mouse.c meson.build trace-events virtio-input-hid.c ads7846.c pckbd.c trace.h virtio-input-host.c hid.c pl050.c tsc2005.c
pckbd.cを見ると、I8024なんていう単語がちらほらと出てくるので、間違いなさそう。これって石のシュミレーターコードだよな。1000行たらずで記述出来るのか。
displayなんていうセクションもあるなあ。ここでモトローラの石6845を探してみたけど見付からず。しょうがないので、らしいのって事で、vga.cを見る。
/* * Video Graphics Array (VGA) * * Chipset docs for original IBM VGA: * http://www.mcamafia.de/pdf/ibm_vgaxga_trm2.pdf * * FreeVGA site: * http://www.osdever.net/FreeVGA/home.htm * * Standard VGA features and Bochs VBE extensions are implemented. */
へぇー、VGAの意味を初めて知りたましたよ。ソースの記載されてるソースが重要なんですね。
trans by AI
今回のテーマキーボードを自分は過去にやってなかったか、調べてみたんだ。そしたら、Mgでやってた。 そこにteo語録が記載されてた。
Linux is fucking POO, not just bad, bad REALLY REALLY BAD Linuxはうんちをクソされ、ちょうど悪くない、悪い本当に悪いです
これ、2016年当時のぐぐる翻訳の実力。
今だと、ぐるるの検索で、transってやると、翻訳出来る窓が出て来る。
Linux は糞だ、悪いだけじゃない、本当に悪い Rinakkusu wa kusoda, warui dake janai, hontōni warui
凄く翻訳精度が向上してるね。それに、日本語の発音まで出て来る。POOを糞ってちゃんと漢字で表記してるのには驚かされますよ。
Linuxはクソ不良。 Linuxはクソ不良で、ただ悪いのではなく、本当に本当に悪い。
こちらは、DeepLでも翻訳。上の段は原文のままでの結果。下のやつは、POOの後ろのカンマを削除した時の結果。
とある本によると、もう翻訳はAIに任せていいよ。どこかの会社みたいに英語が出来る事を必須とするなんて時代遅れ。それより、本業の専門分野でいかにちからを発揮出来るかが重要との事。時代は進歩してる。
最後にTeo語録を一つ。
the kernel is a harsh mistress カーネルは厳しい愛人です
AI for picture
画像生成AI「Midjourney」の描いた絵が美術品評会で1位を取ってしまい人間のアーティストが激怒
Stable DiffusionをローカルのGPU無しのWindows PC(Intel CPU)で動かす方法
sakae@deb:~/stable_diffusion.openvino$ pip3 install --user -r requirements.txt
マーフィーの法則が成立した。だからパイソンは嫌いなんです。 まて、ひょっとして32Bit環境でやってないか。こんな環境はとっくの昔に見捨てられているぞ。と言う事で、64Bitな環境でやってみたら、無事にインストール出来た。
インストール画面を眺めていたら、opencv-pythonなんてのがDLされた。400Mを越る大物。何者かと思って調べてみたよ。そしたら、INTELのCPUを有効に使って頂くためのツールセットですってさ。CPUと言うよりGPUね。エッジコンピューティング。
誰かがAIで色々なモデルを構築。新しく脳味噌を鍛える訳だな。で、その脳味噌を下々のみなに 使えるようにしてあげましょう。下々はりっぱな環境を持っていないから、せめてINTEL Loveな皆さんにも分け前をめぐんであげましょってINTELは考えた。それで、脳味噌を移植して動くようにしましょって作戦。その為の培養器だな。
実際に動かしてみると、4G近い脳味噌が転送されてくる。オイラーはそこで恐れをなして、中止しちゃったけどね。文献によると、その脳味噌は、
self._text_encoder = self.core.read_model( hf_hub_download(repo_id=model, filename="text_encoder.xml"), hf_hub_download(repo_id=model, filename="text_encoder.bin") )
コンピュータが解析しやすい形式のXMLファイルと、密度が高いBIN形式のセットになってるらしい。テキスト分析が得意な脳、ネットとやり取りが得意な脳、図形な得意な脳とかに分れている。
実際に使う時は、生成したい図形ってか絵画のヒントをテキストで与える事になる。
python demo.py --prompt "Street-art painting of Emilia Clarke in style of Banksy, photorealism"
バンスキン似の絵画を宜しくってわけだ。多分これをヒントにネットを画像検索、それに手を加えているんだろうね。
オイラーなら、Big wave by Hokusai ってヒントを出してみたいぞ。 そしたら、 Ukiyoe 似の絵画が出て来るはずですから。 丁度、HTMLのALTタグの逆を行くわけだな。
同じ仕組みかどうかは知らないけど、 Midjourney が流行っているみたいだな。