日本酒 をAmazonで探す
酒器 をAmazonで探す
和食器 をAmazonで探す
Views: 1
📌 内容
MORE VISIONとJ.E.T.が主催し、株式会社RaySTAが企画・制作に参画するダンスコンテスト「DANCE LIKE JAY PARK」が発表されました。このコンテストは、韓国のHIPHOPアーティストJAY PARKの6年ぶりの単独来日公演のフロントアクト出演権をかけて行われます。
コンテストの開催日は、オンライン予選が2025年6月12日から6月22日まで、決勝戦が7月20日です。会場は、決勝がSpotify O-EASTで行われます。
エントリーはInstagramまたはTikTokで動画を投稿する形式で、JAY PARKの楽曲を使用し、無料で参加可能です。特に、優勝者には賞金50万円とJAY PARKとの記念撮影、さらには直筆サインのポスターが贈呈されます。
関係者としては、JAY PARKが出演するワールドツアーに関連して、株式会社RaySTAが重要な役割を果たしています。彼らは新しいエンタメの標準を創る企業理念を掲げて活動を行っています。
📊 詳細データ
公式リンク:RaySTA公式サイト
💬 編集部コメント:
この発表の印象・注目点を社会的な視点からまとめると、以下のようになります。
ダンス文化の普及:
賞金とステージへの道:
国際交流の促進:
オンライン参加のハードルの低さ:
若者の自己表現の活性化:
全体として、この発表は日本のダンス文化をさらに盛り上げ、国際的な交流や若者の自己表現の場を提供する重要な試みであると感じられます。
※以下、出典元
▶ 元記事を読む
Views: 0
ざっくり内容:
2025年6月29日、テレビ朝日系で特番『ニカゲーム』が放送されることが決定しました。この番組には、Kis‐My‐Ft2の二階堂高嗣、令和ロマンの松井ケムリ、timeleszの猪俣周杜が出演します。『ニカゲーム』は、平日深夜の「バラバラマンスリー」で人気を集めたバラエティーコーナーで、特に英語の読み方ゲーム企画が話題となりました。
特番では、視聴者参加型の謎解き要素も強化。英語が苦手な二階堂が挑戦し、新メンバーの猪俣や慶應卒の松井も加わることで、名物の超簡単英語クイズに挑む様子が新たな展開を見せると期待されています。
この特番が注目される理由は、多くの視聴者からの支持を受け、特にTVerでの再生回数が200万回を超えたという実績があるためです。新たなパートナーシップと挑戦が織り交ぜられ、どのような反響を呼ぶのか、放送が待たれます。
編集部の見解:
この記事では『ニカゲーム』という新感覚バラエティ特番について触れられていますね!特に気になるのは、Kis-My-Ft2の二階堂さんが英語の読み方ゲームに挑戦する点。英語が苦手というところが視聴者に共感を呼ぶ要素となっていると思います。
感じたこと
このようなバラエティが流行る背景には、視聴者が「一緒に参加できる感覚」を求めているからでしょう。視聴者参加型の企画が人気なのは、単に観るだけでなく、自分もその場にいるかのような没入感があるからです。
関連事例
最近のバラエティ番組では、クイズ形式や視聴者の意見を反映した企画が増えています。例えば、競技型トーク番組やスポーツ番組でも視聴者がリアルタイムで参加できるような形が取り入れられています。これらは視聴者の興味を引くことで、結果的に再生回数や視聴率の向上に寄与しているのでしょう。
社会的影響
コロナ禍を経て、人々のエンタメへの関わり方が変わりました。家にいる時間が増えたことで、TVや動画配信サービスの視聴が増加し、これを受けて新しい形のバラエティ番組が生まれやすくなっています。『ニカゲーム』のような企画は、みんなで楽しむ機会を提供する点で時代のニーズに応えているように思います。
豆知識
ちなみに、英語の苦手なタレントがクイズに挑戦するというスタイルは、視聴者にとっても「自分もできそう」と感じさせる効果があります。視聴者から「私もやってみたい!」と思わせることが、番組の人気を支える大きな要因だとされています。
全体として、『ニカゲーム』のような企画は今後も注目されると思います。視聴者とのつながりを大切にした新しいバラエティ番組が増えていくことに期待したいですね!
キーワード: ニカゲーム
※以下、出典元
元記事を読む
Views: 1
🔸 ニュース:
社会学者の古市憲寿氏が、6月12日に自身のX(旧Twitter)を更新しました。ここで、彼は『週刊文春』6月12日号に掲載された記事に関連し、中居正広氏から性被害を受けたとされる女性、X子さんの「親しい知人」が発言した内容について触れました。古市氏はX子さんの代理人弁護士に「確認書」を送ったことを明らかにしました。
この発言は、性被害問題に関する社会的な関心が高まっている中での重要な動きです。古市氏の行動は、被害者の権利保護や事実確認の観点からも注目されています。
🧠 編集部の見解:
この記事には、社会的な問題とメディアの影響が色濃く出ていますね。古市憲寿氏が性被害を受けたとされる女性の知人とのやり取りについて言及しているのを読んで、情報の取り扱いの難しさを感じました。
最近では、SNSを利用した情報拡散が加速しており、特に性被害に関するニュースは、加害者や被害者のプライバシーに大きく影響します。例えば、 #MeToo運動の影響で、多くの人が声を上げやすくなった一方で、誤った情報や噂が広まるリスクも増しました。
社会的影響も大きいです。このようなケースが報じられることで、セクシャルハラスメントや性暴力に関する議論が広がり、意識が高まるのは良いことですが、同時に被害者の心情や人権が軽視される事例も見受けられます。メディアはその責任をしっかりと果たさなければなりません。
豆知識:日本では、性被害に関する法律が近年少しずつ改正されつつあり、被害者の権利保障が進んでいます。しかし、その認知が進まない現状もあって、まだ多くの課題が残っています。もっとオープンに話し合える社会になってほしいですね。

