まくろぐ
更新: / 作成:

英語学のベストセラー

日本人として生まれた以上、どんなに英語を勉強してもネイティブスピーカーにはなれない。 自分は若い頃に本気で英語を勉強していなかったので、年齢を重ねた今から勉強してももう遅いだろう。 英語を流暢に話せるようになるためには留学が必要なのだろうか?

そんな英語学習者の悩みに、英語教育学の専門家である竹内氏が答えてくれます。 ネイティブになるのは無理だけど、ネイティブに限りなく近い「英語の達人」になることはできるといいます。

  • 「目標」と「指針」が掲げられれば、「計画」を立てることが容易となる。それにより、進捗や達成度を把握できるようになる。
  • 今の自分の力では 少し難しいこと をやるのが効果的。
  • 英語を勉強しないと寝ない、というように決めて「毎日」やる。1 日の休みは 1 週間の後退に相当する。
  • コツコツも重要だが、1 ヶ月とにかく英語漬けになるといった 集中学習も必要
  • 上達していないと感じたら定着し始めているんだと思うこと。そこで 学習を止めない のが重要。
  • 英語上達の秘訣は、「学ぶ楽しみ」を一番に考えること。
  • モデル音声を聞いて抑揚なども正確に真似る。大変だけど何度もやる。
  • 「シャドーイング」も「リピーティング」も テキストを見ないで真似る こと(シャドーイングは追いかけるように真似る方法)。
  • 「流暢さ」を求め、次に「正確さ」を求める。なぜなら、まずは「流暢さ」が情報の流れを確保するのに必要 となるから。
  • うまく書こうと思ったら、たくさん読みなさい。
  • 単語は (1) 文脈化 (2) 音声化 (3) 身体化 (4) ネットワーク化 (5) リスト化 (+) 反復で覚える。
  • アクセントの音節の上でこぶしを振り下ろす動作を付けることで、アクセントの位置を定着させる。
  • 「ライバルが必要」というのは間違いない。
  • 自分より少し英語力が高い人と低い人がいるコミュニティが最適。教わることと教えることの両面から学ぶことができる。
  • コミュニケーション方略 を学んでスムーズに話す。
    • (ええっと、ちょっと待ってね、)Well, let me see, / Just a moment,
    • (〜という意味ですか?)You mean ~?
    • (もう一度言って)I beg your pardon. / Coud you say that again?
    • (“Xenophobia” を別の言い方にすると?)Can you paraphrase “Xenophobia”?
    • (ついて来れてる?)Are you with me? / Do you follow me?
    • (英語で何という?)How do you say … in English? / What’s this in English?
    • (得意な話題に変える)Speaking of …, I know one interesting book. / That reminds me …
    • (話題を変える合図)Oh, by the way,

英語学の売れ筋ランキング

関連記事

更新: / 作成:

何をするか?

/p/pqmxxqz/img-001.png
図: Svelte + MediaPipe によるジェスチャー認識

MediaPipe を使った Svelte アプリを作ってみます。 MediaPipe は様々なメディアの認識処理に対応していますが、ここでは Web カメラからの入力映像を使ったジェスチャー認識を行います。 MediaPipe を使った Web アプリは、Web ブラウザだけで動作するので、静的な Web サイトとしてホスティングすることができます(参考: Svelte アプリを静的サイトとしてビルドする)。

プロジェクトの作成

まずは空っぽの Svelte プロジェクトを新規作成します。

$ npm create svelte@latest myapp
(種類として Skeleton、TypeScript を選択)

続いて、必要なライブラリをインストールしておきます。 MediaType ではタスク別に使用するモジュールが分かれており、視覚系のタスクには @mediapipe/tasks-vision モジュールを使用します。

  • @mediapipe/tasks-vision … 視覚(画像/動画)系タスク ← 今回はコレを使う
  • @mediapipe/tasks-genai … 生成 AI (LLM) 系タスク
  • @mediapipe/tasks-text … テキスト系タスク
  • @mediapipe/tasks-audio … 音声系タスク

Svelte アプリで依存ライブラリを追加するときは devDependencies として追加すれば OK です。

$ cd myapp
$ npm install -D @mediapipe/tasks-vision

Web カメラからの入力映像を表示する

MediaPipe を使った認識処理の前に、Web カメラからの入力映像を画面上に表示できるようにしておきましょう。 そのためには、HTML の video 要素に、Web カメラからの入力 (MediaStream) を関連付ける必要があります。

ここでは、WebcamVideo という Svelte コンポーネントとして実装してみます。

src/lib/WebcamVideo.svelte
<script lang="ts">
	/** Webcam による映像キャプチャを開始するためのフラグ */
	export let active: boolean = false;

	/** video 要素の bind 用 */
	export let videoElem: HTMLVideoElement | undefined;

	$: if (active) {
		startCapture();
	}

	function startCapture() {
		// Web カメラのストリームを取得して video 要素に紐付ける
		navigator.mediaDevices
			.getUserMedia({ video: true })
			.then((mediaStream: MediaStream) => {
				if (videoElem) {
					videoElem.srcObject = mediaStream;
					videoElem.play();
				}
			})
			.catch((err) => {
				console.error('Web カメラの取得に失敗しました:', err);
			});
	}
