はじめに
今回の内容は、以下の 2つの記事の内容を混ぜたようなものです。
●Node.js で Readline をシンプルに使う(1桁の数字の入力を扱う) - Qiita
https://qiita.com/youtoy/items/fcdab642baa7007f4645
●【小ネタ】Node.js と Mac の Sayコマンドでテキストの読み上げ(複数の文章を対象にしつつパラメータ変更も試す) - Qiita
https://qiita.com/youtoy/items/397813c607b58fac626e
実現する内容
具体的に実装する内容は、「キーが入力されたら、何のキーが入力されたかを音声で返す」というものです。
これを Node.js で実装します。また、音声を使う部分は Mac の Sayコマンドを組み合わせて実現します(※ Node.js の標準モジュール Child process でコマンドを実行します)。
Readline でキー入力時にすぐに反応する処理を実装する
冒頭で紹介した過去の記事では、Node.js の Readline を使ってユーザーのキー入力を受け付けるものを実装していました。
その際の動作は、キー入力後に Enterキーを押したら、それに対して反応するというものでした。
今回はその動作を少し変え、Enterキーが入力されなくても、キー入力に反応して処理が実行されるようにします。
参考にするプログラム
上で書いた処理を実装するため、参考にできそうなプログラムを探してみました。
そして、検索して見つけた以下を使うことにしました。
●Example: Detect keypress event in Node.js console app
https://gist.github.com/newvertex/d78b9c6050d6a8f830809e6e528d5e96
Enterキーの入力なしに反応する、という部分は process.stdin.setRawMode(true)
という部分がポイントになるようです。
書きかえ後のプログラムと動作確認
上記を書きかえて作ったプログラムは、以下のとおりです。
const readline = require("node:readline");
readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);
process.stdin.on("keypress", (str, key) => {
if (key.ctrl && key.name === "c") {
console.log("終了します");
process.exit();
}
console.log(`あなたが押したキーは "${str}" です`);
});
console.log("キーを押してください(Ctrl + c で終了)");
上記の基本的な動作は、キーが入力されたら、押されたキーが何であったかをすぐに返すというものです。また、「Ctrl + c」が押された時は処理を終了するようにしています。
動作確認
上記のプログラムを実行してから、「1 ⇒ 2 ⇒ 3 ⇒ 4 ⇒ 5 ⇒ a ⇒ b ⇒ c ⇒ d ⇒ Ctrl + c」という順番でキーを入力してみます。
その結果、以下の出力が得られました。
キー入力に反応してしゃべるようにしてみる: Mac の Sayコマンドとの組み合わせ
Mac の Sayコマンドを使い、上記のキー入力の出力として、音声でキーの内容をしゃべるプログラムを実装してみます。
プログラム
試しに、以下のようにしてみました。
const { execSync } = require("node:child_process");
const readline = require("node:readline");
readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);
process.stdin.on("keypress", (str, key) => {
if (key.ctrl && key.name === "c") {
console.log("終了します");
process.exit();
}
execSync(`say あなたが押したキーは${str}です`);
});
console.log("キーを押してください(Ctrl + c で終了)");
動作確認
上記のプログラムを実行して、キーを押した時の様子を掲載してみます。
以下のとおり、押したキーの読み上げが行われることを確認できました。