Views: 2
🔸 ざっくり内容:
2025年に開催されたARCChampionshipでは、人気アニメをテーマにした痛車が集まりました。特に、「SPY×FAMILY」や「フリーレン」、さらには懐かしの「Angel Beats!」など、多彩な作品からインスパイアを受けたデザインが披露されました。
痛車の人気: アニメのキャラクターやシーンを描いた車両は、ファンたちの情熱を象徴しており、イベントの目玉となっています。参加者たちは、自分の好きな作品を通じて文化を共有する場ともなっています。
作品の多様性: 近年のヒット作から昔の名作まで、様々な作品が一堂に会しており、世代を超えたファン同士の交流が観察されました。特に「SPY×FAMILY」や「フリーレン」など、最近のアニメが特に人気を集めています。
このように、ARCChampionshipはアニメ文化を愛する多くの人々が集まり、作品への愛を表現する重要な場として機能しています。今後もこんなイベントが続くことで、アニメへの関心が一層深まることでしょう。
🧠 編集部の見解:
この記事では、奥伊吹で開催されたARCChampionship 2025の痛車イベントについて触れています。その中でも、最近の人気アニメから懐かしの名作まで、様々な痛車が展示されており、アニメファンの熱気が伝わってきます。
### 感想
私自身、「SPY×FAMILY」や「フリーレン」は最近のアニメとして非常に楽しんでいます。特に「フリーレン」は、冒険のその後を描いた新しい視点が魅力的ですね。痛車にしてもそのアニメのキャラクターが描かれていると、ファンとしては心が躍ります!
また、「Angel Beats!」が登場しているのを見て、10年以上前の作品ですが、今でもファンに愛され続けていることに感心しました。曲も印象的で、あの頃のアニメの雰囲気が思い出されます。
### 関連事例
最近、痛車文化がさらに広がっているのは、SNSやYouTubeの影響も大きいです。個性的なデザインやオリジナルのラッピングが施された車両は、オンラインでシェアされ、多くの人がその魅力を楽しむようになっています。
### 社会的影響
このようなイベントは、アニメファンだけでなく、地域活性化にも寄与しています。痛車が集まることで新たな観光名所となり、地域経済に貢献する部分も大きいです。さらには、アニメという文化を通じて、異なる世代の人々が集まり、交流する場となるのも大きな魅力です。
### 豆知識
実は、日本では痛車が認知され始めたのは2000年代初頭。最初はオタク文化の一環としてスタートしましたが、今や多くの人が楽しめるカルチャーに成長しています。イベントでは、車両のデザインコンテストやコスプレイベントなども開催され、ファンにとっては夢のような空間です。
こういったイベントに参加することで、新たな友人や仲間ができるのも素敵なところです。次回のイベントはぜひ参加して、自分の好きな作品の痛車を楽しみたいですね!
【注目アイテム】
※以下、出典元
▶ 元記事を読む
Views: 0
📌 ニュース:
デベロッパーのPressed Elephantが、砂のお城を作る立体パズルゲーム『Elfie: A Sand Plan』を発表しました。対応プラットフォームはPC(Steam)です。
プレイヤーはかわいいゾウの「Elfie」と一緒に、砂浜でお城をサンドイッチするお手伝いをします。操作はシンプルで、Elfieが示す図面に合わせてパーツを組み立てます。
最初は正面図で始まり、進むにつれて横や上からの図面も登場。誤りがあると赤マスでハイライトされるので安心です。制限時間はなく、自分のペースで楽しめます。
また、「Creative Mode」も用意され、好きなように建築可能。ストアページによると、日本語には未対応とのこと。
開発元はフランス・モントリオールのインディーデベロッパーです。
以下は、記事のポイントを3つにまとめたものです。😊
『Elfie: A Sand Plan』の概要🏖️
砂のお城を建築する立体パズルゲームで、まるまるとしたゾウの「Elfie」と一緒に砂浜で遊ぶことができます。PC(Steam)向けに6月13日に発表されました。
シンプルな操作と遊び方🧩
Elfieが示す平面図に沿って、立方体や円柱のパーツを組み合わせてお城を作ります。パズルは制限時間がなく、進めるにつれて新しい建築スタイルも楽しめる「Creative Mode」が解放されます。
※以下、出典元
▶ 元記事を読む
Views: 1

