opencvで顔認識しようとしたらカスケードファイルが見つからなかった
opencvのカスケードで顔認識をしたい!
今回の環境です
こんな感じです.windowsとかUbuntuではどうなるかよくわかりません
モザイクアートをつくっていたら画像の大きさがバラバラだったので,正方形にできたら楽だな〜って思いました. 今回は顔判別をしてトリミングするという目的でやっていきま!
Pythonでopencvを使いたい!
pip install opencv-python # pip3を使っているなら pip3 install opencv-python
これだけでおk!pipは簡単でいいですね
カスケードファイルを取ってくる
opencvで顔認識をするにあたりopen-cv側ですでに用意されている顔認識モデルを使っていきます。
僕はここで結構躓いたんですけど・・・
だいたいのサイトでは
/usr/local/opt/opencv/share/OpenCV/haarcascades/
ここにカスケードファイルが入っているよ!とのことなのですが、僕の場合は仮想環境でインスコしたためかこのディレクトリがそもそも存在しませんでした.そこでcv2のライブラリが入っている場所を調べてみようと思いました.
import cv2 print(cv2)
これでopencvがどこに入っているかがわかります
<module 'cv2.cv2' from 'パスがうんにゃらってかいてある/python3.6/site-packages/cv2/cv2.cpython-36m-darwin.so'>
こんな感じ
どうやら /python3.6/site-packages/cv2/ のなかになにかありそうですね・・・ 僕の場合は/python3.6/site-packages/cv2/dataのなかにカスケードファイルが入っていました〜これ躓きポイントでは・・・?
こうやって詰まるたびに同じ思いを次の自分がして欲しくないのでmyModules.pyみたいなものを作っています.
""" cv2カスケードファイルを探しに行って辞書で返す関数 castom_cascade_pathはカスケードファイルが格納されているディレクトリをさします。 自分の環境に合わせて作ったのでデフォルト引数がdataになっています。 カスケードファイルが見つからなかったらFalseを返します """ def search_cv2_cascade(castom_cascade_path="data"): from os.path import splitext, basename, join, dirname, isdir, isfile from glob import glob import cv2 cv2_path = dirname(str(cv2).split()[-1].strip(">").strip("'")) cascade_dir_path = join(cv2_path, castom_cascade_path) if isdir(cascade_dir_path): cascade_xml_path_list = join(cascade_dir_path, "*.xml") cascade = {splitext(basename(path))[0][12:]:path for path in glob(cascade_xml_path_list)} return cascade else: return False
こんな感じで使えばxmlファイルがどさっと辞書型で返されます.なぜ辞書を使うかは,僕が好きだからです
search_cv2_cascade()
本題の顔認識
import cv2 import matplotlib.pyplot as plt #画像を読み込む src = cv2.imread("画像のパス") #グレースケールにする cv2_img = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) #黒色で認識した部分を囲む color = (0, 0, 0) #カスケードファイルの読み込み face_cascade = cv2.CascadeClassifier(search_cv2_cascade()["frontalface_default"]) #まほうのことば(コピペソースなので全くまだ調べてないです) facerect = face_cascade.detectMultiScale(cv2_img, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1)) #1つ以上囲む部分があれば元の画像に矩形を付け足す if len(facerect) > 0: #検出した顔を囲む矩形の作成 for rect in facerect: cv2.rectangle(src, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2) #結果をmatplotlibで表示 plt.imshow(cv2.cvtColor(src, cv2.COLOR_BGR2RGB)) #保存 cv2.imwrite("detected.jpg", src)
Twitterの僕のアイコン
顔認識させて見た結果
微妙で草・・・・
おわりに
なんとなくopencvを触って見ました。画像処理をMNISTでしか(PyTrochでMNISTをDNNで判別しただけ・・)触ったことがなかったので結構面白かったです。なんとかモザイクアートスクリプトを早く完成たせたいところ・・・!!!
【しゃべフェス】1分間の夢を体験しに行ってきた
しゃべフェスに行ってきた!
会える! 話せる! VTuberおしゃべりフェス on バレンタインのチケット情報・予約・購入・販売|ライヴポケットこれです
僕はテストが13:00からあったので到着が15:30位になってしまいました。テストはまぁ…まぁ…と行った感じです。
会場の写真
ただのZeppですね
プレゼントボックス
写真はないです…
名取のところめっちゃ色々入ってた!
僕も手紙を書きました〜
当日の流れ
16:00〜 物販開始
〜 17:30 自分の物販はおわり
18:00〜 開場
20:00〜名取とお話し
20:05〜 フブキちゃんとお話し
物販
プロマイドです.一枚500円かと思っていたら2枚で500円でした.スタンドを買って飾ります!缶バッチもあったんですけど,お金がなくて買えませんでした・・・・かなしい・・・ですが!ぎゅてちて…だこちて…チケットは買えました
入場
整理券はB72でBの中では結構早かったんですけど,空腹と疲労でアナウンスが聞こえずB250くらいでの入場になりました・・・(Vのファンみんな優しくて「みすっちゃいました!!!」っていったら前までどんどん先に行かせてくれてありがとうございます・・・・)(ホントは直接お礼を言いたいところなんですが,出会えそうにないのでブログで感謝を述べます)
めっちゃ誤字ってる・・・めちゃめちゃ焦っていたんだと思います
整理番号B72なのにバカだからB250の時くらいにはあった
— naporitan🍆 (@naporin24690) 2019年2月15日
ぎゅてちて…だこちて...チケット
なんか聴き始めた途端室内でこっちはあったかいんだよって寒暖差マウント取られた…いやこちらだって雪国出身で寒さには強いうえにダウンちゃんと着てきましたが・・・・?ここでは全然まだ負けていません.当たり前です.目を閉じて下さい....といわれたのでいわれるがままに閉じました.(大人はいうことをちゃんと聞けるため),毅然とした態度で目を閉じで妄想を膨らませていると名取が後ろからきてぎゅとされた…(とおもったらうさちゃんせんせえでした????)(ぎゅてされた途端声が出たので負けです…)
内容はBoothで聞けるように名取がしてくれています.(圧倒的感謝・・・・)
誰と喋った?
名取!
名取と話す前のツイートです
バイノーラル配信動画を見てシャドー喋りングしてる
— naporitan🍆 (@naporin24690) 2019年2月15日
心は鋼心は鋼
— naporitan🍆 (@naporin24690) 2019年2月15日
心ははがね
— naporitan🍆 (@naporin24690) 2019年2月15日
I am the born of my sword....
— naporitan🍆 (@naporin24690) 2019年2月15日
かなり己と戦っている様子がうかがえますね・・・
はじめて2ショット!10秒くらいここでつかいました.ただ5年後10年後にこの写真をみてこの時のことをこのブログを見ながら思い出したいって感じですね
ここから会話
ワイ<たいよろ!
名取<たいよろ~!
ワイ<今日は負けません!
名取<大人が勝ち負け気にしてるのは負けなのでは?
ワイ<(は・・・・?ぐぅ正論じゃん・・・)(一瞬の思考で負けたことを認知)(ここで負けを否定することはワンちゃんズ以下だッ!)負けました・・・(ここで残り30秒)
名取<何かを言っていた気がする(申し訳ないすべてを覚えているわけではないため)
ワイ<今回どうしても面と向かって言いたかったこと(感謝の意)を伝えた(かなり自分の中では大切なことで今でもそのことが自分の原動力となっているため)
名取<うん.わかったよ!(多分こんな感じだった気がする)
ワイ<名前いうの忘れてた!なぽりたんってっていうんですけど・・・
名取<なぽりたん・・・なぽりたんせんせえ!?(なんか二度見みたいな反応をされました)
ワイ<(あと5秒か・・・)多分今日はありがとう!みたいなことを言った気がする.たいありでした!(ここでちょうど1秒前)
名取<たいあり~!
こんな感じの流れです.絶対に言いたいことは1つしか言えないといった感じでした.ホントはぎゅてちて...だこちて...の感想とかも言いたかったんだけど今思えばかなり緊張していたのかも
Twitterではちゃんとイキってますね.僕らしいです
めっちゃ普通に話せた
— naporitan🍆 (@naporin24690) 2019年2月15日
バイノーラル配信を物販待機の時聴き続けてたからマジで耐性ついてた
— naporitan🍆 (@naporin24690) 2019年2月15日
いい訓練だった
名取...結構話遮ってしまってごめん・・・・時間確認していたら結構あせっちゃった・・・
名取あーりーがーとー! pic.twitter.com/xOcxPNNMiJ
— naporitan🍆 (@naporin24690) 2019年2月15日
フブキちゃん
はじめはおるやんけがめっちゃうろうろしてくれててめっちゃひぃぃってなった!(もちろん楽しかったです!)
バ美肉DbDのお話をしました!またおじさんを可愛い声で鳴かせてくれるとのこと…待ってるぞ…(この可愛さやっぱり猫じゃないか!)
もらった(すこーん!)
紹介動画が流れてた
順番とか書いてある紙が配られた〜
塩天使リエルちゃんがマジでおもろーだったのでフォローしてチャンネル登録した!
名取の紹介動画めちゃ面白かった!ようつべに上がるらしいので早く見たいー!
2/16: 名取のちゃんねるにて上げられました
最後に
雰囲気といい、ファン同士の交流といい満足度のかなーり高いイベントでした!名取めちゃ可愛かったぞ…今後もこう言ったイベントが増えればなぁと思います。運営結構大変そうだった〜やっぱりあれだけ通話かけてる上にみんなスマホ使ってるから回線が大変なんやなって…
1日置いて加筆しているのですが,結構感情がふきだしてきました.アドレナリン出まくってて話すときはあんまり緊張してなかったからかも.自分は名取と話したのか・・・という感情になった.はじめて自分1人の声だけが名取に届いた瞬間が1分あった日だったので2/15は何かの記念日にすべきだと思います.言えたこと,言えなかったこと両方とも会ったけど自分の気持ちを推しに表現できて本当に良かった・・・
名取愛してるぞ…
Railsのインストールでハマった話
sqlite3 のバーションで怒られた!
僕はmacだったので最速!MacでRuby on Rails環境構築をみながら環境構築をしていました. Rubyのバーションは2.4.0にしました.
bundlerインストールって項目まで先ほどのサイトで行ってからrailsのインストールは公式サイトのRails をはじめようで進めていたのですが
rails server
やってhttp://localhost:3000に接続すると・・・・・・・でました!!!!!!でやがったぞ!!!!!
#<LoadError: Error loading the 'sqlite3' Active Record adapter. Missing a gem it depends on? can't activate sqlite3 (~> 1.3.6), already activated sqlite3-1.4.0. Make sure all dependencies are added to Gemfile.>
うっきうきで始めたらこんなん出てきてやる気失うやつ・・・
今回はこれを解決していきます
Gemfile で sqlite3 の gem install を書き換える
Gemfile を開くと多分 9 行目くらいに以下があると思います
gem 'sqlite3'
次にように書き換えちゃってください.上のエラーで
「すでに sqlite3-1,4.0 が入ってるけど 1.3.6 の方がええやで」
って感じのことを言われているので(英語弱者なので間違えてるかもしれませんが・・・・)次のように書き換えてインストールするバーションを変えてあげます.
ここからしただけやればいいような気がします
# gem 'sqlite3' gem 'sqlite3', '~> 1.3.6'
sqlite3-1.4.0 を消そう!
1.4.0 はもう用済みなので消してしまいしましょう!じゃあな!バグの原因!!!!
gem uninstall sqlite3 -v 1.4.0
さて設定ファイルからアップデートだ!
bundle update
これで
rails server
が難なく起動してエラーもなく大好きな この画面が出てくると思います.
終わりに
Rails をちょっとやる機会が週末ありそうなので先に環境構築しようとしたらハマったので書きました.
環境構築は何かと難しいですね・・・・・
Vue.jsをFlaskで動かす
Vue.jsをFlaskで動かしたい
VueとFlaskの連携について説明します.flask_restfulを用いて簡単な通信もやります.
Vueのプロジェクトを作る
vue init webpack test
いろいろ聞かれますが,だいたいEnterで大丈夫です.ESLintだけは使い方がよくわかってないのでNoにしてます.
まってるとめっちゃインストーーーーーーーールって感じになるので放置です.結構長い時間がかかるかも
インストールが終わったら以下のコマンドでプロジェクトに入っておいてください
cd test
あとで使うのでインストールしておくといいかも・・・
npm install axios --save npm install url-join --save
Flaskをインストール
先ほどtestディレクトリに入ったのでそのまま
mkdir env python3 -m venv env source env/bin/activate pip3 install flask flask_cors flask_restful
これでとりあえずFlaskを使える環境は整いました
Flaskでサーバーを立てる
次にFlaskでwebサーバーを立てます
そのまえにVueのプロジェクトをビルドして・・・・
npm run build
ビルドしている間にバックエンドの方やっちゃいましょう!
ファイル名はserver.pyで
配置する場所はプロジェクトフォルダ直下(index.htmlとか.gitignoreある場所)
from flask import Flask, jsonify, render_template from flask_cors import CORS from flask_restful import Api, Resource, reqparse app = Flask(__name__, static_folder="dist/static", template_folder="dist") CORS(app) api = Api(app) #get, post, put, deleteリクエストがあったときの処理をそれぞれ書く class test(Resource): parser = reqparse.RequestParser() # add_argumentでパラメータを取得できます # この辺はflask_restfulの公式ドキュメントに色々乗ってるのでそっち見た方がよさげ parser.add_argument("message") def get(self): args = self.parser.parse_args() return {"message": args["message"]} def post(self): args = self.parser.parse_args() return {"message": args["message"]} def put(self): args = self.parser.parse_args() return {"message": args["message"]} def delete(self): args = self.parser.parse_args() return {"message": args["message"]} api.add_resource(test, "/api/test") @app.route('/', defaults={'path': ''}) @app.route('/<path:path>') def get_vue(path): return render_template('index.html') # 一応エラーハンドラ @app.errorhandler(403) @app.errorhandler(404) @app.errorhandler(500) def error_handler(error): msg = 'Error: {code}'.format(code=error.code) return jsonify({"result": "Failed", "message": msg, "errorcode": error.code}) if __name__ == "__main__": app.run(host='0.0.0.0', debug=True)
python3 server.py
これでlocalhost:5000につないだときにVueの画面が出てこれば成功です
server.jsも全く同じことしてるんだから早めに気づけばよかった・・・って思ってます
API叩きたくない?叩きたいよね
先ほど作ったserver.pyにAPIが生えているのでちょっと通信してみましょう
いちいちビルド(npm run build)していると面倒なので開発版でもserver.pyに接続できるようにします.
と言っても,npm run devで立つサーバーとserver.pyで立てるサーバで2つあるからserver.pyの方に誘導してあげるだけですが・・・・
APIと通信するモジュール(myAxios.js)
import axios from 'axios' const urljoin = require('url-join'); const debug = process.env.NODE_ENV != 'production' const debug_url = "http://localhost:5000" const onSuccess = (res) => { if (debug) console.log(' << ' + JSON.stringify(res.data)) return Promise.resolve(res) } const onError = (res) => { console.log(res) throw new Error('API error') } const accessUrl = (endpoint) => { if (debug) return urljoin(debug_url, endpoint) else return endpoint } const debugMessage = (type, url, params) => { console.log(type + ": " + url + '\nparams: ' + JSON.stringify(params)) } export default { get: (url, params) => { let reqUrl = accessUrl(url) if (debug) debugMessage("GET", reqUrl, params) return axios.get(reqUrl, { params }).then(onSuccess).catch(onError) }, post: (url, params) => { let reqUrl = accessUrl(url) if (debug) debugMessage("POST", reqUrl, params) return axios.post(reqUrl, params).then(onSuccess).catch(onError) }, put: (url, params) => { let reqUrl = accessUrl(url) if (debug) debugMessage("PUT", reqUrl, params) return axios.put(reqUrl, params).then(onSuccess).catch(onError) }, delete: (url, params) => { let reqUrl = accessUrl(url) if (debug) debugMessage("DELTE", reqUrl, params) return axios.delete(reqUrl, { data: params }).then(onSuccess).catch(onError) } }
const debug_url = "http://localhost:5000"
となっているのはserver.pyがポート5000で立つからです.server.pyの立つポート別の時はそれを指定してあげてください
test.vueをcomponentsの中に作ってください.内容はこんな感じ
<template> <h1> {{get}} {{post}} {{put}} {{del}} </h1> </template> <script> import myAxios from "./myAxios.js"; export default { name: "ApiTest", data() { return { get: "", post: "", put: "", del: "" }; }, created() { myAxios.get("api/test", { message: "Hello" }).then(res => { this.get = res.data.message; }); myAxios.post("api/test", { message: "World" }).then(res => { this.post = res.data.message; }); myAxios.put("api/test", { message: "Vueと" }).then(res => { this.put = res.data.message; }); myAxios.delete("api/test", { message: "Flaskの連携" }).then(res => { this.del = res.data.message; }); } }; </script>
このままだとHelloWorld.vueしか表示されないのでちょっと変えます.
router/index.jsを以下のように変更
import Vue from 'vue' import Router from 'vue-router' import test from '@/components/test' Vue.use(Router) export default new Router({ mode: 'history', routes: [{ path: '/', name: 'Test', component: test }] })
npm run devしてhttp://localhost:8080に接続すると・・・ できましたね!
もちろん
npm run build
をしてhttp://localhost:5000に接続しても同じ画面になると思います.
終わりに
FlaskとVueの連携を説明してみました. めっちゃむずかしそーって思ってたんですけど案外簡単ですね!これでめんどくさそうなDB処理はPythonでかけそうです
というかVueRouterでルーティングした時Flaskでルーティングしたところあけなきゃいけないのかなぁ・・・・まだまだわからないところがあるので実験して分かったらまた記事を書きます〜
そろそろPyTrochとかの記事書きたいんだけど,如何せんチュートリアルに書いてある以上のことがまだできてない・・・・チュートリアルがある程度理解できたらなにか書くかもしれません
多分MQTTサーバーをFlaskで作ったよ〜って記事が先になると思います
こんな感じで今回は終わりにします.ありがとうございました
よかったらフォローしてね〜
タスク管理アプリを作った話
タスク管理アプリを作りました
まぁオタクが作ったタスク管理アプリです.機能がいちいちコアユーザー向けな感じになってます. このブログでは作った経緯とかではなく新たに得られた知見とかを備忘録的につけていこうかと思います.
これがGitHub github.com
こっちが作ったサイト sana-task.herokuapp.com
タスクを完了すると名取が褒めてくれるアプリを作った#ヌォンタート pic.twitter.com/86hv8x9BZR
— napo naporitan🍆🐰💛 (@naporin24690) 2019年2月1日
PWAで作ってみたかった
1年前からPWAって言葉は知ってたんですが,どうやってやるのかわからずに今日までたちました. Vueでできるらしいということで調べたら
vue init pwa プロジェクト名
って書くだけですぐにできました.なんて楽なんだ・・・・・ SPAでいつも通りサイトを作ればすぐにPWAのネイティブアプリ感とサクサク感が体験できます!気持ちよすぎる
アイコンはデバイスの分だけ用意する必要がある
Android,iPhoneでホームに追加するときに表示されるアイコンを自作することくらいがいつもと違うところかなって思います. 僕は適当にキャラットってサイトでアイコンを作ってサイズ変更をしてsrc/static/manifest.jsonとindex.htmlの数行を変更しました.変更はgitのほうを確認してもらえるとすぐだと思います.
localStrageを使う
vuexを使ってデータを管理していて,ローカルに保存したい場合は
npm install vuex-persistedstate
をして
import Vue from 'vue'; import Vuex from 'vuex'; import * as actions from './actions'; import { getters } from './getters'; import { state, mutations } from './mutations'; import createPersistedState from "vuex-persistedstate"; //モジュールを追加 Vue.use(Vuex); export default new Vuex.Store({ actions, getters, state, mutations, plugins: [createPersistedState()] // これを追加 });
するだけですぐにローカルにstateデータが保存できます.
めっちゃ簡単.Vueすごすぎて去年までプログラムも全く分からないのにjQueryをコピペコピペしてた時間がもったいなく感じされますね・・・・
jsをimportできるようになった
これを作ったときは全く分からなかったです.適当に調べてできているので今のやり方でやってますが,どこかの記事でexport defaultはやめとけ~みたいな記事を見かけたので少し不安です .
Vueの環境だけで動いているやつです 例えばUNIXtimestampモジュールを作りたいな~と思ったら以下を書いて
timestamp.js
export default { toString: (timestamp) => { let d = new Date(timestamp * 1000); let year = d.getFullYear(); let month = d.getMonth() + 1; let day = d.getDate(); return year + "-" + month + "-" + day; } }
別ファイルで
import TimeStampModule from "modules/timestamp.js" //new Date()から生成されるtimestampはmsなので1000をかける let now = new Date().getTime() / 1000; let dateString = TimeStampModule.toString(now); console.log(dateString);
するとちゃんと動きました~
最後に
PWAでアプリを作りたーいって適当に作ってみましたが結構成長があったように思えます.あと割とRT,Favをもらえて喜んでいます!!!!めちゃめちゃうれしい!!!
年が明けました
気づいたら2019年新しい年が始まってました
去年は名取すきしか言ってなかったような気がしますが、今年も名取すきしか言わないつもりです
今年は1月に一回なにが作って出したいなぁと思ってます
fusion360でモデル作って出したり、変なアプリをたくさん作りたいと思ってます
昨日は大晦末だったので自分の中での毎年恒例なのですが、来年のこの日はなにしてるかなって考えました
今年はVがめちゃめちゃ流行ったけど引退、卒業イベントも流行った分だけありましたね
たまたま音声合成とか音声認識とか興味を持ってたのでVが近い未来、魂が引退したとしても音声認識→音声合成の技術があるので、他の魂が入っても声、声色、仕草(似せれば)が見分けつかないくらい一緒になるシステムが出来上がって、「Vtuber」のキャラクター自体が引退することはなくなるのかなと(この議論は夏くらいに死ぬほどされた気はしますが)思ったり思わなかったり〜(完全にオタク特有の早口)
単に推しがいなくなって欲しくないだけなんですけど…こんな思いを抱くことすら押し付けがましい〜っておもって年末はうだうだ考えてました。あと、引退した魂が報われないとかね
いつもはPCで書いてるんですけど今日はPC開く気にならなかったのでiPhoneで…
新年早々がっつりオタクの記事から始まりました。今年もよろしくお願いします。
名取が声に反応してくれるアプリを作りました
名取が声に反応してくれるResponSa-naを作りました
なにこれ???
名取さなアドベントカレンダー22日の記事です
辛いことがあったり疲れたりするそんな日々を送っていたかもしれない・・・(いたかな?)(そうでもない)(多分割と楽しかった)
そこで推しと喋れたらめっちゃ人生楽しくなってそれだけでQoL爆上がりキター(^o^)/ってなると思ったのでつくりました
こちらがつくったものです このサイトファンサイトであり、ご本人様とは無関係です。
これ自分で作っておいて何ですがめっちゃ楽しいです
コードとかレポート買いている時に「疲れた〜」とかいうと「頑張れ、無理せずに」って返してくれるんですよ
こんなの頑張るしかないじゃないですか!!
レポートがガリガリかけるようになりました!!!(作ってよかった〜)
作ってしまったけど大丈夫だったのだろうかという気持ちはあります。まずかったらすぐ消します
さなボタン(2)様のサイトを反応ボイスを選択する時に使っています。さなボタンの製作者様に感謝・・・・!圧倒的感謝
どうやって使うの?
Chromeのみ使えます(Chrome以外のせんせえ方ごめんね・・・・・)(この期にChromeに乗り換えて・・)(ごめんそこまでしなくていいよ)
説明するやつやっていくぞ!
1. 音声認識開始ボタン
- このボタンを押すと音声を認識してくれるよ(さあおしゃべり開始だ!)
2. 追加ボタン
- もっと認識させる単語、言葉を増やしたいってなったら押してね③④⑤の入力フォームが出てくるよ
- 20個まで登録できるよ〜
3. 単語、言葉入力
- 反応させたい単語、言葉を入れてね。入力した言葉に反応して名取が喋ってくれるよ
- ⑦に表示される言葉を全く同じものを入れてね例えば「楽しい」って⑦に出ているのに「たのしい」と入力していたら反応しないよ
4. 放送タイトル選択
- さなボタン(2)にあるボタンカテゴリがここで選べるよ。僕のオススメはがんばれ♡がんばれ♡です(これもうたまんねぇな・・・・)
5. 反応ボイス選択
- 再生したいさなボタンを選択してね③とうまく組み合わせると会話も可能かも!?
6. 削除ボタン
- なんかこの設定違うな〜ってのがあればこのボタンを押せば一行全て消せます。割とお手軽にしたはず・・・・(いるこの機能????)
7. テキストエリア
- 認識した言葉をここに表示するよ
- ここに表示された単語、言葉と全く同じものを③に入れるようにしてね!じゃないと反応しないから・・・・(うまいことできなくてごめんなさい・・・・)
一応一通り説明した(できてるのかこれ?)(わからん)(なにもわからん)のでつかってみてね〜〜〜
わからなかったり、こうしたらどうってのがあれば twitter.com ここまでどうぞ
作者の技術力は低いです。何とか完成までこぎついた感じです。なので本当にいろいろ教えて欲しい〜〜〜・・・・
最後に
マジで名取の配信のおかげで毎日生き生きできるようになっています。本当に励みになっています。名取はなんで?こんなに人気出てるのって言ってるけど間違いなく名取は一回の配信でみんなを確実に楽しませているし、1視聴者としてめっちゃ楽しんでる。これは間違いないと思う。僕はアーティストじゃないから絵とか可愛らしいものは全然作れないから、こう言った形で自分の気持ちを表現してみました。(作ってから気づいたけどこれかなりきもちわるくねーか???)
これからも名取がんばってくれよな!!!!
チャンネル登録者12万人おめでとーーー!!!
以上です