0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事誰得? 私しか得しないニッチな技術で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【Node.js】入力されたキーが何かを音声で返すプログラムを作ってみる: Readline と Mac の Sayコマンドの組み合わせ

Last updated at Posted at 2024-06-22

はじめに

今回の内容は、以下の 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

image.png

Enterキーの入力なしに反応する、という部分は process.stdin.setRawMode(true) という部分がポイントになるようです。

書きかえ後のプログラムと動作確認

上記を書きかえて作ったプログラムは、以下のとおりです。

app.js
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」という順番でキーを入力してみます。

その結果、以下の出力が得られました。

image.png

キー入力に反応してしゃべるようにしてみる: 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 で終了)");

動作確認

上記のプログラムを実行して、キーを押した時の様子を掲載してみます。
以下のとおり、押したキーの読み上げが行われることを確認できました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?