Ragnarokへのカウントダウンがオンになっています! Arkの最も愛されている地図の1つの発売に近づくと、チームはこのファンのお気に入りをArk:Survival Ascendedに命を吹き込むために、仕事に縛られています。トップからボトムへの完全な再設計により、Ragnarokはリターンやリマスターを超えています。これは本格的なリバイバルであり、WildCardチームのこれまでの最高の仕事を信じています。
舞台裏では、それはポーランドの旋風であり、ロールアウトの準備をするときの最後のタッチでした。私たちはあなたの多くにとってRagnarokがどれほど意味があるかを知っています。そして、その険しいピーク、燃える砂、その間のすべてにあなたを歓迎するのを待つことができません。
以下を含む大きなコンテンツドロップの準備をします
Ragnarokは昇りました – 獣と神話のファンに人気の古代の戦場は再び目覚め、完全にリマスターされます。
バイソン(無料の生き物) – ヘッドバッツとハイランド大混乱の角のあるヘビー級チャンピオン。
失われたコロニー拡張パス:1日ゼロコンテンツ – 今後のフルサイズの標準拡張パックへの最初のステップ。すべての購入は、6月18日に明らかにされるこれらの機能の詳細について、排他的なLost Colonyゲームプレイコンテンツのロックをすぐに解除します。