</script>

<video id="webcam" bind:this={videoElem} playsinline>
	<!-- Web カメラの入力映像を表示するのでキャプションは存在しない -->
	<track kind="captions" src="" default />
</video>

<style>
	#webcam {
		width: 640px;
		max-width: 100%;
		transform: scaleX(-1); /* 映像を左右反転 */
	}
</style>

このコンポーネントは、任意の Svelte コンポーネント(+page.svelte など)から次のように使えます。

<WebcamVideo active={isActive} />

active プロパティを true にすると、Web カメラが有効化されて video 要素に入力映像が表示されます(ここでは停止処理は省略しているので、有効化しかできません)。

MediaPipe でジェスチャー認識する

Web カメラと関連付けた video 要素を用意できたら、MediaPipe を使った認識処理を開始できます。 大まかな流れは次の通りです(参考: ウェブ用ジェスチャー認識ガイド - Google AI Edge)。

  1. GestureRecognizer インスタンスを生成する(モデルのロードなど)。
  2. GestureRecognizer#recognizeForVideo() メソッドに video 要素を渡すことで、最新フレームの認識を行う。
  3. 認識結果は GestureRecognizerResult オブジェクトとして返されるので、後は煮るなり焼くなり。

recognizeForVideo() による認識処理は毎フレーム呼び出す必要があるため、次のような感じで requestAnimationFrame() を使って繰り返し呼び出すように実装します。

const renderLoop = () => {
	const result = recognizer.recognizeForVideo(videoElem, Date.now());
	onFrame(result);
	requestAnimationFrame(renderLoop);
};

また、recognizeForVideo()video 要素からの入力データの準備ができてから呼び出さないといけないことに注意してください。 次のような感じで loadeddata イベントをハンドルすればよいです。

videoElem.addEventListener('loadeddata', renderLoop);

下記のライブラリは、GestureRecognizer の生成と、認識処理をまとめたものです。

src/lib/recognizer.ts
import {
	GestureRecognizer,
	FilesetResolver,
	type GestureRecognizerResult
} from '@mediapipe/tasks-vision';

/**
 * video 要素からの入力映像の解析を開始します。
 * フレームごとの認識結果はコールバック関数 `onFrame` に渡されます。
 */
export async function startRecognition(
	videoElem: HTMLVideoElement,
	onFrame: (result: GestureRecognizerResult) => void
): Promise<void> {
	const recognizer: GestureRecognizer = await createGestureRecognizer();

	// 入力映像のフレームごとの認識処理
	const renderLoop = () => {
		const result = recognizer.recognizeForVideo(videoElem, Date.now());
		onFrame(result);
		requestAnimationFrame(renderLoop);
	};

	// video 要素からのデータが取得できたらフレーム処理開始
	videoElem.addEventListener('loadeddata', renderLoop);
}

/**
 * MediaPipe のジェスチャー認識器を作成します。
 */
async function createGestureRecognizer(): Promise<GestureRecognizer> {
	const vision = await FilesetResolver.forVisionTasks(
		'https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm'
	);
	return await GestureRecognizer.createFromOptions(vision, {
		baseOptions: {
			modelAssetPath:
				'https://storage.googleapis.com/mediapipe-models/gesture_recognizer/gesture_recognizer/float16/1/gesture_recognizer.task',
			delegate: 'GPU'
		},
		numHands: 2,
		runningMode: 'VIDEO'
	});
}

任意の Svelte コンポーネントから、次のように呼び出すだけで認識処理を開始できます。 各フレームの認識結果が processResult 関数に渡されます。

startRecognition(videoElem, processResult);

function processResult(result: GestureRecognizerResult) {
	// ...
}

結合する

上記で作成した WebcamVideo コンポーネントをページコンポーネント (+page.svelte) に配置し、startRecognition() でジェスチャー認識を開始します。 処理のポイントは、WebcamVideo コンポーネント内の video 要素の参照を、startRecognition() に渡すところくらいです。

他の部分はほとんど認識結果 (GestureRecognizerResult) の表示処理です。 ページの下の方に、認識した手の形(Open_Palm や Thumb_Up など)を表示しています。

ここでは、ボタンを 1 つ配置して、ボタンを押したときにキャプチャと認識処理を開始するようにしています。