UE5.5の発売後の問題を引き続き取り組んでおり、FPSドロップの解決、構造の複製の遅延(構造が速くレンダリング)、クラッシュとエクスプロイトの解決に高い優先度が高い。あなたのレポートは、私たちが迅速に問題のパッチを適用するのを助ける上で非常に貴重でした、ありがとう!プレーヤーの全体的なエクスペリエンスを向上させることを目的とした継続的な更新により、パフォーマンスと安定性を積極的に監視し続けます。
ラグナロクの到着は差し迫っており、発売のためにカーテンの準備の後ろで忙しいです。発売ラッシュに対応するために、公式のRAGサーバー容量を100に一時的に増やすことを計画しています。



私たちが生き残り、構築し、飼いならしてから10年間を祝うとき、私たちはあなたにあなたにとって何を意味するのかを私たちに見せてほしい – それがあなたの部族やお気に入りの飼いならされた瞬間であろうと、ただの率直な瞬間であろうと、ただの率直な瞬間であろうと。これは、壮大な冒険からあなたに固執した静かな思い出まで、あなたの箱舟の旅に敬意を表するチャンスです。
それが記憶、傑作であろうと記念碑であろうと、あなたの目を通して10年の箱舟を祝いましょう。

オープンエントリ: 6月6日金曜日
エントリクローズ: 6月18日水曜日
勝者は発表しました: 6月20日金曜日

スクリーンショット/ビスタ – 壮大な景色から心からの思い出まで、あなたの箱舟の旅を表すシーンをキャプチャします。
ビルド – 過去または現在の最も意味のあるまたは伝説的な創造物を披露してください。
美術 – Arkの世界、生き物、またはゲームが長年にわたってあなたに意味するものを祝うオリジナルのアートワークを作成または披露します。
提出物の簡単なタイトルまたは説明を含めてください。

カテゴリ準優勝: あなたが選んだ素晴らしい飼いならされたもの。
カテゴリの勝者: ARKのコピー:マンモス、Tusoteuthis、Spinosaurus、Equus、Jane、Chava、Rebel Mei Yin、New-Armor Mei Yinなど、75を超える排他的なスキンを備えたアニメーションシリーズコスメティックパック。 14.99ドルの価値があります。
大賞準優勝: アーク:アニメーションシリーズのコスメティックパックと、選択の素晴らしい飼いならされたものです。
大賞受賞者: 上記のすべての賞品に加えて、アートワークは1週間のARK公式の不一致のサーバーバナーとして紹介されました!

あなたの提出物はテーマに載っている必要があります。
提出する画像の権利を持つ必要があります。同意なしに他の人が作った著作権で保護された素材やアートワークはありません。
ユーザーごとに1つの提出。複数のカテゴリにわたって複数の提出または提出はありません。
コンテンツはサーバーのルールに従う必要があります。
NSFW、軽rog的、差別的、または無礼なコンテンツはありません。
PG-13のみ。
AIに生成されたコンテンツはありません。

エントリを提出してください 公式の箱舟の不一致。
提出物の簡単なタイトルまたは説明を含めてください。
一緒に10年の箱舟を祝いましょう。それがあなたの最初の飼いならされたものであれ、あなたの最も誇りに思っているものであろうと、あなたの古い部族の仲間へのオマージュであろうと、私たちはあなたにとって何を意味するのかを見たいと思っています。