src/routes/+page.svelte
<script lang="ts">
	import type { GestureRecognizerResult } from '@mediapipe/tasks-vision';
	import WebcamVideo from '$lib/WebcamVideo.svelte';
	import { startRecognition } from '$lib/recognizer';

	let videoElem: HTMLVideoElement;
	let buttonElem: HTMLButtonElement;
	let isWebcamEnabled = false;

	$: if (isWebcamEnabled) {
		startRecognition(videoElem, processResult);
		buttonElem.disabled = true; // ボタンを無効化
		//buttonElem.style.display = 'none'; // ボタンを消す
	}

	// 以下は認識結果の表示用
	let categoryName1: string = '?'; // 1 つ目の手の形状(カテゴリ)
	let categoryName2: string = '?'; // 2 つ目の手の形状(カテゴリ)
	let score1 = 0.0; // 1 つ目のカテゴリのスコア
	let score2 = 0.0; // 2 つ目のカテゴリのスコア

	function processResult(result: GestureRecognizerResult) {
		const category1 = result.gestures.at(0)?.at(0);
		const category2 = result.gestures.at(1)?.at(0);
		categoryName1 = category1?.categoryName ?? '?';
		categoryName2 = category2?.categoryName ?? '?';
		score1 = category1?.score ?? 0.0;
		score2 = category2?.score ?? 0.0;
	}
</script>

<h1>MediaPipe Demo</h1>
<div>
	<WebcamVideo bind:videoElem active={isWebcamEnabled} />
</div>
<button bind:this={buttonElem} on:click={() => (isWebcamEnabled = true)}
	>Web カメラによる認識を開始</button
>
<ul>
	<li>手の形1: {categoryName1} (信頼度: {score1.toFixed(2)})</li>
	<li>手の形2: {categoryName2} (信頼度: {score2.toFixed(2)})</li>
</ul>

全体のコードとデモページ

関連記事

更新: / 作成:

仕事がうまくいかなかったり、部屋の中がごちゃごちゃしてくると、断捨離をしたくなります。 そんなときにシンプルに生きる素晴らしさを思い出させてくれるのがドミニック・ローホー氏の著書です。

モノに依存しないようになることで、いかに豊かになれるかということをひたすらに説いてくれます。 日本在住歴30年で、禅の心を学んでいる彼女の言葉は、日本人の我々にもすっと入ってきます。 昔からモノを溜め込みがちな自分でも断捨離する気になってきます。

シンプルに豊かに生きるには、次のように考えます。

  • モノや人へ執着せず、在るがまま、成せるがままに終息させよう。
  • 物質的なことに時間をかけず、人や人間関係に時間をかけよう。
  • モノの役割は、他の様々な豊かさへの移行を容易にするためにある。
  • 唯一大切なこと、それは多分、居心地の良い場所を見つけること。
  • 幸せが身辺に留まっている間、好きなようにそれを堪能すればよい。その幸せに依存するわけではない。
  • 私たちの身に起こる全ての出来事を根底で「自分とは無関係」と捉える。
  • 自分が何者でもないと認識する。その時点で何者にでもなれる。
  • 余分なモノを捨て、しなければいけないことをする。これこそが知性の扉を開くための第一歩。
  • 様々な経験、これこそが私たちを成長させる。モノは私たちを停滞させる。
  • 「人生で一番」は所有しているモノではあり得ない。

モノを捨てられないときは、次のように考えます。

  • お金が勿体無いからモノを捨てられないというのは間違い。お金が目的であれば、そのモノの維持のために使ってきた時間でもっと儲けられる。
  • これを捨てた場合、自分に起こり得る最悪の事態は?それは取り返しのつかないこと?
  • 1 年使ってなければもう使わない。今使いたいと思わないものは捨てる。
  • 万が一、必要になったらまた買い直せるのでは。代替できるものがあるのでは。
  • テーブルの上がすっきりと何も置かれていない状態は、不安を減少させ、部屋の美しさを高める。
  • ガラクタが詰まった引き出しやボックスは、テーブルの上や風呂敷の上に中身をそっくり空けると簡単に捨てられる。
  • 収納用グッズ(かご、ケース、棚、ファイル)の購入はよく考える。これらはモノを溜め込んでいく手伝いをする。どんなに優れた収納グッズも、過剰にあるモノの問題は解決しない。

基本的には、モノを捨てるタイミング は思い立ったときがよいとされていますが、他にもよい機会が紹介されています。 例えば、旅行などで外泊するときに使い古しの衣類などを処分してくるというのは王道ですね。 他にも、腹が立っているときはモノを捨てやすいというのは面白いです。 確かにイライラしているときって変に勇気が出たりして、いつもと違う行動をとってしまうことがありますね。

とはいうものの、断捨離に慣れていない人にとって、モノを捨てることには罪悪感や勿体なさという感覚が付きまといます。 そんなときは、次の言葉を思い出すとよいです。

たくさんモノを所有した経験があるからこそ、シンプルに生きること、何も持たないことに幸せを見出せる。

捨ててもいいんです。 かつて持っていたという経験はなくなりません。

関連記事

メニュー

まくろぐ
サイトマップまくへのメッセージ