公式ネットワークは、6月17日木曜日までボーナス記念日料金を受け取ります。 PVP/PVE: 2倍の収穫、飼い慣らし、経験、繁殖 小さな部族: 4.5倍の収穫、飼料、および経験 + 4倍の繁殖 Arkpocalypse: 5倍の収穫、飼い慣らしと経験、繁殖 
ファンアートギャラリー | スクリーンショットギャラリー | アーティストフィードバックフォーム
作成者:ハンディマンビルド 海から立ち上がるこの活気のある都市は、中世の建築と緑豊かな熱帯の環境を融合しています。ハンディマンビルドによって作成された雄大な要塞のツアーに参加してください! 作成者:RaaSclark このガイドは、Ark Astraeosのすべての生き物を見つけるのに役立ちます!
幸せな10周年! @falco_lunaによって
ファイアワイバーン Moocow4lifeによる
レインボーピロマン ファレルによる
ファンアート @rianeko_mabiによる
糞の甲虫 @SS38529630
市長 Zenith114による
ファンアート fiskfoxによって 
焦げた地球での私の最新の生き物 Specter0294による
写真モード アズカリマによって
astraeosで太陽が昇るのを見る ドラコニムスによる
写真モード Tomboynerdyによる
写真モード Itsadrig64によって 
週末をお楽しみください!
スタジオワイルドカード
不和: https://discord.com/invite/playark
Twitter: twitter.com/survivetheark
Reddit: reddit.com/r/playark
Instagram: instagram.com/surviveTheark
Twitch: Twitch.tv/surviveTheark
スチーム: Steamcommunity.com/app/346110
YouTube: youtube.com/surviveTheark
Facebook: facebook.com/survivetheark
スレッド: threads.net/@survivetheark
公式ウィキ: https://ark.wiki.gg/wiki/ark_survival_evolved_wiki
🧠 編集部の感想:
Ragnarokのリマスター版の到来にワクワクしています!フルリデザインによる新たな体験が、ファンたちの期待を裏切らないことを信じています。コミュニティの熱気を感じながら、ARKの10周年も盛大に祝いたいですね。
Views: 0
📌 ニュース:
超大画面レグザから
4Kプロジェクターまで勢揃い。
TVS REGZAが販売店向け
セミナーを開催しました。
4月9・10日に実施された
製品内覧会では、
全国の販売店との
直接取引を開始することを
公表しました。
新たなビジネス展開に
期待が寄せられます。
この記事のポイントを以下のようにまとめました📺✨
超大画面と4Kプロジェクターが勢揃い!
TVS REGZAでは多様な製品を取り揃え、展示会で最新技術を紹介しています🎥。
販売店向けの製品内覧会を実施
4月9・10日に開催されたセミナーでは、全国の販売店との直接取引を開始することが発表されました🛒。
※以下、出典元
▶ 元記事を読む
Views: 0

前回の記事「Flutterの音声認識を色々試してみる」では、speech_to_text プラグインを使い
listenFor/pauseFor で連続認識時間や無音停止タイミングを調整
音声認識をそのまま各ファイルに書いて行ったり、サービス化したものを呼び出してFlutterアプリに組み込み動かしてみると、
といった保守性・安定性の問題が残りました。
そこで本記事では、上司の助言もあって Riverpod を活用し、
音声認識の状態管理・自動再起動ロジックを Provider に一元化した実装例をご紹介します。
Riverpod は、Flutter で状態管理(State Management)を行うためのライブラリです。
「Provider」 の進化版ともいえるツールで、以下の特徴があります。
ProviderScope の下であればいつでも利用できるlisten/stop を initState/dispose に直書きすると、 画面遷移時に停止が漏れたり、停止後もリソースが残ってクラッシュしたりするcancel と stop の違いがあいまいで、手動停止後の自動再開制御が難しい_speechToText.initialize()
どのように実装するかの方針が決まったので実際に実装していきます。
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:speech_to_text/speech_to_text.dart';
import 'package:speech_to_text/speech_recognition_error.dart';
import 'package:flutter/material.dart';
/// 状態クラス
class SpeechState {
final bool isListening;
final bool isInitialized;
final String recognizedWords;
SpeechState({
required this.isListening,
this.isInitialized = false,
this.recognizedWords = '',
});
SpeechState copyWith({
bool? isListening,
bool? isInitialized,
String? recognizedWords,
}) =>
SpeechState(
isListening: isListening ?? this.isListening,
isInitialized: isInitialized ?? this.isInitialized,
recognizedWords: recognizedWords ?? this.recognizedWords,
);
}
class SpeechStateNotifier extends StateNotifierSpeechState> {
final SpeechToText _speech;
final CommandHandler commandHandler;
// 自動再起動ロジック用
bool _shouldRestart = true;
final Duration _listenFor = const Duration(seconds: 30);
final Duration _pauseFor = const Duration(seconds: 4);
final Duration _restartDelay = const Duration(milliseconds: 100);
final int _maxErrorRetry = 5;
int _errorCount = 0;
SpeechStateNotifier(this._speech)
: commandHandler = CommandHandler(),
super(SpeechState(isListening: false));
/// 初回のみ initialize
Futurevoid> initializeSpeech() async {
if (!state.isInitialized) {
final available = await _speech.initialize(
onError: _errorListener,
onStatus: _statusListener,
);
state = state.copyWith(isInitialized: available);
}
}
Futurevoid> startListening() async {
// 前回結果をクリア
state = state.copyWith(recognizedWords: '');
try {
_shouldRestart = true;
await _speech.listen(
onResult: (r) {
state = state.copyWith(recognizedWords: r.recognizedWords);
commandHandler.handleCommand(r.recognizedWords);
},
localeId: 'ja_JP',
listenFor: _listenFor,
pauseFor: _pauseFor,
partialResults: true,
onDevice: true,
);
state = state.copyWith(isListening: true);
_errorCount = 0;
} catch (_) {
_errorCount++;
state = state.copyWith(isListening: false);
}
}
Futurevoid> stopListening() async {
_shouldRestart = false;
try {
if (state.isListening) {
await _speech.stop();
}
} finally {
state = state.copyWith(isListening: false, recognizedWords: '');
// 再開を許可するなら enableRestart() を呼ぶ
}
}
Futurevoid> cancelListening() async {
_shouldRestart = false;
try {
if (state.isListening) {
await _speech.cancel();
}
} finally {
state = state.copyWith(isListening: false);
_shouldRestart = true;
}
}
/// プラグインの状態変化を監視、自動再起動
void _statusListener(String status) {
final listening = status == SpeechToText.listeningStatus;
state = state.copyWith(isListening: listening);
if (!_shouldRestart) return;
if (status == SpeechToText.doneStatus ||
status == SpeechToText.notListeningStatus) {
Future.delayed(_restartDelay, () {
if (_shouldRestart) startListening();
});
}
}
/// エラーリスナーでリトライ
void _errorListener(SpeechRecognitionError err) {
state = state.copyWith(isListening: false);
if (_errorCount _maxErrorRetry) {
_errorCount++;
startListening();
}
}
}
/// コマンド登録用ハンドラ
class CommandHandler {
final ListMapString, VoidCallback>> _scopes = [{}];
void addCommands(MapString, VoidCallback> cmds, {int priority = 0}) {
while (_scopes.length = priority) _scopes.add({});
_scopes[priority].addAll(cmds);
}
void removeCommands(MapString, VoidCallback> cmds, {int priority = 0}) {
if (priority _scopes.length) {
cmds.keys.forEach(_scopes[priority].remove);
}
}
void handleCommand(String words) {
for (final scope in _scopes.reversed) {
for (final entry in scope.entries) {
if (words.contains(entry.key)) {
entry.value();
return;
}
}
}
}
}
/// Provider 定義
final speechToTextProvider = Provider((_) => SpeechToText());
final speechStateProvider =
StateNotifierProviderSpeechStateNotifier, SpeechState>(
(ref) => SpeechStateNotifier(ref.read(speechToTextProvider)),
);
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutterapptest/speech_state.dart';
class HomePage extends ConsumerStatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
ConsumerStateHomePage> createState() => _HomePageState();
}
class _HomePageState extends ConsumerStateHomePage> {
@override
void initState() {
super.initState();
_startSpeech();
_addCommands();
}
@override
void dispose() {
_stopSpeech();
_removeCommands();
super.dispose();
}
/// 音声認識を開始する。
Futurevoid> _startSpeech() async {
if (!mounted) return;
final SpeechStateNotifier speechStateNotifier =
ref.read(speechStateProvider.notifier);
await speechStateNotifier.initializeSpeech();
if (!mounted) return;
await speechStateNotifier.startListening();
}
/// 音声認識を停止する。
Futurevoid> _stopSpeech() async {
if (!mounted) return;
final SpeechStateNotifier speechStateNotifier =
ref.read(speechStateProvider.notifier);
await speechStateNotifier.cancelListening();
if (!mounted) return;
await speechStateNotifier.stopListening();
}
/// コマンドを登録する。
void _addCommands() {
final SpeechStateNotifier speechStateNotifier =
ref.read(speechStateProvider.notifier);
speechStateNotifier.commandHandler.addCommands({
"こんにちは": () {
debugPrint("音声コマンド: こんにちは");
},
});
}
/// コマンドを登録解除する。
void _removeCommands() {
final SpeechStateNotifier speechStateNotifier =
ref.read(speechStateProvider.notifier);
speechStateNotifier.commandHandler.removeCommands({
"こんにちは": () {},
});
}
@override
Widget build(BuildContext context) {
final s = ref.watch(speechStateProvider);
return Column(
children: [
if (s.isListening || s.recognizedWords.isNotEmpty) ...[
Container(
color: Colors.black54,
padding: EdgeInsets.all(4),
child: Text(
s.isListening ? '🔊 音声認識中…' : '🔈 停止中…',
style: const TextStyle(
color: Colors.white, fontWeight: FontWeight.bold),
),
),
if (s.recognizedWords.isNotEmpty)
Container(
color: Colors.black26,
padding: EdgeInsets.all(4),
child: Text('認識結果: ${s.recognizedWords}',
style: const TextStyle(color: Colors.white)),
),
],
ElevatedButton(
onPressed: () async {
final ctrl = ref.read(speechStateProvider.notifier);
await ctrl.initializeSpeech();
await ctrl.startListening();
},
child: const Text('開始'),
),
ElevatedButton(
onPressed: () =>
ref.read(speechStateProvider.notifier).stopListening(),
child: const Text('停止'),
),
],
);
}
}
実際のプロジェクトのコードをそのまま載せることができないので、シンプルに改変した画面と音声認識のコードを用意しました。
Riverpod+StateNotifier で音声認識の初期化・開始・停止・自動再起動・エラーリトライを1つのクラスに集約ConsumerStatefulWidget を使い、initState/dispose で画面ライフサイクルに紐づけCommandHandler を組み合わせることで「○○と言ったら△△を実行」といったコマンド機能を柔軟に実装この構成をベースにすれば、実際のプロジェクトでも 画面と音声認識の開始/停止を強く結びつけつつ、キーワード検出による任意アクション をシンプルに実現できます。
本記事で紹介した構成をベースにすれば、Flutter アプリでの音声認識機能を保守性高めで実装できるはずです。ぜひ一度お試しいただき、さらに自分のプロジェクトに合わせたカスタマイズを加えてみてください!
Views: 0

はじめに
こんにちは、競技プログラミングのコンテストに参加している yunixです。
この記事では、去年のマスターズ選手権の A 問題をカルマンフィルタを使って解いてみようと思います。
なぜいまさら去年のマスターズ決勝をテーマにした記事を書いているかというと、
A 問題で当日トップだったチームがカルマンフィルタを使っているという話は Twitter で聞いていた
カルマンフィルタがどういう問題を解くために使えるかいまいちわかっていなかった
カルマンフィルタを使った解法を解説している記事はなかった(ような気がする)
という事情があります。要するに復習を一年以上サボっていたのですね。…
Source link
Views: 0