ホーム ブログ ページ 2

アピ図書ってなに??

0

アピリッツには社員皆さんが快適にオフィスライフを送れるよう、様々な制度を設けています。
今回は制度の一つであるアピリッツ図書、名付けて「アピ図書」について皆さんに知ってもらうために、
アピ図書を運営している「図書委員」に話を聞いてきましたのでご紹介していきます!
アピリッツのこともっともっと詳しくなっちゃいましょう!!

「アピ図書」ってなに??

ーーアピ図書ってそもそもなんですか?

会社の「図書室」として本の貸し借りを行うことが出来る制度です。
社員の方から「欲しい!」とリクエスト頂いた本が毎月どんどん入荷されており、現在では約1,400冊の本が貯蔵されています!

ーーシステムについても教えてください!

社内の有志の方が作ってくださった書籍の貸出や在架確認ができる書籍管理システムで運営しています。
PCでもスマホでもどちらからでもログインでき、アピ図書の利用・運営にはなくてはならない存在です。
直近では、UI改善などを目的としたプチリニューアルも実施し、今後図書委員の後輩がよりよいシステムにしてくれることを期待してます。

ちなみに委員会って??

アピリッツに入社する新卒社員は、入社から1年間、業務と並行して「委員」として社内で活動します。

美化委員や衛生委員など様々な委員会があり、図書委員もその1つです!

そんな中、図書委員はどんなことをしているのでしょうか。。!?

ーー図書委員ってどんなことをしているのでしょうか?

欲しい本のリクエストの受け付けや、入荷の手配届いた本の陳列などが基本的な業務です。
社員の方々が本を探しやすいように本棚の整理整頓はもちろん、貸し出し方法を訴求するポップ設置なども行っています。
また貸し出しの際に使用する「貸出システム(本のバーコードを読み取って、貸し出し処理ができるもの)も、エンジニアやデザイナーのメンバーと協力しながら改修を行っています!
その他にも、会社で読書の習慣が広まるように社内チャットツールで「アピ図書チャンネル」を立ち上げ、お薦めの本の紹介や俳句コンテストの開催などを実施中です。

ーー本の管理以外にもいろいろなことをしているんですね!!

どんな本があるの??

さてさて、話を戻してアピ図書にはどんな本があるのでしょうか。。!

ーー入ってくる本のジャンルは主にどんなものがありますか?

業務で活かせるエンジニア向け、デザイナー向けの書籍が多いです。
ただ、購入できるジャンル自体に制限はないので、本屋大賞を受賞した今話題のアノ小説!なども毎月一定数配架されます。

ーー新しい本はどれくらいの頻度で募集・納品されるんですか?

配架希望自体は通年、googleフォームから受け付けています。
月一で集計、希望いただいた書籍の中で既に配架済みのものがないかなどを確認して、問題ないものだけ人事の方に共有、注文いただくという流れです

ーーありがとうございました!


アピリッツにはこの他にも多くの制度があります。

これからもこうしたアピリッツの制度のことも発信していくので楽しみにしていてください!

Amazon Bedrockで始める生成AI活用 vol.1 ~概要編~

0

はじめに

AIエバンジェリストの浅田です。
生成AI関連の話題は枚挙に暇がないほど日々出続けています。もはや、日常の風景になりすぎて、ブームという言葉も相応しくないほどかと思います。さて、そんな生成AIですが、どうやって活用すればいいのかよくわからないという方もいらっしゃるかと思います。

そこで、生成AI活用のポイントについて、Amazon Web Services(以後、AWS)の生成AIサービスであるAmazon Bedrock(以後、Bedrock)の利用例を交えて複数回にわたって述べていきたいと思います。なお、様々な種類の生成AIがありますが、主にテキストデータを扱う大規模言語モデルを中心として扱います。特に断りなく生成AIと表記した場合はテキスト系生成AIであるとご理解ください。

もちろん、生成AIの技術はまだまだ発展途上にあると思いますので、ここに書いたことが完全な正解とは限らないとは思いますが、活用する際のなんらかのヒントにしていただければ幸いです。

今回は概要編となります。個々の要素は今後別記事でより深掘りしていく予定です。

生成AIの先祖

生成AIの具体的な活用を考える際に、生成AIのベースとなった技術の理解が重要であると考えます。テキストにおける生成AIといえばChatGPTが有名ですが、これが有名になった2022年ぐらいに突然この技術が生まれたわけではありません。GPTはGenerative Pre-trained Transformerの略称ですが、この名前が示すようにTransformerというAIモデルがベースになっています。現在の多くのテキスト系生成AIもTransformerがベースとなっています。

Transformerは各言語に特化したPre-trained(事前学習)されたモデルを特定のタスク向けに追加学習することによって、それまでの自然言語処理(NLP)におけるベンチマークを塗り替えました。Transformerのモデルが特定のタスク向けに追加訓練を必要としていたのに対し、現在のテキスト系生成AIは追加訓練をすることなく多様なタスクを実行することができる、というのが革命的な点の一つです。

Transformerが得意とする代表的なタスク

そのようなTransformerですが、代表的なタスクに以下のようなものがあります。

  1. 翻訳
    • 与えられた文章を、別の言語に変換する
  2. テキスト要約
    • 与えられた長文から、短い文章の表現に変換する
  3. 質問応答
    • 与えられた文章情報に基づいて、ユーザの質問に対する回答を生成する
  4. テキスト分類
    • 与えられたテキストについて、あらかじめ決められた区分のどれに該当するか分類する
  5. エンティティ抽出
    • 与えられたテキストから、固有情報(名詞、数詞など)を抽出する

翻訳とテキスト要約についてはわかりやすいと思いますが、その他について少し補足します。

質問応答

参考情報となる文章、例えば特定の事実に関して書かれた文章と、それに関する質問事項をセットで入力し、答えとなる文章を生成します。

例えば以下はWikipediaの東京に関する概要部分の引用ですが、

東京は、江戸幕府が置かれていた江戸(えど)という都市が1868年9月(慶応4年7月)に名称変更されたものである。もともと江戸の地には江戸幕府すなわち政府が置かれ、徳川家の人々と老中らが政治を行っており、その一方で京都にも、江戸幕府に日本統治を委任していた朝廷があり、天皇と太政官がいるといった状態の役割分担や二重構造(「複都制的」状態)があった。1869年3月28日に、京都に「都(みやこ)」としての位置付けを残したまま、「東京」に奠都(てんと)された。こうして東京は日本の事実上の首都の役割を担ってきた。

このような文章と、「東京の元々の名称はなんですか?」といった質問をモデルに与えてあげて、「江戸(えど)」と答えさせるようなタスクになります。生成AIを利用する際の重要技術となっているRAG(後述)の仕組みと非常に似ています。

テキスト分類

与えれた文章が、あらかじめ決められた区分(クラスとも呼びます)のどれに該当するかを判定させるタスクです。

代表的な例でいえば、SNSや口コミサイトなどにおけるユーザの書き込みを「ポジティブ」、「ネガティブ」、「ニュートラル(どちらとも言えない)」のどれに該当するかを判定する「ネガポジ」判定などがあります。

例えば、

  • 東京店でタコスを2つ注文したが最高だった
    • 「ポジティブ」と判定
  • アメリカへの旅行ツアーのチケットを3人分買ったが、手数料が1000円は普通の相場よりかなり高い
    • 「ネガティブ」と判定
  • 良いか悪いかは、だいぶ天気に影響されそう
    • 「ニュートラル」と判定

といった具合です。少ない量の書き込みであれば人が目で見て判定することも可能ですが、SNSなどの大量の書き込みを分析する際にはこのような技術が役に立つでしょう。

エンティティ抽出

ここでいうエンティティというのは固有名詞や数詞などになります。Named Entitiy Recognition(NER)と呼ばれたりもします。

先ほどの例で説明すると、

  • 東京店でタコスを2つ注文したが最高だった
    • 「東京」、「タコス」、「2」がエンティティ
  • アメリカへの旅行ツアーのチケットを3人分買ったが、手数料が1000円は普通の相場よりかなり高い
    • 「アメリカ」、「3人分」、「1000円」がエンティティ

という具合です。

ここで「これが何の役に立つの?」と思われた方もいるかも知れません。エンティティ抽出はこれ単体で役に立つというより、そのほかのタスクと組み合わせて利用することで真価を発揮します。

例えば、先述の「質問応答」の例の際に「東京の元々の名称はなんですか?」という質問の参考情報として、Wikipediaの東京の情報を与えました。ですが、「参考情報をどうやって取ってくるのか?」という問題があります。そこで、「東京」というエンティティが抽出できれば、「東京」というキーワードをもとにWeb検索などで参考情報を取ってくるというアクションが可能になります。

別の例として、オンライン注文システムのチャットボットを考えたときに、「テキスト分類」と「エンティティ」抽出の組み合わせが役に立ちます。先ほどの「テキスト分類」の例ではユーザの書き込みを分類していました。これを以下のように少し変更します。

  • タコスを2つ注文したい
  • アメリカへの旅行ツアーのチケットを3人分買いたい
  • 天気を知りたい

といったユーザの発言とします。オンライン注文システムのチャットボットとしては、以下の2つの情報が必要になります。

  • ユーザの意図は何なのか?
    • 何かの情報を知りたいのか
    • 何かを注文したいのか
  • 注文するとしたら何を何個買いたいのか?
    • 料理なのか
    • 旅行チケットなのか

オンライン注文システムのチャットボットを考えたときに、「天気を知りたい」といったユーザの意図には答えないのが適切でしょう。なので、ユーザの発言が何を意図しているのかを「テキスト分類」において把握し、抽出された「エンティティ(何を、いくつ)」をもとにオンライン注文システムのAPIに対してリクエストを行うことで実際に注文を行うことができます。この仕組みは生成AIにおけるFunction Calling(後述)という仕組みと非常に似ています。

生成AIも同様のタスクが得意、かつお手軽に実行可能

これらのTransformerが得意とする代表的なタスクは、生成AIも得意とするタスクです。そして、前述のように生成AIにおいては追加学習をすることなく上記のタスクをこなすことが可能です。生成AI登場以前は、追加学習を行うプロセスや追加学習のための学習データを用意することも一つのハードルとなっていましたが、生成AIの登場によって、AIによるタスク実行の敷居が、生成AI登場以前とくらべて圧倒的に下がりました。

Transformer時代は英語用のモデル、日本語用のモデル、スペイン語のモデル…といったように各種言語用のモデルが必要でしたが、生成AIは多言語モデルのものが多いです。そのため、英語から日本語、日本語から英語への翻訳などは簡単に実行できます。さらに、既存のAIモデルは「翻訳」と「要約」とは別々のタスクでしたが、生成AIであればその二つを同時に実行できます。英語の文章を与えて、「日本語で要約して」とプロンプトに入力すれば「翻訳」と「要約」を同時に行えます。

日々の業務を分解して考えたときに、これらの生成AIが得意とするタスクを活用できる領域はないかを考えることが生成AI活用の第一歩であると考えます。そして、ビジネスのあらゆる場面で「言語」というインターフェースが使われているので、活用できる場面は必ずあるはずです。

生成AIの真価を発揮させるために

このようにテキストに対するAI利用のハードルを劇的に下げた生成AIですが、一方で生成AIだけの利用ではおのずと限界があります。生成AI単独利用時の課題点として以下のようなものが挙げられます。

  • ハルシネーションの低減
  • リアルタイムデータ、プライベートデータへの対応
  • 現実世界との連携

ハルシネーションの低減

生成AIのデメリットとして色々なところで取り上げられているので、ご存知の方も多いと思いますが、ハルシネーションとは「生成AIがもっともらしい嘘のテキストを生成すること」 です。例えば、先述の「質問応答」の例で言えば、「東京の元々の名称はなんですか?」に対し、「京都」などと回答するなどです。少し知識があれば明らかに嘘だとわかるわけですが、まったく日本のことを知らない人からすると信じてしまってもおかしくないでしょう。

これに対する有効な解決策としてよく用いられるのがRetrieval Augmented Generation(RAG) です。これは「生成AIに対して外部から取得した情報を参考情報として渡してテキストを生成させる手法の総称」です。先述のTransformerが得意とするタスクの「質問応答」と同じように回答の根拠となるべき情報を与えてあげることで、ハルシネーションをかなり低減できることが知られています。

また、RAGに使われたデータをユーザに示すことで、何を根拠とした回答であるかをユーザに示せるというのもRAGを行うメリットの一つです。それによって情報の確認がやりやすくなります。

RAG

リアルタイムデータ、プライベートデータへの対応

どんな生成AIモデルであっても、過去の時点の限られた情報で学習されています。当然のことながら、学習時に存在しなかった事柄や、学習データに含められなかった事柄に対しては正しく処理できません。そのため、リアルタイムな情報やプライベートな情報を処理するためには、その情報を生成AIに渡してあげる必要が出てきます。

例えば、最新の情報を得るためにWeb検索エンジンを使って情報を取得したり、社内のプライベートな情報を得るために社内のデータベースから情報を取得したりして、その内容に基づいて生成AIに応答を生成させる必要があります。こうすることで生成AIが学習していない最新の情報やプライベートな情報に基づいて処理をさせることが可能になります。

リアルタイムデータとプライベートデータ

現実世界との連携

生成AI自体は、テキストを入力として別のテキストを出力するツールとみなせます。すなわち、本質的には利用者とのテキスト情報のインタラクションに留まります。それだけでももちろん価値がありますが、現実世界に及ぼす影響はどうしても限定的になります。そこで、生成AIをより活用するために、生成AIにより外部APIの利用を自律的に行わせるAIエージェントという考え方があります。

AIエージェントの肝となる考え方は「どのようなアクションを、どのような情報を使って行うかを生成AI自体に判断させる」ということです。より具体的には、生成AIに対して「使用できるアクション(具体的にはプログラムにおける関数)」と「アクションに必要な情報(関数に与えるべき引数の内容)」を提示して、適切なアクションの判定とそれに付随するパラメータの抽出を行わせます。これは前述のTransformerが得意としたタスクの「テキスト分類」と「エンティティ抽出」の発展系とでもいうべきものです。

例えば、前述のRAGを行う際に、どのようにデータを検索するかという課題があります。利用者の入力に対し、Web検索すべきなのか、データベース検索すべきなのか、そもそも何かを検索すべきではないかの判断がまず必要になります。そして、Web検索やデータベース検索するにしてもどのようなキーワードを使えばいいかの判断も必要になります。このような判断を生成AI自体にやらせるのがAIエージェントの発想です。

これによって、生成AIはテキストを処理する役割を超えて、ITシステムの頭脳としての役割を果たすことができるようになります。

なお、このような機能はAmazon Bedrockで使用できるClaude3などの生成AIモデルではFunction Callingという名前で機能化されています。機能化されていないモデルであっても、プロンプトやファインチューニング(追加学習処理) によって対応することができます。

生成AI活用におけるAmazon Bedrockのメリット

生成AI活用における前述の課題を考えたときに、Amazon Bedrock自身が持つ、以下のような機能は生成AI活用におけるメリットになります。

  • 豊富な生成AIモデル
  • RAGのためのナレッジベース機能
  • AIエージェント機能
  • ファインチューニングによるモデルのカスタマイズ機能

さらに、生成AIの真価を発揮させるためには、生成AIのモデルやプロンプトだけでなく、 RAGの情報源となるデータ、連携する対象としてのシステムが重要になります。既にAWS上でビジネスにおけるシステムが稼働しているのであれば、データがAWSに既に存在することが多いでしょうし、既存のシステムと連携するという意味でも、生成AIをAWS上で稼働させることができるBedrockを利用することはメリットが多いと思います。

つまり、生成AIの活用のためのシステムインテグレーションをする上でも、Amazon Bedrockは便利なツールとなります。

さいごに

本記事で述べたことを端的に書くと、以下のようになります。

  • 現在の多くの生成AIのベースとなっているTransformerが得意としたタスクを生成AIも得意としており、そこに活用法のヒントがある
  • 生成AIの真価を発揮させるためには、データやITシステムとの連携が重要である
  • Amazon Bedrockはそのための強い武器となる

次回以降では、個々の要素について深掘りしていきたいと思います。

RPGのレベルデザイン(バトル編)の初歩について

0

今回は、アピリッツの知識共有サイト「ナレッジベース」で公開されている内容をアピスピでも紹介します。
ゲームディレクターとしても活躍されている巌光生さんの記事です。
是非最後まで読んでください!(初版:2023年2月1日)

 

先ずはゲーム全体のコンセプトを理解する。

製作するゲームのコンセプトを掴む。

例えばIPであればオリジナルのコンテンツである、

  • アニメ
  • 映画
  • コミック

などに基本のコンセプトが存在します。

特にIPの場合はゲーム化にあたり、それに独自の+αが加えられる場合もあるが、ユーザーにとってはオリジナルのイメージが反映されていることで、より没入感が生まれゲーム全体を引き立てる事ができます。

例として最近まで製作に携わったIP系のゲームを挙げてみます。このゲームのコンセプトはでした。

某海賊王のゲームですが、コミック上で仲間たちが総力戦を行うことがあまり存在しない。(主に対等か1VS多勢)本来、RPGであればパーティの職業や役割があり、パーティで敵に挑む形になるのですが、このゲームでは、コミックのイメージを元に以下のように構成しました。

  1. バトルフィードを4~6の区画に分け、各キャラクターを配置するようにした。
  2. 1区画には通常6人まで配置ができ、大きさにより存在できる体数が調整される。
  3. バトルの状況やステータスに応じてキャラクター同士の会話や演出が発生する。
  4. 各キャラクターには原作に応じたパラメーターを設定し、キャラクター性を引き立たせる。
  5. 区画間は対峙する敵がいない(倒した)場合と味方がピンチの場合に移動が可能になる。

上記のバトル設計を踏まえてパラメーターのテーブルを作成していく事になります。

データテーブルの設計

戦闘の仕様と方針が決定した時点で必要なパラメーターのテーブルを作成します。

キャラクターのイメージを具現化するように得手不得手をパラメーターに含んでいきます。パラメーターの種類や効果はかなり増えますが、後のダメージ計算などにどう結び付けるかを考慮し、数値化(比率や確率)やフラグ(有る無しによる判定)化することで扱いやすくなります。また、数値に関しては、今後の拡張も含めLONG INTEGERで幅を取っておくことが大切です。

レベルデザインとデータ作成と順序について 

ここから実際にデータを作成しレベルデザインを行っていくのですが、最終的な調整や追加を考慮して、以下の手順で設定していくことでスムーズな開発が行えます。

1)メインとなるプレイヤーキャラクターのステータスを設定する。

  • メインキャラクターの成長値や装備加算値を数値化し設定する。
  • 成長値や加算値は各ステージの難易度を仮定し増加率を定める。
  • 基本的にはゲーム全体の10%~20%まではなだらかな上昇で導入難易度を低めに設定する。
※上記は例として単一のパラメーターですが、実際には攻撃、防御、他複数の値が存在します。

2)キャラクターのステータスは ここでほぼ決定して規定値とする。

最終的に調整や追加は行えるが、全体に影響するため、第一にプレイヤーキャラクターを基準にしなければならない。

3)プレイヤーのキャラクターに対して敵のステータスを決定していく。

ここからが本当の意味でのレベルデザインとなります。プレイヤーのキャラクターに対して、強弱を決めることでバトルの難易度が決定されていきます。当たり前のことのようですが、このステータス決定の順番が大切です。

プレイヤー側のステータスがある程度固定化していれば、敵側のステータスはどのようにでも調整ができるからです。また、プレイヤーが追加された際にも、それに対応した敵を作成できるのでバランスが頭打ちになることがありません。

敵のデータはエクセルなどにダメージ計算式を仕込み、分かりやすい形でデータを算出できるようにしておくと良い。実際にどのような算出を行うかと言うと、例えば敵のHPを算出したい場合、プレイヤーの攻撃によるダメージ計算でどのくらいの値が出るかを割り出し、それに何回耐えられるかを設定するとよい。

例えばプレイヤーの与ダメージが敵の防御値を減算した場合の数値がAとした場合、3発は耐えられるとするなら、HP=A×3.2(コンマ以下は残HP)と言った簡単な算出が行える。

プレイヤーに与えるダメージにしても、プレイヤーの防御値を含めたダメージ計算でプレイヤーに対して何割くらいの与ダメージが与えられるかを計算すれば良い。プレイヤーが該当LVの時に200のHPであればHP全体の何%を減らせるかで攻撃値を算出できます。

ここまでのまとめ

  1. バトルのデータはゲームコンセプトに合わせて設計する。
  2. データの作成はプレイヤーから決定し、それを基準とする。
  3. 敵のデータはゲーム内のダメージ計算からできるだけ簡易に算出できるようにする。

上記を踏まえて、ダメージ計算式をエクセル、またはスプレッドシート上でシミュレートし、 バランスを目視できるようにすることで、全体のバランスも見えてきます。

トータルでのバランスとレベルデザインについて

ユーザーが遊びやすく継続しやすいデザイン

これは製作するゲームのコンセプトによって異なると思いますが、よりユーザーが遊びやすく継続しやすいバランスにすることが大切です。

ゲーム開始時は敵を容易く倒せる程度にする。全体ボリュームの10~20%はあまり悩まずに進めるほうが良いでしょう。デフォルトで戦って倒せる程度と言うことになります。

キャラクターを強くする、強化する事にユーザーが慣れ始めたら敵のステータスを上げていきます。この時に、ポイントとして弱点を設定し、ユーザーに強化することの意味を促します。加えて、敵のAI等に変化を加えバトルに対しての戦略性を促します。(回復や妨害などの行動を追加していく)

後半に向かってはロジック的に攻略方法を仕込んで行く工夫が必要となります。正しい行動に対して正解を導けるように敵の行動を組み立てることが必要になります。これもバトルとしてユーザーが飽きないようにするための手法です。

シナリオ、または世界観への没入を妨げないバランス

レベルデザインの要ですが、ゲーム進行の上で大切なのは物語の進展です。

ユーザーの心情に沿った敵の強さや障害は、よりバトルを引き立てます。シナリオとの親和性も十分考慮すべきでしょう。

なので、画一化したシステムでデータだけ完璧にしても、ユーザーにとってバトルは作業になってしまいます。

システム、ジャンルによる調整について

ここまで上げた例は、基本的にデータによるバランスのとり方ですが、システムによってはアクション重視のバトルもあります。ここでは簡単に手法だけ記載します。

アクション重視のRPG場合

データも無論重要ですが、ユーザーテクニックを重視する場合があります。この場合以下の方法で調整します。

  1. モーションヒットストップのタイミング(プレイヤー側)
    攻撃モーションに対してヒット時のラグタイム(次の入力許可)を制限します。
    大技ほどヒットストップが長く、 敵に対してプレイヤーの行動時間が制限されます。
    アクションの場合、ヒットストップは10f~60f程度なので、実際にはもたつきは感じません。
    また、行動のキャンセルなども行えればアクション性が高まります。
  2. AIの索敵時間(敵側)  敵の場合はヒットストップだけではなく、AI内にもウェイト(索敵)を仕込むことができます。
    行動命令が短いほど敵は強くなります。(連続行動、思考を進める)
  3. 上記に加え、モーションの長さなどにより、入力のタイミング、キャンセルをコントロールします。

巌さんありがとうございました!

アピリッツでは自分が得た情報や技術を積極的に共有し、それらを吸収しながら各々のスキルアップを目指しています。
アピリッツに少しでも興味を持った方、エントリーお待ちしております!

エントリーはこちらをチェック→〈https://recruit.appirits.com/

大好評!社内イベント開催しました!

0

こんにちは!今回は、先日当社で開催された社内イベントの様子をお届けします。競技には創造性と体力が試されるものが含まれ、社員一人一人が存分に楽しむことができました。最後までお楽しみください!

イベントの見どころを紹介!

1.誰よりも早く解き明かせ!頭脳編

脳みそフル回転!問題を解くのに、みんな真剣。ここぞとばかりに頭の回転を競いました。

そして問題を解くだけで終わらないのがアピリッツ。。

パズル問題を解く参加者はもう真剣そのもの。。

なんと、当日のサプライズルールとして回答が終わった人から採点者のいる場所までダッシュ!(は、危険なので早歩きで(笑))

採点者のところへGO!果たして正解していたのか。。!?

意外と難しくて苦戦。。(私もむっちゃ苦戦しました)そんなときの救済!名付けて「助っ人タイム」を用意し、わからないところを社員に聞いて回ったり、参加者以外とのコミュニケーションも取りながら、正解を探していました。

2. 全集中、バランス体力編

バランス力をキー――プ

片足立ちでどれだけ長く持つかを競うんですが、思った以上に盛り上がる!

白熱した戦いで見ている側もドキドキしました。。!

なんとこちらの競技にもサプライズルールが!!

片足立ちだけで終わるかと思いきや、つま先立ちまで!?

トーナメント戦で行われたこの競技。最後まで白熱していました。

3. センスを輝かせ!フォト・イラストコンテスト

事前に社員から寄せられた写真やイラスト作品を社内投票で選出。

「アニマルスピリッツ」というテーマに沿ったクリエイティブな作品がたくさん集まり、当日の結果発表の瞬間はドキドキ!

1~3位に輝いた作品たち。同じテーマでもこんなにもそれぞれの個性豊かな作品が!

イベントのハイライト

当日は社内でライブ中継もして、100名以上の社員がリアルタイムで視聴。画面越しにも応援の声が飛び交っていました。

三位おめでとうございます!配信内でも祝福の声が!!

競技ごとに豪華な景品が用意され、それがまたみんなを奮起させてました!

景品最後の一枠を見事つかみ取り喜びのピース!!

まとめ

イベントを通じて、社員同士の絆が一層深まり、互いの新たな一面を発見できたのでは。。!?終始、和やかな雰囲気の中、笑顔で終えることができたのが何よりの収穫。

またこんなイベントがあればいいなと社員みんなが思ってるはず。次回のイベントも、こんな感じで楽しめたらと思います。それでは、また更新しますね!

アピリッツのパパママ社員の働き方!

0

前回のアピスピでは、パパママリモート制度についてご紹介しました!
今回は、制度を利用せずに働くパパママ社員さんの働き方についてご紹介したいと思います!

~小学生のお子さんがいるママさん社員に聞いてみた!~

アピリッツではパパママリモート制度とは別で、週2回のリモート勤務が可能です。

週2回のリモート勤務を利用して働くママさん社員に、仕事と子育てを両立するコツをきいてみました!

リモートワークを活用して家族時間を大切に!

――仕事と子育てを両立するコツは?

どうしても時間の融通が利きにくいので、タスクの見極め、達成までのイメージはしっかり行います。イメージどおり進行していない場合に備えて、毎日ベースで細かくスケジュールを調整します。

また、急なトラブルに備えて、自分しかできないこと・知らないことを増やさないようにしたいのですが、忙しいとなかなか対応できないので、目下の目標です!

現在は、自分も主人もリモートワークができるので、子供が風邪で学校を休んだ時は主人と協力し合って仕事と子育てを両立しています

――リモートワーク時に気を付けていることはありますか?

時間を決めていないとだらだら仕事してしまうので、子供が家に帰ってきたら仕事しないっていうのを心がけています。

子供のそばで仕事をしているとセキュリティ上も良くないですし、一人っ子なので、子供を1人にして寂しい思いをさせないように家族の時間を大切にしています。

子供のいる生活は毎日が未知!だから楽しい!

――現役のパパママ社員や、将来の子育てと仕事の両立に不安を抱えている方々へひとことお願いします!

子どもがいると、時間に縛られたり突発的な事情が発生したりと全力で働けないイメージがありますが、私個人は自分の働き方を見直し、タスクを盲目的にこなすのではなく効果や達成までの道のりを見極めるようになり、仕事の質が上がったと感じています。

私も最初は思ったように仕事ができなくて葛藤することもありましたが、葛藤は誰でもあることなので、葛藤している自分に対してマイナスに思わないでほしいです。

道具や制度など仕事の両立をサポートしてくれる存在もたくさんありますので、大変そうと思わずに人生のいちイベントとして楽しんでくれたらいいなと思っています

~育休を取得したパパさん社員に聞いてみた!~

育休取りたてほやほやです!

――育休中の1日のスケジュールを教えてください!

今年の2月くらいから1か月ほど育休を取得していました!

「朝は日の光をちゃんとを浴びせる」「3時間おきにミルクとおむつ交換」「夜に眠れるように、昼は一緒に遊ぶ」など、よくある赤ちゃんのスケジュールで過ごしていました。

1人の時間と妻とのコミュニケーションを大切に。

――育児と仕事を両立するコツや逆に大変なことはありますか?

自分が家だと集中できないことと、家が少し狭いので家族と同じ空間で仕事をしなければならず、妻にも気を使わせるので利用していないです。。
機会があれば利用させていただきたいと思ってます!

アピリッツの先輩パパママ社員は子育ての強い味方!

――現役のパパママ社員や、将来の子育てと仕事の両立に不安を抱えている方々へひとことお願いします!

なんだかんだで子供は可愛いですし、今までとは違う意識で仕事に取り組めます。
良くも悪くも楽しいので、不安がらずいっそのこと楽しんでください!
あとは、一人で抱えないで同じパパママ社員と話すのが良いですよ。
アピリッツには先輩パパママ社員がたくさんいるので色々アドバイスくれると思います!

ーー貴重なお話をありがとうございました!!

アピリッツにはパパママリモート制度というものがあるらしい、、、!

0

アピリッツには多くのパパさん、ママさん社員が在籍しています。
でも子育てと仕事の両立はやっぱり大変・・・
アピリッツでは、そんなパパさん、ママさん社員を助けるべく、パパママリモート制度という制度を試験運用しています。
実際にパパママリモート制度を活用している社員さんへのインタビューをもとに、制度についてご紹介したいと思います!

パパママリモート制度とは??

アピリッツでは週2回のリモート勤務が可能です。
でも、「急に子供が体調不良になってしまった!」「子供のイベントに参加しないといけない!」「週2回のリモートだけでは足りない!」
そんなパパママ社員さんの声から生まれたのがパパママリモート制度!
子育てをするパパママを対象に、普段の週2のリモートワークに加えて、追加で取得できる制度です。


パパママリモート制度を活用している社員さんに聞いてみた!

ーー現在の働き方について教えてください。

現在はリモートと、時短でのオフィス勤務を併用しています。

ただ、子供が双子でまだ二歳ということもあり体調を崩しがちであったり、しかもそのタイミングもばらばらだったり、急な学級閉鎖などなど。。ハプニングが度々起こるのですが、そんな時にパパママリモート制度を活用させていただいています!

正直かなり助かっています。。これがなかったら有休はとっくに無くなっていました(笑)

ーーパパママリモートって実際どう?

月単位ではなく、年単位で取得上限が設けられているのはかなり助かってます。

実際、保育園などでインフルエンザ等に感染した場合に「解熱後24時間経ってから登園可能」といったルールが設けられていることがあります。

その時は、一週間ずっと家にいなければならなかったりするので、このリモート制度はめちゃめちゃ助かりましたね!

ーー現在は試験運用中ですが、パパママリモートの利用状況や課題等を確認しながら本格運用を目指していきたいと思っています!


アピリッツのパパママ社員の働き方は様々!

小学生のお子さんがいるママさん社員

「今はリモートワークが当たり前にある時代ですが、うちの子が小さかった頃はそもそもリモートワークという概念がなく、アピリッツでもリモート制度がなかったので大変でしたね。。今は子供も大きくなったので、週2回のリモート勤務を活用しています!」

育休を取得したばかりのパパさん社員

「パパママリモート制度があるなんて知らなかったです。。(笑)

うちは子供が生まれたばかりですが、今のところパパママリモート制度を利用する予定はないですね。(家だと集中できないのと、家が少し狭いため)機会があれば利用させていただきたいと思ってます!」


ーー貴重なお話をありがとうございました!!

アピリッツは働くパパママ社員さんを応援しています!!

今回はパパママリモート制度についてご紹介しました。

次回は制度を利用せずに働くパパママ社員さんの働き方についてご紹介したいと思います!

課金の実装時にサーバー側は何をやるのか

0

今回は、アピリッツの知識共有サイト「ナレッジベース」で公開されている内容をアピスピでも紹介します。
エンジニアとして活躍されている鳴澤秀夫さんの記事です。
是非最後まで読んでください!(初版:2021年12月22日)

え!!一切未経験なのに課金実装を!?

エンジニア兼デスクにフィギュアを置いてモチベを上げる者の鳴澤です。

執筆時現在はPHP/Laravelを使用してUnity製ソシャゲ(パズルゲーム)のバックエンドをやっています。

今回はその案件での体験談的なメモを残します。
注) 今回はあくまで「何をやるのかのメモ」程度ですので、詳細な手順やソースコードなどは割愛します。

サーバー側は主に”不正チェック”をする!

まず、課金処理がどのようなフローになっているかを以下のシーケンス図にまとめてみました。

サーバー側はこの中でも4〜7の工程が大事になってきます。

※ 課金APIとは、GooglePlayStoreやiTunesStoreといった課金プラットフォームが用意したAPIの意味です

これだけ見るとナンノコッチャだと思うので、以下で軽く解説してみます。

工程1〜3 アプリ(クライアント)側の処理 

ソシャゲで石を買おうとした時、AndroidやiOSのUIで「課金しますか?」みたいな確認画面が出ると思います。
そこで購入処理を行うと、アプリから課金APIへ購入処理のリクエストが送信されます。

正常に決済処理がされたら「レシート」データが返ってきます。(これが後に大事になります)

なんと、この時点で課金処理そのものは完成しているのです!

しかし大抵のソシャゲはアプリ側の処理だけでは終わらず、サーバー側と連携してアイテム付与などを行いますよね?

なのでサーバー側でAPIを実装し、アプリ側から叩いてもらいましょう。
その際、先程課金APIから返ってきた「レシート」をリクエストに含んでもらいます。

“レシート”とは何か

課金APIに決済処理をリクエストした際の取引の詳細がまとまったJSONデータです。
プラットフォームによってはbase64で暗号化された状態で返ってきたりします。

決済をして返ってくるデータなので正にレシートと言ったところですね。

このレシートには主に

  • 購入日時(エポック秒)
  • 商品のID(ストア側で設定ができる)
  • 取引ID(トランザクション番号とも。アプリ単位で一意な文字列が入る)

といった、誰がいつ何を買ったかを一発で特定可能なデータが入っています。
この”一意なデータ”であることが、今後のチェック処理で大事になってきます。

工程4〜5 レシート検証

アプリ側からサーバー側へは、決済時にストアから返ってきたレシートをリクエストに含めてAPIを叩きます。
サーバー側は、このレシートがあること(買った事実があること)を確認して石やアイテムを付与するんですね。

そこで悪い人は考えました。
偽装レシートを使ってサーバー側APIを叩きまくったら、大量に石をゲットできるんじゃね!?」

こういう悪人に”エラー表示”という正義の鉄槌を下すために実装するのが「レシート検証」です。

要するに不正防止策ですね。

実装方針

実はアプリ側に返ってきた物とは別に、ストア側にもレシートが保存されています。
ストア側の課金APIにレシートを請求することで、アプリから送られてきたレシートが偽装された物でないかチェックが可能なのです。

存在しないレシートだった場合は課金APIからエラーが返ってきますので、エラーか否かでチェックすれば間違いないので簡単ですね。

GooglePlayStoreではレシートを取得するためだけにOAuth認証をしてアクセストークンを取得する必要があるのですが、これが結構面倒でした。
この辺に関しては別の機会にまとめられたらと思います。

工程6〜7 重複チェック

ここまでの実装で、偽装レシートを用いた不正は防ぐことができましたね。

そこで悪い人は考えました。
過去のレシートを使って偽装じゃないと認識させれば、大量に石をゲットできるんじゃね!?」

こういう悪人を”わからせる”ために実装するのが「重複チェック」です。

アプリ側の問題で同じリクエストが2連続で飛んでくるケースもあるため、不正対策だけでなくバグ防止の観点でも大事な部分です。

実装方針

先程も軽く触れましたが、レシートには 「購入日時(エポック秒)」や「取引ID」といった組み合わせると完全に一意となるデータが色々入っています。

これらをゲーム側のDBに保存しておき、全く同じレコードが存在しないかを検索するのが一般的な手法です。

工程8 DBに保存 

こうして正常なレシートであることを証明できたので、DBの更新をします。

売り物のアイテムをユーザーDBに付与して保存する他、先程の重複検証で用いた”一意なデータ”も別途テーブルに保存します。

ここでレシートの値を保存することで、次回以降の重複チェックで比較対象として使われていくことになります。

他にも何かやるの?

  • 各ストアにテスト用の商品を登録(面倒)
  • 各ストアにテストプレイを許可するアカウントを登録(面倒)
  • OAuth認証やトークン周りの実装(面倒)
  • サービス用のアカウントを作成し、課金APIのアクセス権限を付与(面倒)
  • 今回の記事は通常課金のケースだけど、別途月額課金にも対応するよう実装(超面倒)

と、やることが結構多くて実装頑張ったなと自分でも思います。
この辺は今後少しずつ紹介できたらなと思っています。


鳴澤さんありがとうございました!

アピリッツでは自分が得た情報や技術を積極的に共有し、それらを吸収しながら各々のスキルアップを目指しています。
アピリッツに少しでも興味を持った方、エントリーお待ちしております!

エントリーはこちらをチェック→〈https://recruit.appirits.com/

新入社員たちのビジネスマナー研修、そのリアルな現場から

0

こんにちは!今日は、新卒社員を対象にビジネスマナー研修を行いました。どんな風に過ごしていたか、ちょっと覗いてみましょう!

緊張と真剣さが交差する講義時間

マナー研修日、新入社員たちは真新しいスーツに身を包み、何やら緊張した面持ち。講義が始まると、みんな真剣そのもの。社会人として知っておくべきことを一つひとつ学んでいきます。

筆記用具を片手に、講師の話に耳を傾ける姿はまるで大学の講義を思い起こさせるよう。でも、ここでの学びは学問だけでなく、「実際のビジネスシーン」で使う実践的なもの。それが、彼らの緊張感を一層高めているようです。

リラックスして学ぶ、グループワークの時間

講義中には、グループワークでの実践も挟み、講義で学んだ内容を元に、ロープレ形式で実践的な練習を行います。最初はぎこちない動きも、同期が助けてくれたり、互いに笑いあったりしながら、だんだんと慣れてきます。

自身の携帯を利用しての電話研修。いろんなシチュエーションで何度も挑戦!
新卒社員にとって初めての名刺交換。我々もルールを改めて聞いて再発見する面もありました(笑)
研修のグループは完全ランダムでしたが、全員初めてという共通点から仲を深めていきました。


この時間があるからこそ、新入社員たちは緊張を解きほぐし、自然体でスキルを身につけることができるんですね。お互いに「こうしたほうがいいよ」とアドバイスを交換する姿は、まるで学生時代のグループ活動を思い出させます。楽しみながら学ぶ、これが成長への近道かもしれません。

研修終わりには。。

研修が終わる頃には、朝の緊張した面持ちもどこへやら。新入社員たちは少し疲れた様子もありますが、明らかに自信に満ちた表情に変わっています。実際に研修を終えた新卒社員の声を聞いてみると。。

・現在だけでなく今後どのような社会人になりたいのかなど将来的な物事を考えるきっかけにもなりました。
・マナー・身だしなみ、所作、振る舞いはすごく周りに見られる。会社の代表として恥ずかしくない振る舞いをしたい。
・想像以上に細かいマナーが存在していてびっくりした。

一日でこんなにも変われるんだから、これから数ヶ月、数年で彼らがどれだけ成長するのか、考えるだけでわくわくします。そして、研修終わりには何か行われたそうです、、が、その様子はまた次回のアピスピで紹介します!

社会人としての一歩を踏み出した新入社員たち。彼らのこれからの成長に、私たちも大きな期待を寄せています!

UnitySentisでSpeechToTextをしよう

0

はじめに

コーヒーにこだわりたいけど豆に触れると沼だと思って手を出していません。ゲームエンジン・エンハンスメント学部 中村です。前回の記事ではUnitySentis+ML-Agentsのサンプルに触れたので、今回はもう少し踏み込んでUnitySentisを用いたSpeechToTextを実行しましょう。さらに声をコマンドにしてキャラクターを動かすちょっとしたゲームを作っていきます。

UnitySentis

前回の記事でも触れましたが、Unity Sentisはニューラルネットワークをもとに学習されたonnxファイルをインポートし、そのAIモデルをUnityがサポートするプラットフォームで直接実行することができます。これによって、音声認識や手書き文字認識などがWebを経由することがないので、ネットワークインフラに依存する必要がなくなります。

まずはサンプルから

何事もまずはサンプルから始めていきましょう。

UnitySentisでSpeechToTextを実行するためには、そのAIモデルが必要になります。SpeechToTextといえば、Web上から実行できる OpenAI 製の Whisper が有名なのでそちらを利用しましょう。WhisperはHuggingFaceにオープンソースで公開されており、その構造の詳しい説明書も含まれています。

今回はUnityから公開されているこちらのサンプルを使用していきます。このサンプルに含まれているファイルは以下のとおりです。

  • answering-machine16kHz.wav:テキストに変換したい音声ファイル
  • LogMelSepctro.sentis:音声波形をlog-melスペクトル変換するモデル
  • AudioEncoder_Tiny.sentis:log-melスペクトル変換された音声からその特徴量に変換するモデル
  • AudioDecoder_Tiny.sentis:音声特徴量とテキストトークンから次のトークンを予測するモデル
  • vocab.json:トークンと文字の組み合わせ
  • RunWhisper.cs:UnitySentisを利用してSpeechToTextを実行するコード

このサンプルではReadmeに記述されている通りの手順で実行していきました。

  1. Unity2023.2.11 で新規プロジェクトを作成し、サンプルファイル群をインポート
  2. com.unity.sentis パッケージをインポート
  3. RunWhisper.cs ファイルをMainCameraにアタッチ
  4. sentisファイルとvocab.jsonをAssets/StreamingAssetsフォルダへ移動
  5. answering-machine16kHz.wavをインスペクタから “Force Mono” と “Decompress on Load” をONにする

この状態でUnityをPlayすると、以下のようにデバッグログが出力されて音声がテキストに変換されている様子を確認できます。

音声を認識してテキストに変換していく様子

サンプルの中身を理解する

一旦 Unity 上で SpeechToText が動作していることを確認できました。ここで RunWhisper.cs がどのような動きをしているか見ていきます。私の理解でコメントを付けています。

void Start()
{
    // 推論に利用するテンソルをキャッシュ,もしくは単にメモリ割り当てを行う仕組み.
    allocator = new TensorCachingAllocator();
    // テンソル演算を実行するインスタンスを生成する(Opsはオペレーションか?).ここでbackendはSentisの実行環境を示しGPUを指定している.
    ops = WorkerFactory.CreateOps(backend, allocator);
    // 変換後の特殊文字を白埋めするのでその配列を初期化.
    SetupWhiteSpaceShifts();
    // vocab.jsonからトークンと文字の割当をロード.
    GetTokens();
    // StreamingAssetsからモデルファイルを読み込む.
    Model decoder = ModelLoader.Load(Application.streamingAssetsPath + "/AudioDecoder_Tiny.sentis");
    Model encoder = ModelLoader.Load(Application.streamingAssetsPath + "/AudioEncoder_Tiny.sentis");
    Model spectro = ModelLoader.Load(Application.streamingAssetsPath + "/LogMelSepctro.sentis");
    // 読み込んだモデルからニューラルネットワークを実行するワーカーのインスタンスを生成する.
    decoderEngine = WorkerFactory.CreateWorker(backend, decoder);
    encoderEngine = WorkerFactory.CreateWorker(backend, encoder);
    spectroEngine = WorkerFactory.CreateWorker(backend, spectro);
    // デコーダーに指定する入出力トークンを初期化する.
    // index:0 は 単に SpeechToText を開始する合図.
    // index:1 は 言語の指定.
    // index:2 は 同じ言語の文字列 に変換するか 別の言語に翻訳するか.
    // index:3 は 文字起こしにタイムスタンプを利用するか.
    outputTokens[0] = START_OF_TRANSCRIPT;
    outputTokens[1] = ENGLISH;// GERMAN;//FRENCH;//
    outputTokens[2] = TRANSCRIBE; //TRANSLATE;//
    outputTokens[3] = NO_TIME_STAMPS;// START_TIME;//
    currentToken = 3;
    // 音声をロード.
    LoadAudio();
    // ロードした音声を変換.
    EncodeAudio();
    transcribe = true;
}

まずRunWhisperのStart内では、テンソル演算に使用するオペレーションやニューラルネットワークを実行するインスタンスを生成しています。この際にAIモデルを指定すれば、内部でその演算を行ってくれます。

また、 outputTokens には SpeechToText の初期状態を設定するトークンを指定しています。このoutputTokensは音声をデコードする際に利用します。さらに LoadAudioでは単にAudioClipを浮動小数点配列として取り出し、 EncodeAudioencoderEnginespectroEngineによるエンコードを行っています。

void EncodeAudio()
{
    // 浮動小数点テンソルを 指定した TensorShapreに併せて生成.
    // ここでは data に音声データが含まれているため,音声データをテンソル化している.
    // SentisのTensorは IDisposable を持つため usingステートメントを利用する.
    using var input = new TensorFloat(new TensorShape(1, numSamples), data);
    // Whisperのエンコード/デコードに対しては30秒の音声データを入力しなければならないため,30秒に満たない場合には足りない分を0で埋める.
    // Pad out to 30 seconds at 16khz if necessary
    using var input30seconds = ops.Pad(input, new int[] { 0, 0, 0, maxSamples - numSamples });
    // 音声データをlog-melスペクトル変換して特徴量を計算する.
    spectroEngine.Execute(input30seconds);
    // 変換結果をTensorで出力する.
    var spectroOutput = spectroEngine.PeekOutput() as TensorFloat;
    // 音声データの特徴量を Whisperエンコーダーに入力する.
    encoderEngine.Execute(spectroOutput);
    // エンコード結果を受け取る.
    encodedAudio = encoderEngine.PeekOutput() as TensorFloat;
}

EncodeAudio メソッド内ではロードした音声データをWhisperエンコードしています。この処理自体は非常に簡単で、音声データからテンソルを生成して、log-melスペクトル変換、エンコード、と順に行っているだけでした。ただ、Whisperでは音声データの長さが30秒であることを基準としています。短すぎる音声ではその推論の制度が低下すると考えられているからのようです GithubDiscussion。その影響でこのサンプル内では足りない分のデータを0で埋めて処理しています。

void Update()
{
    if (transcribe && currentToken < outputTokens.Length - 1)
    {
        // outputTokensをデコーダーに入力するためにテンソルに変換する.
        using var tokensSoFar = new TensorInt(new TensorShape(1, outputTokens.Length), outputTokens);
        // デコーダーへの入力情報を作成.
        var inputs = new Dictionary<string, Tensor>;
        {
            {"encoded_audio",encodedAudio },// EncodeAudioで生成したエンコード済み音声データ.
            {"tokens" , tokensSoFar }
        };
        // デコーダーに入力して実行.
        decoderEngine.Execute(inputs);
        // 実行結果を受け取る.ここでは各トークンに対してどの程度一致しているかの数値が返される.
        var tokensOut = decoderEngine.PeekOutput() as TensorFloat;
        // 出力されたトークンの中から最も大きな数値を持つ(一致している)トークンを探す.
        using var tokensPredictions = ops.ArgMax(tokensOut, 2, false);
        tokensPredictions.MakeReadable();
        // 一致していると判断されたトークンのIDを取得.
        int ID = tokensPredictions[currentToken];
        // 出力トークンとして記憶する. 次のフレームでの推論にまた利用する.
        outputTokens[++currentToken] = ID;
        // 推論が終了したと判断されるか,IDが用意されたトークンを超えるまで繰り返す.
        if (ID == END_OF_TEXT)
        {
            transcribe = false;
        }
        else if (ID <= tokens.Length)
        {
            outputString += $"(time={(ID - START_TIME) * 0.02f})";
        }
        // tokensにはvocab.jsonからトークンと単語の組み合わせが含まれているので,その中の指定のトークンを取り出す.
        // ここで tokens[ID] は新たに推論された単語となる.
        else outputString += GetUnicodeText(tokens[ID]);

        Debug.Log(outputString);
    }
}

Updateは毎フレーム実行されるため、デコーダーによるテキストの推論を少しずつ進めて行くように処理されます。outputTokens はデコーダーへの入力とするためにテンソルに変換され、またデコーダーから推論されたトークンを新たに指定し、次のフレームでまた入力として利用されるようにループしています。デコーダーは事前にモデルを読み込まれたdecoderEngineで実行されます。通常入力された音声データと前回の結果トークンから次のトークンを推論しています。デコーダーからの出力は、vocab.jsonに含まれるすべてのトークンに対してどの程度一致しているかを数値で出力します。そのため、最も大きな数値を持つインデックスを見つければそれが推論されたトークンとなります。推論されたトークンから単語を取得し毎フレームつなぎ合わせることで結果の文章が得られます。

以上、大ざっぱですがサンプルについてその仕組みを記述しました。

今回、このSentisを利用したSpeechToTextを用いて、声で操作するミニゲームを作ってみようと思います。と考えると、音声が30秒限定というのは長くないですか?

AIモデルを出力してみる

Whisperでは短すぎる音声は推論の制度が低下するため30秒の音声ファイルを要求している、ということは理解したうえで、半分の15秒の音声ファイルを処理するモデルを作成してみようと思います。というのも「声で操作するゲーム」を考えたときに、30秒の発言で操作することはほぼないでしょう。15秒でも長いかもしれませんが、ある程度短くできればテンソルサイズが小さくなるのでメモリ節約と処理速度向上が見込めるはずです。

モデル出力スクリプトを利用する

先ほど見たサンプルに含まれる各「.sentisファイル」はonnxAIモデルファイルからUnitySentisが利用しやすいように変換されています。そのため、サンプルにonnxファイルは含まれていません。そこで、そのonnxファイルを手元で出力してみましょう。Whisperのonnxファイル出力もすでに有志によってオープンソース化していますので、こちら whisper-export をお借りします。

今回はWindows+WSL2上のPython3.10.12で実行しました。まず、任意のディレクトリに whisper-export をGitクローンします。その後、以下のコマンドで必要なライブラリをインポートできます。

$ pip install ./
$ pip install onnx

CUDAを利用してonnxを出力するため、以下のコマンドでWSL2上でCUDAが参照できているか確認します。CUDAが参照できない場合、NVIDIA Diriverが古いかインストールされていない可能性があります(1ミス)。

$ nvidia-smi
Sun Mar 24 20:50:15 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.10 Driver Version: 551.61 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+

私のWindows環境では NVIDIA Driverが551、CUDAが12.4でした。 whisper-export では torch2.2.1がインストールされるので、CUDAのバージョンを12.1以上に合わせる必要があります(1ミス)。また、CUDAのバージョンが合っていてもPythonから認識されない場合があるので、以下のコマンドで状況を確認します。認識されていない場合にはPCの再起動が必要です(1ミス)。

$ python
Python 3.10.12 (main, Mar 15 2024, 20:29:42) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True

ここまでのコマンドで設定が確認できたら、いよいよonnxモデルを出力しましょう。以下の2つのコマンドを実行し、エンコーダーとデコーダーをそれぞれ出力します。また、この際になんでも良いので音声ファイルが1つ必要です。元になるモデルはwhisper-tinyです。

$ python cli.py audio.wav --model tiny --device cuda --export_encoder
$ python cli.py audio.wav --model tiny --device cuda --export_decoder

コマンドが正常に完了すると、export_model ディレクトリにdecoder.onnxとencoder.onnxファイルが出力されています。

また、今回の目的は音声データの認識サイズを30秒から15秒に変更することです。これはこのプロジェクト内のaudio.pyでCHUNK_LENGTHを15に変更するだけでした。

出力したモデルをSentisで使用する

手元で出力したモデルを利用するため、先ほど出力した2つのonnxファイルをサンプルプロジェクトのStreamingAssetsではないディレクトリにコピーします(1ミス)。すると、Inspectorには以下の画像のようにonnxファイルを認識した状態の情報が表示されます。ここで入出力の形も確認できるようです。

ここで、Inspectorにある[Serialize To StreamingAssets]ボタンを押すと、StreamingAssetsディレクトリにonnxをSentis用に変換した.sentisファイルが出力されます。サンプルに含まれていた.sentisファイルはこのようにして作られたものです。

これでエンコーダーとデコーダーの2つの.sentisファイルが生成されたので、サンプルに含まれていたRunWhisper.csをこのモデルを利用できるように書き換えましょう。LogMelSepctro.sentisはそのまま利用させてもらいます。

まず、以下のように単に読み込むAIモデルのファイル名を変更します。

Model decoder = ModelLoader.Load(Application.streamingAssetsPath + "/decoder.sentis");
Model encoder = ModelLoader.Load(Application.streamingAssetsPath + "/encoder.sentis");

さらに、サンプルに含まれていたデコーダーと、手元で生成したデコーダーでは入力データの数が異なります。はじめにmaxSamplesで音声の長さを指定しているので15秒とします。さらにkvCacheoffsetの2つのテンソルを用意し入力に加える必要があります。

const int maxSamples = 15 * 16000;

TensorFloat kvCache;
TensorInt offset;

void Start()
{
    ~~~~~~~~~~~~~~~~~~~~~~~
    int kvCacheFixed = 451; // whisper-exportで固定された数値.
    int beamSize = 1; // 推論探索深さ.
    int modelSize = 384; // whisperモデルごとの数値,ここではtiny用.
    kvCache = TensorFloat.Zeros(new TensorShape(8, beamSize, kvCacheFixed, modelSize));
    offset = new TensorInt(new TensorShape(1), new int[] { 0 });
}
void Update()
{
    if (transcribe && currentToken < outputTokens.Length - 1)
    {
        using var tokensSoFar = new TensorInt(new TensorShape(1, outputTokens.Length), outputTokens);
        var inputs = new Dictionary<string, Tensor>
        {
            {"audio_features",encodedAudio },
            {"tokens" , tokensSoFar },
            {"offset", offset},
            {"kv_cache", kvCache }
        };
        decoderEngine.Execute(inputs);

これで手元で出力したwhisperのAIモデルを使用する準備が整ったので、Unityをプレイします。

手元で生成したAIモデルを使用してSpeechToText

ログに出力される結果はサンプルとまったく同じです。

ここで、音声の長さを15秒としたことが正しく反映できているかは以下のログを出力すると確認できます。

Debug.Log($"encodedAudio: {encodedAudio.shape}");

このとき出力されるのは音声がエンコードされた後のテンソルの形状です。30秒のとき、15秒のときでそれぞれログは以下のようになります。

# 30秒のとき
encodedAudio: (1, 1500, 384)
# 15秒のとき
encodedAudio: (1, 750, 384)

これで手元で出力したAIモデルが利用できていることを確認できました。

音声で操作するミニゲーム

それではSpeechToTextを利用したミニゲームを作ってみましょう。

まずは音声を認識せずに、キーボードで動かす簡素なゲームを作ります。

出来上がったものがこちら

色のついた箱を指定の位置へ運ぶ

キーボードでユニットを操作し箱を指定の位置まで移動させます。画面中央にはその時ユニットに与えられた命令を表示しています。現状はキーボードからこの命令を与えていますが、ここに音声認識を組み込んでいきましょう。

音声をリアルタイムに処理する機構

これまでのサンプルでSpeechToTextする際の音声データはwavファイルになっていました。「音声で操作」するためにはマイクからの入力をリアルタイムに変換していく必要があります。この機構を作りましょう。

まず、Unityでデバイスのマイクを利用するには以下のように記述します。モバイル端末ではマイクの利用許可ダイアログの表示が必要ですが、現在Macで動作させているのでこれだけの処理でマイクを利用できます。

if (Microphone.devices.Length == 0)
{
    Debug.Log("microphone not found");
    return;
}
microphoneName = Microphone.devices[0];
Debug.Log("find microphone : " + microphoneName);
audioClip = Microphone.Start(deviceName: microphoneName, loop: true, lengthSec: audioSecondLength, frequency: audioFrequency);

このコードによってaudioClipからはマイクから入力された音声がそのままAudioClipとして参照できるので、以下のようなコードでそのデータを取得できます。

// AudioClipの現在の位置.
int position = Microphone.GetPosition(microphoneName);
if (position < 0 || position == prevSamplePosition) return;
// 全データをバッファに取得.
audioClip.GetData(dataBuffer, 0);
// 前回確認した位置と現在の位置を比較.
if (position < prevSamplePosition)
{
    // 前回の位置のほうが大きい場合はループを挟んでいるのでループを考慮してdataに格納.
    data = new float[position + (audioFrequency * audioSecondLength - prevSamplePosition)];
    Array.Copy(dataBuffer, prevSamplePosition, data, 0, audioFrequency * audioSecondLength - prevSamplePosition);
    Array.Copy(dataBuffer, 0, data, audioFrequency * audioSecondLength - prevSamplePosition, position);
}
else
{
    // 現在の位置のほうが大きいので進んだ分をdataに格納.
    data = new float[position - prevSamplePosition];
    Array.Copy(dataBuffer, prevSamplePosition, data, 0, position - prevSamplePosition);
}
prevSamplePosition = position;
// 音声がしきい値を超えているか確認.
bool isVoice = false;
for (int i = 0; i < data.Length; i++)
{
    if (Mathf.Abs(data[i]) > audioThreshold)
    {
        isVoice = true;
        break;
    }
}
// データ点の内1つでもしきい値を超えていれば音声データとして扱う.
if (isVoice)
{
    var bf = processData;
    processData = new float[bf.Length + data.Length];
    Array.Copy(bf, 0, processData, 0, bf.Length);
    Array.Copy(data, 0, processData, bf.Length, data.Length);
}
else
{
    // しきい値を超えなかったので無音と判断.
    processData = new float[0];
}

このときのAudioClipはループがONになっているので、指定の秒数を過ぎると0に戻って音声が上書きされるような動作をします。そのため、前回確認した音声の位置と現在の位置が逆転している場合にはループを挟んでいるのでそれを考慮してデータを取得しなければいけません。また、すべての音声を常にSpeechToText処理をするのも無駄なので、取得したデータがしきい値を超えているかどうかで無音の判定をする必要があります。

こうして取得した音声データをWhisperエンコーダー・デコーダーで処理することで、リアルタイムにSpeechToTextを行うことができます。その様子を録画しました。左上の白い囲いの中に、現在マイクから入力されている音声をリアルタイムにテキスト変換して表示しています。言葉が止まると途中で[BLANK_AUDIO]が認識されてしまいますが、概ね正常に変換されているようです。We'll sail ~~の部分は始めにI'll say will youなどと認識されていますが、これは認識中の音声データが短すぎるために正確な推測ができていないためで、続きの音声が順に認識され始めると一気に正確な推測ができています。

Today is the best day of my life. So I'm going to explore the world with my rabbits. We'll sail, we'll ride through the wilderness, we'll climb mountains, and we'll leave this earth one day.
音声をリアルタイムにテキストへ変換する

以上、無事に喋った言葉がテキストに変換されました。これだけでもオンラインマルチプレイなどで文字起こし機能として利用できそうですね。

変換されたテキストをコマンドとしてユニットを動かす

音声から変換されたテキストにユニットの操作コマンドが含まれていたとき、その動作を実行するようにしました。同時に変換されたテキストは右下に表示しています。これによって、音声でユニットを操作することができるようになりました。

音声から変換されたテキストでユニットを操作する

まず反省点として、とんでもなく難しいです。音声がテキストに変換されるまで1秒ほどかかってしまうので、その間にユニットは動き続けてしまい、操作しようにも間に合っていませんでした。また、ユニットを操作するコマンドが一つの単語なので、短い音声を正確に推論できないという点がネックになり、結果として短文で話しかけなければなりませんでした。声で操作するという趣旨としてはミニゲームの選定に失敗しました。

しかしながら入力した音声をリアルタイムにテキスト変換できるということは、ゲームで幅広く活用できるのではないでしょうか。大きな可能性を秘めているように感じます。

まとめ

今回はUnitySentisに触れるという目的で、まずWhisperのサンプルを動作させてそのコードをある程度理解しました。さらにwhisper-exportを利用してSentisで使用するWhisperのonnxを出力できるようになりました。このとき音声の長さを半分の15秒に変更できました。ここから音声をコマンドとしたミニゲームを作成し、マイクからの入力を常にSpeechToText変換することでゲーム内のユニットを操作できるようになりました。

このプロジェクトだけでもUnitySentisを利用することでAIモデルを気軽に扱えることが理解できるのではないでしょうか。ゲームからAIを利用する際にネットワークインフラに依存しないという点は強力だと思います。夢が広がりますね。

【生成AI】のゲーム開発への活用事例紹介

0

~ 式姫プロジェクト最新作【カクリヨ・トーキョー】の現場より ~

▼【生成AI】への取り組み

【生成AI】近年耳にしないことがないほどの単語ですので、
 ご存じの方も多いのではないでしょうか。

ChatGPTを始めとする多数のAI技術が革新した昨今
株式会社アピリッツ(以下アピリッツ)でも、
【生成AI】の活用について全社的に取り組んでいます。

この記事中におきましては、
アピリッツのゲーム開発及び運営にかかわる部門より
最新作【カクリヨ・トーキョー】を研究開発している式姫プロジェクトでの
生成AI技術(以下AI)への取り組み方の一部をご紹介します。

こんにちは~。広報担当の山田アイコです。
今回は、フィールドゲーム・テクノロジー学部で開発中の
式姫プロジェクト最新作【カクリヨ・トーキョー】
のチームにお邪魔しています!

【生成AI】って最近のトレンドですよね~。
名称はよく聞くのですが、私もまだよく解っていない所が多いと思いますので
式姫プロジェクトチームのみなさんに、【生成AI】について色々とお話を伺わせてください。

現在鋭意開発中のプロジェクトとなるため
リリース前にお伝えできる情報が限定的になってしまい、
物足りない点があるかもしれませんが頑張ります!

▼【生成AI】とは?

古今東西、人々はゲーム開発に限らず、ものづくりという分野で
【文章を書く】【絵を描く】【音楽を奏でる】【動画を撮影する】など
頭で考えて、手を動かし、匠ともいえる芸術的なコンテンツをこの世界に生み出してきています。

本や絵画、音楽に映画、そしてゲームにおいて名作と呼ばれるコンテンツが多々ありますよね。

コンピューターなどの道具は、あくまで人間が使う道具の延長線上での進化を遂げて
コンテンツ制作の速度や生産性や品質の向上に一役買っていたわけです。

最近の映画やゲームの映像で、現実と間違えてしまいそうなくらいクォリティ高いなと感じることあります!

そこへ【生成AI】は、各コンテンツのパターンや関係を大量に学習することで
道具の領域を超えて、人間の役割の一部をこなすことが期待できる
新たな技術のひとつとして登場
したものとなります。

なるほど~
だから全世界がこれほど【生成AI】に色めきだっている訳ですかぁ。

プロジェクト内での活用法を想定

さて【カクリヨ・トーキョー】はスマートフォン用のゲームとして開発を進めています。
AIを使ってゲームを開発するというと、
【自動で様々なコンテンツが制作される夢のような開発環境
を想像される所があるかと思いますが

【生成AI】は、まだまだ新しい技術なので、
「私達のゲームプロジェクトに活用するためにはどうする?」
からチーム内で考えることとなりました。

素晴らしい道具や機能も使いこなせなければ宝の持ち腐れとなってしまうからです。

たしかに最新のスマホ機能ですら、『まだまだ、私使いこなせていないなあ』と思うときありますもんね~。

そこで『式姫プロジェクト』では、

①AIでできることの調査
②各セクション内のタスク・工程を洗い出す
③洗い出した中からAIでできることと、タスクの中でマッチするものを検討
④マッチした内容でAIを使い、効率化できる箇所を想定
⑤手順化
⑥量産

までを考慮して着手しました。

セクションごとの取り組み

生成AIを役立てることができそうな項目の精査を行ったあと
現在『式姫プロジェクト』チーム内では

・2Dイラストセクション
・シナリオセクション
・3Dキャラセクション

の3つのセクションでAI技術への取り組みを進めています。

それでは各セクションの担当者にお話を伺ってみようと思います。

◾️2Dイラストセクション

- ゲーム中に表示されるスチル画像やアイテムの画像を描くセクション -

※開発中のイメージ画像です。今後ゲーム中で採用される場合がありますので、少しモザイクとなります。

2Dイラスト制作では、どのような制作項目でAIの導入を推進したのですか?

そうですね~
・アイコンラフ生成
・イメージ下絵生成
・イメージ背景生成
・アイテムスチル生成

という項目で
案出し/コンセプトパターン出し/イメージ素案/クォリティ合わせの標準化
の作業で生成AIをテストしていきました。

ゲームではたくさんの画像が使われていますもんね。
様々な絵のアイディアを出すだけでも大変な作業ですよね!

多数のポーズ案/背景イラストの構図案等を
短時間で目に見える形にする点で【生成AI】のレスポンスの良さが活かせると考えました。
それらの画像案は、そのままゲーム内で使用するのではなく
多数のアイディアを必要とする場面での効率化の為に使用しています。

なるほど。
絵のクォリティをさらにあげていく為に、
人の手をかける時間が式姫プロジェクトでは必須と考えられるので
AIの得意とする【絵のバリエーションを短時間で数多く揃える】
ところに使用しているのですね。

『式姫プロジェクト』においては
 世界観やキャラ設定を、特に大切にしていますので
その整合性について必ず人の目で確認を行ってから
ユーザーの皆様にお届けしていきたいと考えて作業を行っています。

◾️シナリオセクション

- ゲーム内の世界観や物語を描くセクション -

※開発中のイメージ画像です。今後ゲーム中で採用される場合がありますので、少しモザイクとなります。

シナリオ制作では、どのような制作項目でAIの導入を推進したのですか?

・多面的なアイディア出し
という項目ですかね。

基本的に、物語の内容や考えこむ時間の短縮化に寄与しています。
生成AI】を活用することで
思ってもみなかったシナリオアイディアのパターンがアウトプットされる事もあり、
アイディアをひねり出す時間の短縮等に活用しています。

AIというと、ChatGPTを代表としてテキスト生成では一日の長があり
多分野で使われているイメージがあるかと思いますが
シナリオ制作活用時の課題として、プロンプトの精度を上げていく必要もあり
なかなかそのまま使用できるクォリティには届かない事も多かったです。
ですのであくまでアイディア出しへの使用にとどめている現状です。

なるほど。
シナリオは、考える、まとめる、確認する
を繰り返して物語の流れを構築していかないといけないので
気づきを得るトリガーにAIを有効活用しているのですね。

【生成AI】でたくさんアイディアが出てきたとしても
どのアイディアを選択/選別して、どのように使っていくのかという場面では
人間がキャラクターやゲームの世界観に対する思い入れと
熱意をもって創作していかないと
まだまだ胸を打つ文章をお届けするのは難しい
とあらためて感じました。

■3Dキャラクターセクション

- ゲーム内キャラクターの3Dモデルを描くセクション -

※開発中のイメージ画像です。今後ゲーム中で採用される場合がありますので、少しモザイクとなります。

3Dキャラクター制作では、どのような制作項目でAIの導入を推進したのですか?

各キャラクターの動きとなる【3Dモーション】を
ダンスムービー等から式姫用モーションデータとして

生成できるかをテストしています。

3次元のキャラクターの外見を制作することをモデリングといいます。
キャラクターの外見を制作しただけでは、キャラクターは動きません。
モーションと呼ばれるキャラクターの動きのデータを制作する必要があるのです。

有名な作り方としては、モーションキャプチャーという
実際に人間が動いて、そのリアルな動作をデータ化するという技術があります。

ただこの方法が頭を悩ませる点として
モーションを撮影するスタジオと専用の機材
その動きを再現するアクター(俳優)さん
が必須となり
様々な大きめのコスト(お金や時間、小道具の準備やアクターさんの選定等)
が発生してしまうんです。

その解消法の一つとして、
動画からのモーションデータ作成に【生成AI】を活用できればと考えました。

なるほど。
特に時間のかかる制作物の納期短縮方法を模索しているのですね。
だいたいの仕事って、時間の削減がコストの削減に直結してる場合が多いですもんね。

まだテストを開始した段階なのでどこまで導入できるかは、未知数な段階です。

▼まとめ

このように【生成AI】【カクリヨ・トーキョー】にもたらす恩恵は種々様々となりますが
プレイヤーの皆様に各キャラクター達の魅力を
最大限に引き出してお届けすべく開発を進めております。
アピリッツよりリリース予定の式姫プロジェクト
【カクリヨ・トーキョー】を楽しみにお待ちいただければと思います!

【生成AI】に関する取り組みのお話ありがとうございました。
私も可愛らしい式姫ちゃん達が大好きですので
式姫プロジェクト【カクリヨ・トーキョー】のリリースを
楽しみにしています!

2024年度 アピリッツ入社式、新しい54名を迎えました

0

2024年4月1日にアピリッツは入社式を行い、今年も54名と多くの新入社員をアピリッツへ迎えることができました。
今回はその様子をお伝えいたします!(2024年4月1日取材)

Welcome to Appirits!

アピリッツでは今年、54名という多くの仲間を迎えることができました!

入社式当日は、アピリッツ社員としても社会人としても1日目でもある新入社員たち。少し緊張している様子がうかがえました。取材班も当時の入社式での自分と照らし合わせて、懐かしい気持ちになりました(笑)

ちなみに、今回は多くの仲間を迎えるために大きい会場を渋谷で借りたそう。そんな気合十分な入社式に潜入してきました!

素敵な54名の新入社員のみなさん

入社式開始直前、新入社員以上に緊張していた運営陣。

入社式の司会進行を務める人事のお姉さんに心境を聞いてみると、「名簿を読み上げる時に嚙まないかめちゃめちゃ緊張してます。と同時に、新入社員のみんなと交流できるのが楽しみです。」と、緊張しながらも新たな仲間を迎える準備はばっちり!

社長や執行役員の皆さんも、新たに迎える仲間たちにエールを送るとともに、

「卒業おめでとう」「アピリッツに入ってくれてありがとう」

と、感謝と歓迎の言葉を投げかけていました。そんな社長や執行役員のみなさんのエールをいくつか紹介させていただきます!

社長の和田からは、「ストレスが絶えない社会人へようこそ」と、ユーモアを交えた歓迎の言葉から始まり、

アピリッツ取締役社長 和田 順児

「一つひとつの物事に対してなぜ必要なのかを自分の頭でしっかりと考え、徹底して行動を心がけることが重要です。そして、こうした行動ができる人材の中から新たなリーダーが生まれてくると考えています。」と、新入社員に向けて激励の言葉を送りました。

執行役員 八木 広道

「ぜひ同期に今考えている事を聞いて、なぜなんだというのを掘り下げていきましょう。すると、自分がある物事に出くわしたときにどういう掘り下げができるのか、引き出しが増えていきます。そうなると、少なくとも人生が豊かになるんじゃないかなと思います。」

取締役 執行役員CFO 永山 亨

「今、自由な社会だからこそ何事もよく考えて自分で決める。自分のために多くの事を吸収して自分が決めれる材料を集めましょう。そして、最終的には自分の後悔しない選択ができれば一番いいかな」

名前を呼ばれて元気に挨拶をする新入社員たち

アピリッツに来た54名のフレッシュな新入社員たち。まだ緊張と社会人生活に対する不安があると思います。

これから研修や案件など多くの経験を経て成長していく彼らから目が離せません!


アピリッツではまだまだ新たな仲間を募集しています。

たくさんのご応募お待ちしています!

Unity SentisとML-Agentsを試してみた

0

はじめに

おうさぎ様との同居生活が三年目に入りました。ゲームデザイン(GD)部クライアントエンジニアの中村です。

最近AIが流行っているらしいので、Unity使いとしても何らかAIを取り入れていかなければと思っていました。そんなときにUnity Sentisがオープンベータになったという記事を見かけたので、せっかくだからML-Agentsと併せて触ってみようと思った次第です。

Unity Sentis

ONNX ファイル形式でインポートされた AI モデルは、Unity がサポートするすべてのプラットフォームで直接実行することができます。つまり、クラウドインフラストラクチャを必要とせず、直接ユーザーデバイス上の Unity ランタイムで、大半の AI モデルを実行できます。

https://blog.unity.com/ja/games/create-next-gen-ai-models-with-unity-sentis

なんとモバイル端末でもAIモデルを利用した推論が可能となります。githubにサンプルが公開されていますが、ニューラルネットワークによってオセロを学習したAIとの対戦や、MNISTによる手書き文字認識を行うことができます。その他にも、AIモデルを用意すれば音声認識やText-To-Speech、物体認識も可能であり、Hugging Faceなどで公開されているモデルも動作させることができます。

Unity ML-Agents

Unity Machine Learning Agents(ML-Agents)なら、創発的挙動を「コーディング」することなく、代わりに深層強化学習と模倣学習の組み合わせを通じて「学習」するよう、知的エージェントに教育できます。

https://unity.com/ja/products/machine-learning-agents

Sentisで公開されていたサンプルのような「ターン制ボードゲーム」「手書き文字認識」などの学習データが容易に用意できるゲームでは、知識があれば独自AIモデルを作成することも難しくありません。しかし、対戦格闘ゲームやシューティングゲームなどのアクション要素が強いゲームでは学習データの用意が難しくなります。

ML-Agentsではこれら学習対象となる「エージェント」をもとにしたAIモデルの作成をサポートします。こちらもgithubにサンプルが公開されています。

SentisとML-Agentsの関係

SentisはAIモデルを読み込み、推論に必要なパラメータを与えるとその結果を返すという仕組みになっています。

ML-AgentsはSentisを介してAIモデルによる推論を行いエージェント(GameObject)の行動を決定します。

この2つの関係性は、個人的な理解ですが以下のようになっていると思っています。Sentis単体で動作することはできるが、ML-Agentsはその内部でSentisに依存していることになるでしょう。

Unity内でのML-AgentsとSentisの関係

ML-Agentsサンプルを動かす

さっそくサンプルに触れていきます。

搭載されたAIモデルを利用する

まずダウンロードしたサンプルの中にあるUnityプロジェクトから「3DBall」を開きます。今回はUnity2022.3.19で動作しています。

プレイすると、青い箱が頭にボールを乗せて落とさないようにしている様子を見ることができます。青い箱1つ1つがエージェントであり、その姿勢とボールの速度からボールを落とさないように学習されたAIモデルを搭載しています。健気で可愛いですね。

ML-Agentsによってボールを落とすことができなくなった青い箱たち

これはサンプルに含まれる学習済みのAIモデルをそのまま利用しています。それではAIモデルの生成も行ってみましょう。

AIモデルを生成する

ML-Agentsのサンプルプロジェクトには学習モデルを生成するためのPythonコードも含まれています。

今回はM1Macで行った影響か、Pythonやパッケージのバージョンにかなり縛りがありました。まず、なぜかPython3.10.12でなければ動作しませんでした。さらにReadMeにあるインストールコマンドもそのままではエラーが出るため、issuesに記載された暫定対策を行って環境を整備しました。

基本的にはPython3を用意し、以下のコマンドを実行するだけで準備ができます。ml-agentsのPythonパッケージをインストールするのでvenvの使用を推奨します。

$ pip install ./ml-agents-envs 
$ pip install ./ml-agents 

環境が整ったら以下のコマンドでml-agents(Pythonのほう)を起動します。

$ mlagents-learn config/ppo/3DBall.yaml --run-id=first3DBallRun_mine

すると、以下のようにUnityからの接続を待つ待機状態となります。

 Version information:
  ml-agents: 1.0.0,
  ml-agents-envs: 1.0.0,
  Communicator API: 1.5.0,
  PyTorch: 2.2.1 training by pressing the Play button in the Unity Editor.

この状態でUnityからプレイすると、自動的に学習モードに入ることができ、青い箱たちがひたすらボールの位置と自分の姿勢を計算・学習し続けます。最初はただボールを落とすだけですが、3,4分すると徐々にボールを落とさなくなっていく様子を見ることができます。

はじめのうちは何も知らずにボールを落とす青い箱たち
4分経過するとボールを落としてはいけないと理解する

学習が終了すると Results ディレクトリにAIモデル(onnxファイル)が生成されます。このファイルをUnity内に移動し、Inspectorから割り当てます。

これだけの操作で自作したAIモデルをエージェントに搭載することができます。

学習内容を「落としたもの勝ち」に変更してみる

今回のエージェントの学習内容は、「ボールを頭に乗せている間ずっと報酬を得られる」「ボールを落としてしまうとマイナスの報酬が得られる」という仕組みになっています。そこで実験としてこの関係を逆転させてみようと思います。

Ball3DAgentの内容を以下のように変更しました。

if ((ball.transform.position.y - gameObject.transform.position.y) -2f ||
    Mathf.Abs(ball.transform.position.x - gameObject.transform.position.x) > 3f ||
    Mathf.Abs(ball.transform.position.z - gameObject.transform.position.z) > 3f)
{
    // 落としたらプラス報酬.
    SetReward(1f);
    //SetReward(-1f);
    EndEpisode();
}
else
{
    // 頭に乗せている間マイナス報酬.
    SetReward(-0.1f);
    //SetReward(0.1f);
}

早速学習させ、生成されたAIモデルを読み込んだ結果以下のようになりました。

頭の上にボールを乗せたくない

みんな頭の上にボールを乗せたくないので、とにかく傾けて落としています。

まとめ

Unity SentisとML-Agentsについて調査し、ML-Agentsのサンプルプロジェクトを少し動作させてみました。その中で独自のAIモデルを生成できるようになり、報酬の与え方を変更するだけで異なる特徴を持つAIモデルが生成できました。ML-Agentsは学習の対象、報酬の与え方がすべてUnity C#で記述されているため、Unity使いならばすぐに独自のAIモデルを生成できるのではないでしょうか。

今回はUnity Sentis自体に触れることなくAIモデルの動作が確認できてしまったので、いずれSentis単体での動作確認もやってみたいと思います。

エンジニア初心者に送る AI-STYLE THE ROAD OF ENGINEER

0

はじめに

AIエバンジェリストの浅田です。

AI、とくにディープラーニングなどの機械学習における学習プロセスは、人生で物事を上手に行うための心得に通じるものがあると感じます。

自分はアピリッツに中途でジョインして、この4月で丸10年となりますが、自分の過去を振り返った時に、これらの考え方を自分が初心者の頃に魂に刻んでおけば、今よりうまくエンジニア人生を送れていたと思います。そこで、AIの学習処理の概要について軽く触れつつ、自戒の念を込めてそれらについて書いてみたいと思います。

機械学習の学習プロセスの概要

まず、ディープラーニングの機械学習における学習プロセスを簡単に書くと以下のようになります。

  1. 達成すべき「指標」を決める
  2. 現在の「状態」と達成すべき「指標」との「差分」を確認する
  3. 「差分」を改善するための「計画」を考える
  4. 「計画」にしたがって「実行」する
  5. 指標を達成するまで繰り返す

端的に言ってしまえばPDCAを回すという当たり前のような話なわけですが、これを徹底的に行っていることが、AIが価値を発揮していることにつながっているわけです。AIは様々なタスクをこなせるようになっていますが、やっていることの原理はシンプルですね。

では、それぞれの項目からどんな知見が引き出せるか見ていきましょう。

達成すべき「指標」を決める

機械学習の文脈で言えば、学習に使用するデータの用意、解決すべき問題の定義、そして達成すべき精度の設定になります。最終的な成果を決める重要な部分です。

人生で言えば理想とする「あるべき姿」を思い描くといったところでしょうか。どんなエンジニアになりたいか、何をできるようになりたいか、何を達成したいのか、というビジョンが具体的であればあるほど、後続のプロセスが容易になります。

自戒的な意味合いで述べると、自分がエンジニアになろうと思った理由の一つに、当時見た映画「ソードフィッシュ」の主人公がかっこよかったからといったような、あまり具体的ではない動機がありました。あまり明確なエンジニア像ではなかったので、当然目指すべき方向性はあやふやでした。

とはいえ、自分のケースは極端だとしても、論語に「五十にして天命を知る」という言葉があるように、最初から明確にあるべき姿を規定するのはかなり難しい部分でもあるかと思います。それにフィクションであれノンフィクションであれ、憧れは強い原動力になるかと思います。

現在の「状態」と達成すべき「指標」との「差分」を確認する

機械学習の文脈で言えば、「損失関数」の設定にあたります。損失関数とはAIの予測がどれぐらい外れているのかを評価するための仕組みです。関数というとイメージしにくいかと思いますが、要は計算可能な数学的表現ということです。この関数が弾き出す数値を小さくしていくことが、学習の目的になります。

人生で言えば理想とする姿と現在の状態との差分についての状況分析(自己分析)ということになるでしょう。まずは「自分に何ができていなくて、何をできるようになる必要があるか」を正確に認識することが重要になります。これができれば、努力した結果ちゃんと目標に近づけているのかどうかをチェックできるようになります。

「差分」を改善するための「計画」を考える

機械学習の文脈で言えば、「最適化関数」の設定にあたります。最適化関数とは、前段の損失関数によって認識できた損失(つまり、理想の状態との差分)を小さくしていくためのアルゴリズム(計算手順)です。

人生で言えば「今の自分と理想の自分との差分をどう埋めていくか」を考えていくことにあたるかと思います。この方向性を誤ると、間違った方向に努力してしまうか、非効率的な努力をしてしまうことになります。

個人的な話ですが、何かを始めようとした時に、体系的な学習を済ましてから取り掛かろうとする癖があります。これは悪癖だと思います。体系的な学習をすること自体は重要です。ただ、体系的な学習を済ましてから取り掛かろうとするのはかなり非効率的です。体系的な学習が済んだと判断するのは難しいですし、時間的なオーバーヘッドも大きいです。概要部分をざっと掴むことを優先し、あとは実践を通して学ぶというのが一番効率がいいように思います。要は「習うより慣れろ」ということですね。そして体系的な学習も並行して行うのがベストかと思います。

「計画」にしたがって「実行」する

機械学習の文脈で言えば、最適化関数のアルゴリズムに従って、新しい方法(パラメータ)で予測を実行してみるということになります。最適化関数の選択が適切であれば、損失関数の結果(つまり、現在の状態と理想の状態との差分)は前回より改善される可能性が高くなります。「可能性が高くなる」と書いたのは、実際には複雑な条件が絡み合ってくるので計算通りに改善されないケースもあります。ただ、その結果によって次の最適化関数で改善する指針を得ることができます。

人生で言えば、実際にアクションを起こすターンになります。ここまでのプロセスは頭の中での計算でしかないので、実際にやってみると思った通りにいかないということもあるでしょう。面白そうだと思っていたことが実際にやってみるとそうでもなかったり、あるいはその逆に、興味をもてなさそうなことが実際にやってみると面白かったりすることもあります。いずれにしても、貴重なフィードバックを得ることができます。

自分が就活生だったころはインターン制度は今ほど一般的ではありませんでした。最近はインターンで業務の一旦を経験できるので、非常にメリットのあることだと感じます。

指標を達成するまで繰り返す

機械学習では、状況の変更(最適化関数によるパラメータの更新)と状況の評価(損失関数による損失の計算)を、目的の指標を達成するまで繰り返します。機械学習においては、一回のサイクル(エポックなどと表現されることもあります)で目標を達成できることはまずありません。数十、数百回の試行を繰り返すことになります。

目指すべき姿が明確で、それを達成する適切な方法がわかれば、あとはそれを最後までやり遂げるだけです。ただ、人間の場合、この「最後までやり遂げる」というのが一番難しいのではないでしょうか。機械学習の場合、まさに機械的に繰り返すことができますが、人間はそう単純ではないと思います。成果をなかなか感じられなければやる気も減退します。なので、モチベーションを保つ方法を見つけることが重要になります。

モチベーションがどこからくるかは人それぞれだと思いますが、個人的には「楽しさ」から来るものが一番強いと思います。「好きこそものの上手なれ」というやつですね。至言だと思います。

自分の場合は本屋さんの技術書のコーナーで新しい技術の本がたくさん並んでいるのを見ると、言葉では言い表せない「ときめき」のようなものを感じます。新しいものを「学ぶ・知る」ということが好きなのだと思います。そういう気持ちを忘れないでいたいものです。

失敗することも必要

こんな話があります。

10個の画像があります。そのうち9個は「りんご」の画像で、1個が「みかん」の画像です。これらの画像をランダムに見せられた時に90パーセントの精度で「りんご」を検出する仕組みを作る一番簡単な方法はなんだと思いますか?

答えは「常に『りんご』だと判定するようにする」です。

これはAIの世界でいうところの「データによるバイアス」の典型例です。良くも悪くもAIはデータから学習してしまうので、何も考えずに上記のデータから学習させると、高確率で「りんご」と答えてしまうAIになります。なので、AIの学習に使うデータはなるべく偏りがないようにすることが重要なのです。データが50:50の状態で90パーセントの精度を目指すために学習すると、「りんご」と「みかん」を区別するために本質的な特徴を捉えるようになり、結果的によりロバスト(堅牢)なAIになります。

AIが学習するのはデータですが、人間が学習するのは経験です。先ほどの例になぞらえるなら、うまくいった事例しか経験してなければ、なぜうまくいったのかを本質的に認識することは難しくなります。なので、成功体験も重要ですが失敗するということも同じように重要だと思います。大抵の失敗はリカバリーが効きますし、長い目でみれば成功確率も上げることになると思います。

おわりに

変化の激しい時代です。Webアプリケーションを構成する流行りの技術スタックも数年単位でガラっと変わってしまいます。生成AIの登場によって、さらに変化は加速しようとしています。そんな中で理想とする「あるべき姿」が変わっていくことも当然あるかと思います。「リスキリング」という言葉もよく聞きますし、むしろ変化していくことが普通の世の中になっていくのかも知れません。

私自身も元々アピリッツに転職する時には「Webエンジニアになりたい」という思いで転職してきましたが、この10年でWebエンジニア、クラウドエンジニア、AIエンジニア、と目指すべきエンジニア像が変化してきましたし、今後もまた変化していく可能性はあります。いずれにしても、変化を厭わず、学び続けることが重要なのだろうと思います。

なお、アピリッツは様々な職種のポストがありますし、今までなかった職種やポストが新設されたりもしてもいます。そんな環境なので「あるべき姿」が変わっていったとしても、受け入れられる懐の深さがあるのも魅力の一つかと思います。

【IPA資格】エンジニアじゃなくても情報処理技術者試験って役立つの?

0

こんにちは!
新卒1年目のWebコンサルタントをしている石川です。

普段は、クライアントさんの持つWebサイトの運用や改善の提案をしています。

みなさんは「IPA情報処理技術者試験」というものをご存じでしょうか?

ちょっと堅苦しい名前ですが、
「ITパスポート」「基本情報技術者」という名前だったら聞き覚えがあるかもしれません。

IPA試験とは、ITに関する知識を幅広く身に付けられる試験として
ITを利活用する組織で幅広く認知・活用されている資格です。

エンジニアさんであれば「基本情報技術者」よりさらに上の「応用情報技術者」や、さらにその上の「高度情報処理技術者試験」などを取得しているイメージがありますね。
(そもそもIPA試験は「ITエンジニアの不足」という背景のもと生まれているらしいです)

しかしエンジニアに限らずコンサルタントやデザイナーなど
どの職種にとっても非常に役立つ資格だということをご存じでしょうか…?

今回は、コンサル1年目でIPA試験の基本情報技術者を取得した私が、
実体験をもとにこの資格がなぜ様々な職種にも役立つのかをお伝えしていこうと思います。

エンジニアはもちろん、コンサルやデザイナー、IT業界を志している学生さんなど
ITに関わる全ての人にちょっとでも「この資格、挑戦してみようかな?」と思っていただけたら幸いです…!


どうしてエンジニアじゃなくてもとるべきなの?

そもそもこの資格・・・

「名前は知ってるけど、どういう問題が出るの?」といった
資格の中身がよく分からないという人が多いのではないでしょうか?

「ITパスポート」や「なんちゃら技術者」なんて名前を聞くと
「難しいコードの話」とか「電子的なデータの情報がうんたら」とか、うっかりしていると

ムーディー勝山状態(右から左へ情報が流れている状態)になってしまう問題が出てきそうですが、実際にそこまで難しいことが問われることはほぼありません。

(※試験の種類にもよりますが)

では、どんな問題が問われるのか?
どうしてエンジニアじゃなくても役に立つ資格なのか?

その答えは、ITパスポートで問われる3つの分野を見れば一目瞭然です。

※下部のメリットはコンサル基準で記載しています。

これを見て分かる通り、エンジニア寄りの知識以外にも
た~~~っくさんの分野から問題が出題されることが分かると思います。

「プロマネ」や「サービスマネジメント」、「経営戦略」なんかはコンサルの業務にダイレクトに影響してくる範囲ですし、「HTML」や「Webデザイン(UI)」などのデザイナーに関する知識も豊富に出題されていますね。

まさにITに関することなら何でも学べる
「大ボリュームITお勉強パック」と言っても過言ではありません。

コンサルの人がITパスポートを勉強した場合・・・

  1. エンジニアサイドの知識を新たに吸収しながら(テクノロジ系)
  2. 自分の専門分野の知見をさらに深めることができ(マネジメント系)
  3. 社会人としての常識(法律や簿記)も学ぶことができる(ストラテジ系)

といったメリットだらけの資格になっています!

勉強するしかないですよね…?

もちろんコンサルに限った話ではなく、エンジニアやデザイナーなど、どの職種の人でも
「必ず専門外の分野が出題される」という点がこの資格の面白いところだと私は思います。

でもこんなにいっぱいの分野、勉強しきれないよ!

色んな分野を網羅的に学べる反面、学ぶ範囲も広く、学ぶ量も多くなってしまうという部分がこの資格の難点です。

しかし、裏を返せば
分野が多いということは「それぞれの分野の出題数が少ない」とも言えませんか?

言ってしまえば「広く浅く」知識が身につけられる資格です!

プログラミングやネットワーク、データベースなどの専門知識が色濃い分野は
手も付けられないような難しい問題が出題されそうなイメージですが、
実際に出題される問題の観点は「仕組みを理解しているか」「単語を知っているかどうか」であり、「実際にコードを書いてみろ!」とか「サーバ構築してみろや!」なんてことは言われません。

専門外の分野を丁度いい具合につまみ食いしながら、
業務で出てきたときにも、ある程度の話が分かるレベルに知識を得ることが出来るのです。

もちろん自分の専門的な分野に関しては、新たな知識を増やすことができるので
さらなるスキルアップも叶えることができますよ!

試験の内容は分かったけど、どのIPA資格を受ければいいの?

IPA資格ではITパスポートをスタート地点として、
【 ITパスポート ➡ 基本情報技術者 ➡ 応用情報技術者 】
と難易度が上がっていくのですが、問われる分野は基本的にすべて同じです。

難易度が上がるたびに変わるのは、問われる「深さ」です。

例えば…
ITパスポートだったら「この技術の名称はなに?」といった具合に留まりますが、
応用情報技術者であれば「この技術はどういう状況の時にどうやって使うの?」まで問われます。

「応用情報技術者」よりさらに上の資格では、ここまで網羅的に出題されていたIT知識を分解し、
より専門的な知識が問われる「高度情報技術者試験」というものが存在します。

マネジメント系をより深く学ぶ「プロジェクトマネージャ試験」や「ITサービスマネージャ試験」、テクノロジ系をより深く学ぶ「データベーススペシャリスト試験」や「ネットワークスペシャリスト試験」など9種類の専門分野が用意されています。

ー 自分はなんのプロフェッショナルになりたいのか?
ー どんな技術者になることが目標なのか?

それを考えていくことで「最終的な目標」「今受けるべきレベルの試験」が自然と決まっていくのではないでしょうか。

詳しくは、IPAが提示している下記の図が分かりやすいのでぜひ参考にしてみてください。

出典元:『独立行政法人情報処理推進機構(IPA) 情報処理技術者試験』(https://www.ipa.go.jp/shiken/kubun/list.html)

資格が仕事に活きた場面

最後に、私がコンサルとして日々業務を行う中で
「資格の勉強がこんなところに役立った!こんなところメリットを感じた!」という点を3つご紹介いたします。

1.先輩やお客さんが使っている言葉が分かる

先輩たちが業務の中で何気なく使っているIT用語や、クライアントさんとのMTG中に飛び交う単語を聞いていると「これITパスポートで出た単語だ!」と進研ゼミ状態になることがあります。

資格の勉強をしていない状態の私だったら分からなかったことも、単語の知識を身につけていたことで「こういう時に使われる言葉なのか!」というように、学んできた知識と実際に使われた場面との点と点が線になる瞬間がたくさんありました。

2.自分の発言に自信がつく

新卒はとにかく経験が足りていないので、
「これって間違ってるのかな?」と思ってもなかなか自信を持って発言できない場面があります。

そんなときにアピリッツの面接でコンサル職種の方に言われたこんな言葉を思い出します。

「仕事において「経験」と「知識」が自分を支えてくれることになるけど、「経験」はすぐに積めるものではないから、今はとにかく沢山勉強して「知識」をつけるといいよ」

この言葉通り経験がまだまだ足りない私にとって、自ら勉強した「知識」たちが自分の発言や仕事の考え方において、いつも後押しになってくれているなと感じます。

3.報奨金が貰える・給料が上がる

アピリッツには資格支援制度があるので、資格に合格することで報奨金がもらえたり、給料が上がったりします!

資格を勉強することで、

知識が身につくだけでなくお金も貰えるなんて願ったり叶ったりですよね:)
勉強を頑張る大きな理由になってます♪

アピリッツでは、IPA試験の他にも様々な資格手当が充実しています!
エンジニア向け資格からマーケター向け資格まで50種類以上の幅広い資格が用意されているので、モチベーションに繋がりますよ♪

「入社前に何を準備したらいいか分からない…」という学生さんがいたらぜひ挑戦してみて欲しいです!

最後に

今回は、私の実体験をもとにIPA資格についてご紹介させていただきました。
ここまで読んでくださりありがとうございます!

少しでも多くの方に、この資格の魅力が伝わっていたら嬉しいです。

私も引き続き勉強を頑張って、次は応用情報技術者への合格を目指します!
(勉強だけでなく経験もたくさん積んで、実力の伴った知識に変えていかなきゃなというのはもちろんですが…!!)

アピリッツはちっちゃなことでも褒めてくれる先輩が沢山いますし、
頑張れば頑張った分だけ認めてもらえる環境です。

アピリッツに少しでも興味を持った方、エントリーお待ちしております!

私の推し活とアピリッツ

0

推し。。それは、生活に欠かせない存在。尊くて、儚い、近いようで遠い存在。
今回はそんな「推し」を推すこと、「推し活」をしている社員をピックアップして推し活とワークライフについてインタビューしてきました!

あなたにとって推しとは。。

生活すべてのモチベーション。推しのために可愛く・綺麗にありたい、推しに恥じない人生を送っていきたい。

推し活プロフィール

推し活歴は?

推し活歴は10年。初めての『推し』は中学生のころ。
今の推しはとあるゲームキャラクターでショーレストランのパフォーマー。

『推し』になったきっかけは?

友人とアニメショップに行った際のこと。CDコーナーで何気なく友人と好きな顔を選んだ時に出会い、そこから忘れられなくなったのだそう。
ここまでお金をかけた推しは初めてだとか(笑)

今の『推し活』をおしえて!

主に、ゲーム、ライブなどの現場、グッズ。
グッズに至っては、痛バを作るために、推しの缶バッヂを100個くらい買うこともあるそう!

推し活とワークライフについて聞いてみた!

――推しがいるといないでは仕事にどんな影響をもたらすと思いますか?

私の場合はモチベーションにだいぶ差が出ると思います。
個人的にはデスク周りも、常に推しのアクスタなど、好きなものに囲まれていたほうがやる気も出ます!
あと、推しは仕事に不真面目であるより真面目な子に好感を持つと思うので、推しに笑顔でお疲れ様を言ってもらえるように真面目に取り組んでいます。また、推しのイベントに行くために、タスクを早め早めに終わらせるようにして、仕事も推し活も両立できるように調整しています。それこそ、アピリッツではフレックスタイム制を取り入れているので、うまく活用していますね!

――デスクまわりにはなにかこだわりがありますか?

そうですね。。好きなものであふれるとごちゃごちゃしがちでもあるので、100均などで売っているクリアケースを用いてなるべく綺麗にディスプレイするようにしていますね。
あとは、推しと目が合うように工夫して置いたりもしています(笑)

アピリッツでの推し活の実態とは。。!

推し活はコミュニケーションツール

――アピリッツには推しがいる社員が多いと感じますか?

ゲームセグメント所属のためか、私の周りはやはり何かしら推しがいる方がたくさんいらっしゃいます。ゲーム・アニメなど二次元コンテンツに限らずアイドルや動物、TRPGなど本当に多岐にわたっています!なので、全体的に推し活などに対して寛容な雰囲気があります。私が日報で推しについて書いてもみんな受け入れてくれていると思います。

ーー他の社員から日報にコメントなどもらったりしますか?

もらったりもしますね!何なら他の社員も推しの現場があることなどを自由に書いていることが多いです!また、私とは推しの界隈が違うことがほとんどなのですが、推しの現場あるあるだったりお互いの推しの好きなところを言い合ったりなど、それぞれの推しを通じたコミュニケーションも私の周りは盛んかなって思います。

推しへのファン感情を仕事に

――推し活とアピリッツでのワークライフバランスを取るうえで一番大切にしていること

やりたいことを我慢しないこと、だと思います。
仕事のために大切な推しを諦めるということはしたくないし、かといって自分の仕事にも手を抜けないので、どちらも全力で取り組むことが大切だと思います。
また、推し活をしている中で感じたファン感情などはゲーム運営でも大切になってくる観点なので、全力で楽しんでいれば趣味も仕事に活用できるようになります。

ーーファン感情が実際仕事に役立った場面はありましたか?

私が担当しているのがゲームのプロモーションということもあり、特にファンの方に寄り添う場面が多いと思います。その時に、自身のファン感情をもとに、ファンが欲しいコンテンツを意識しています。実際に、私が担当したコンテンツの反響をSNSでいただいた時はうれしかったです(笑)
また、入社してすぐに自身が担当するゲーム内で、「推しを作れ。」と言われたのを覚えています。それくらい、運営をするうえでファン感情は重要になると思います。

最後に。。

――あなたにとって推しとはどんな存在ですか?

「生活すべてにおいてのモチベーション」になってくれると思っています。
たとえば、仕事においても推しに課金したい・イベントに行きたいから頑張れるというのが大きな理由の一つでもあります。
推しに恥じない人生を持っていたい、という考えですべて行動できているため、推しのおかげで人間レベルがプラス10くらい上がっていると言っても過言では無いと思います。

推しへの愛が溢れまくってますね。。!

推しにひとことください!!

大人っぽくて鷹揚で、いつも理性的なところが大好きです!
常に私の一番星です。あなたの活躍をこれからも見守らさせてください!
応援してます!!大好きです!

――金澤さん、ご協力いただきありがとうございました!

アピリッツに少しでも興味をもった方!ぜひエントリーお待ちしています。

【アピリッツのお仕事紹介】今年2年目の営業さんにインタビュー

0

アピリッツの営業って一体どんなことをやっているの?
今回は営業としてご活躍されている土屋るりさんにインタビューをし、アピリッツの営業の魅力を聞いてきましたのでどうぞご覧ください。(2024年1月取材)

プロフィール

もともとはエンジニア志望でした

――アピリッツに入社した決め手は何ですか?
オープンな雰囲気と人が良かったので、アピリッツに入ろうと思いました。服装が自由なところも決め手になりました。


――その中で営業を選んだきっかけを教えてください
最初はエンジニアとして応募していました。何度か面接をする中で営業を勧められて、最終的に営業として採用されました。

アピリッツの窓口やってます!

――営業のお仕事は主にどのようなことをしていますか?

私が業務に携わっているソリューションパートナー部では、主に開発案件の営業活動を行っています。営業メンバーは4名のみですが、協力し合い業務を回しています。
基本的には、「こんなシステム・アプリを作りたい」というお客様からの依頼に窓口として対応し、エンジニアやプロジェクトマネージャーの方々と調整してご提案することがメイン業務です。その他にも、既に進行している案件の顧客対応や進行のフォローに入ったり、パートナー企業と打ち合わせをしたり、状況によっては新規顧客の開拓をすることもあります。

――入社してから関わった主な案件を教えてください

「パーソナルデータ活用システムの新規開発」や「SEO分析ツールのPoC開発」などに携わりました。詳しい名前は出せませんが、誰もが知っている会社さんの案件を受注できたので印象に残ってます。

これが私のルーティン!

――1日のスケジュール、仕事のルーティンを教えてください

10:00 出社

朝会 
予算に対する数字や営業状況の確認

事務作業 
打合せ以外の時間で提案書や契約書などの書類作成

お昼休憩
スタバでチル!
昼は外でぼーっとしたくてご飯よりスタバに行きます

お客様や社内での打ち合わせ 
お客様との打ち合わせでは事前に相手の企業のHPをみて、事業内容や売上比率などを調べるようにしています

19:00 退社

アピリッツの営業はスマート!

――アピリッツの営業の特徴を教えてください

「決まった商材を売る」のではなく「お客様の課題を聞いたうえで、弊社からはどういった価値を提供できるのか」というお客様の課題起点の営業なので、ご相談内容や提案の幅が広く、やりがいがあります。
部長層との距離が近く、若手でも目線の高い意見を直接聞くことが出来たり意見交換の場が多いので、個人的には日々学びが多いです。

――一般的な営業はずっと外にいるイメージがあるのですが、みなさんは社内で仕事をすることの方が多いですか?

たまに訪問することもありますが、ほとんどオンラインでの打合せが多いです。
一般的な営業と比べると、社内にいることの方が多いかもしれませんね(笑)

――オンラインでの打合せ、スマートですね!社外との打合せで心がけていることはありますか?

「販売」にならないようにすることを心がけています。相手の課題を聞き出して、どういった背景があってご依頼いただいてるのかを考えながら、相手に寄り添えるようにしていきたいと思っています。

営業メンバーは過保護な親?!

――営業チームの雰囲気を教えてください

人数が少ない分、コミュニケーションは盛んだと思います。
基本的に出社しているメンバーがほとんどなので、質問や詰まっている事があれば気軽に質問や相談できるので仕事が進めやすいです。

――私たちから見ても仲がよさそうですが、仲良しエピソードはありますか?

初めてお客さんから受注してもらえた時に、営業のみなさんが過保護な親のようにお祝いしてくれました。すごい大きい拍手が執務室内に鳴り響いていたので、恥ずかしかったですが嬉しかったです(笑)

日々学び、日々成長!難しいけど面白い!

――土屋さんがお仕事する中で、やりがいを感じる瞬間を教えてください

自分の担当した提案が通り、受注できた時は嬉しかったです。結果が出た時に先輩や上長に直接評価してもらえることもモチベーションに直結しています。
また、相談内容もお客様の業種業態も多種多様なので、日々新しい学びや知識と出会うため、難しい部分も沢山ありますがとても面白いです。

――直接評価してもらえるのは嬉しいですよね!最後に、今後の目標を教えてください!

自分が担当したお客様に、「また依頼したい」と思っていただき、アピリッツが大切にしている「ロイヤリティループ」に繋げていけるような仕事がしたいと思います。
また、お客様とエンジニアの方へよりスムーズな橋渡しができるよう、自分自身の知識ももっとアップデートしていきたいです。

――土屋さん、今回はご協力いただき本当にありがとうございました!

開発時の不安の要因がわかった話

0

今回は、アピリッツの知識共有サイト「ナレッジベース」で公開されている内容をアピスピでも紹介します。
エンジニアとして活躍されている桑添敏生さんの記事です。
是非最後まで読んでください!(初版:2023年2月2日)

経緯・問題点

これはES部だからとか運用・開発だからというのは全く関係なく、
業務をする中で「何このめちゃくちゃなソースコード」という感想を持った方は少なくないと思います。

どうしてソースコードがある程度可読性があって保守しやすい必要があるのか、
なぜ、ソースコードがめちゃくちゃだとネガティブな考えが増えていくのか、
正直経験の浅さやボキャブラリーの少なさから、今までうまく言語化できていませんでした。

もやもやしていることはわかるのに、原因が掴めないことで
さらに焦ったりイライラしたりしてしまうので、しっかり考えてみた過程です。

試したこと

一度内容を整理するために、ゲーム業界で働く友人達に愚痴混じりで、
「ソースがめちゃくちゃで対応コストが高い」的な内容を相談してみました。

友人達もみんな業務内で似たような経験があり、
「その場しのぎ」「悪循環」「開発が進むとモチベーションが下がる」といった、
切り取るとネガティブな言葉ながら楽しんでいる雰囲気もある不思議な反応だったので、
こんなに似たようなワードが出てくるなら、誰かが上手く言語化してまとめているのでは?と思い調べてみました。

問題の解決

いろいろ調べてみた結果、思っていたことを一番言語化できていたスライドをSpeaker Deckにて見つけました。

・技術的負債は開発者体験を悪化させる @mtx2s

引用元:https://speakerdeck.com/mtx2s/technical-debt-and-developer-experience

内容をいくつか引用すると、

Q. ユーザー体験と開発者体験はよく似た特徴を持っている。
そして優れた体験が得られなければどうなるのか?

どちらも最後は離反に至ってしまう、、、

Q. なぜ開発が進むとモチベーション(開発する気)が下がってしまうのか?

・スライド内にはこの様に書かれています。

「レガシーコード」という言葉を聞いて皆さんは何を思い浮かべるでしょうか。
 スパゲッティコードが原因で簡単なはずの機能追加で徹夜作業したことや、
 士気を喪失してしまったこと
チーム全員がコードにうんざりしてどうでもよくなってしまった感覚
 そのコードを改善しようと考える事すら嫌な気持ちになるかもしれません。
 そんな手間をかけるのは無駄に思えるからです。

しかし、

どんなにモチベーションが下がっても結局は真正面から向き合うしかない…
でも、問題点や性質をしっかりと押さえておけば工数の振り方次第で上手く付き合えるかも…?

その点を考慮してスライドを読み進めていくと、

Q. その負荷がかかるコードの特徴はどのような場合なのか?

スライドには以下の特徴が例として記載されていました。

つまり技術的負債が増え続ける開発現場では、
リファクタリング(開発者の負担軽減)を行わずに 振る舞いの価値(新規機能の開発)
優先させてしまっている。

おもむろに「立ち向かうしかない」とか「頑張れ」と言われるよりも具体的な問題が見えてきました。

しかし、開発の現場においては売上が出ないリファクタリングよりも、
新たに売上を生み出す新規開発が優先されるのは納得できます。

Q. なぜ売上(機能開発)優先だけを行うとマズいのか?

・スライドを引用すると、

答えとしては、
無理が積み重なって開発が止まってしまい、一時的な売上しか立たなくなってしまう からです。
そのため、最終的には全員がいい事なく終わってしまう事になります。

Q. さらにこのまま開発が進んだ場合に何が起きるの?

次に発生するのが開発者への負担となり、自分達が「悪循環」と呼んでいたものがこれに当たります。

最初に、
「無謀な開発」 が「技術的負債」を増加させて、
「技術的負債」「開発速度」を低下させて、
「開発速度」「無謀な開発」を頻発させるループが起きます。

さらに上のループがしばらく続くと、
「無謀な開発」「欠陥・障害」を増加させて、
「欠陥・障害」「開発速度」を低下させて、
「開発速度」「無謀な開発」を頻発させるループも起きます。

その結果、全員ボロボロに…

こういった流れが原因で、
最初の画像の通り現場のモチベーションが下がり続けるのだと把握することができました。

結論

ずっと自分が抱えていた要因は「リファクタリング」を軽視した、
基盤が不安定なまま行い続ける開発作業だという事が今回の件でわかりました。

ただ、エンジニア以外の職掌にリファクタリングの重要性や定期的に行う必要があることを伝えて、                          土台を構築するのはものすごく大変でコストが高いです。

しかし、人数は違えど全てのプロジェクトでこの部分を負担している人が必ずいるので、
まずは毎朝業務開始時に1関数を改修するなど、自分ができる範囲から
心理的、技術的な負担を軽減する手伝いをしてみようと思いました。

最後に

今回の話のオチとしては、 結局何を言っても自分自身が問題に向き合う必要がある事です。

スライドの最後の言葉として、

アーキテクチャを後回しにすると、システムの開発コストはますます高くなり、
システムの一部または全部が変更不能になるだろう。そのような状態が許されているなら、
ソフトウェア開発チームが自ら必要とするもののために懸命に闘わなかったという事だ。

案件や状況に文句を言いたくなる時もあるけど、一旦戦ってみようと思います。

____________________________________________

桑添さんありがとうございました!

アピリッツでは自分が得た情報や技術を積極的に共有し、それらを吸収しながら各々のスキルアップを目指しています。
アピリッツに少しでも興味を持った方、エントリーお待ちしております!

エントリーはこちらをチェック→〈https://recruit.appirits.com/

【2023新卒対談】入社の決め手は〇〇!?~就活から入社して約1年経つまで~

0

今回は2023年に新卒としてデジタルビジネス部に入社したWebエンジニアの2名に入社の理由や実際に入ってみてどうだったか、話を聞きました!(2024年1月取材)

――簡単に自己紹介をお願いします!

成田:デジタルビジネス部の成田侑希です。大学時代はデザイン工学の勉強をしていました。現在は新規開発案件のお仕事に携わっています。

佐藤:同じくデジタルビジネス部の佐藤大河と申します。大学時代は文系だったため経済学を学んでいました。成田くんと同じ新規開発案件を一緒にやっています。

アピリッツは自社で完結!フラットな雰囲気に惹かれて・・・

――お二人のアピリッツに入社した経緯や理由を教えてください!

成田:最初の就職活動時に、具体的な進路が見えずに、IT業界だけでなくゲーム業界などさまざまな選択肢を模索していました。実はアピリッツも元々ゲームエンジニア志望で選考に進んでいたんです・・・!

ただ、最終面接の際に社長の和田さんから今後のキャリアについての話やWeb側でも面白い案件があるという事を聞いて、Webのエンジニアとして入社することを決めました。

佐藤:僕は文系でしたが、大学の授業の中でプログラミングの授業があって、そこからIT業界に興味をもったことがキッカケです。その中でもアピリッツに決めた理由は、SES(システムエンジニアリングサービス)のようなクライアント先での常駐ではなく、自社で開発が可能な点や、柔軟で自由な雰囲気が特に魅力的に感じられたからです。

成田:僕も最終的な決め手はやっぱり社内見学で感じた社内の雰囲気です!多くの企業がオンラインでの選考を行う中、アピリッツは対面での面接も可能だったため、面接後に社内見学を実施していただきました。そこで実際に働く社員の雰囲気を感じることができ、アピリッツで働くイメージがつきました

社内見学では細部まで案内してもらいましたが、特に印象的だったのはキッチンスペースです。そこで「ここで社長が時々カレーを作るんですよ」と聞いて驚きました(笑)。社長が身近に感じられるようなアットホームな雰囲気が、魅力的でした。

佐藤:僕も服装が自由であったり、ソファースペースで社員さん同士が集まってミーティングしているのを見て、社員さんの雰囲気もいいな〜と思いました。

部署が変わった同期とも今でも仲良しとのこと!

想像した以上の経験ができた1年。

――実際入社してみて、どうでした??

成田:学生時代は社会人としての不安もありましたが、実際に働いてみると先輩方が優しく、分からないことがあれば聞ける環境でした。いきなり無理難題を押し付けられることもなく、困ったときはいつも誰かが手を差し伸べてくれる。そんなサポートがあるから、社会人生活は思ったよりも素晴らしいものだと感じました(笑)。

あと、内定者顔合わせ会で同期の雰囲気を知ることができたおかげで、実際に入社してからのギャップはあまり感じませんでした。また、入社後の新卒研修を通じて、実務のイメージを具体的に掴むことができました。同期との交流の場もあり、とても楽しい時間でした。(入社後の研修の記事はこちら)

佐藤:就活時に色々な企業を口コミサイトで検索した時、1年目の業務はテストや書類整理が中心だと思っていました。しかし、アピリッツに入社し、研修を終えて6月に本配属されると、1年目とはいえ、新規実装のタスクを担当させてもらったり、予想以上に多岐にわたる業務に関われる機会をいただき様々な経験ができました。

――どんなときに「働いていて楽しい」と感じますか?

成田:新しいことを任せてもらえたり、できることが増えて自分のスキルが成長していく過程が楽しいです!

佐藤:僕も同じで、入社した4月の頃はできなかったことが、今では自然とできるようになってきたことを実感すると、とても嬉しいですね。

後輩が安心して入社できるように次は僕たちが頑張ります!

――最後に今後の目標について教えてください!

成田:より幅広い知識を身につけることを目指しています。同時に、次に入社する後輩たちが頼りにできる先輩になりたいと考えています。

佐藤:僕も、4月に入ってくる後輩に自分が先輩からしてもらったように、困っていたら何か助けになれたり、分からない事を聞かれたら解決に導けるように頑張りたいです!

――お二人ともありがとうございました!

新卒採用サイトはこちら

【クリスタ】個人的役立ちTips

0

今回は、アピリッツの知識共有サイト「ナレッジベース」で公開されている内容をアピスピでも紹介します。
3Dデザイナーとして活躍されている杉山拓海さんの記事です。
是非最後まで読んでください!(初版:2023/12/19)

ES部の杉山です。
今回は、普段から自分が使っているペイントソフト「CLIP STUDIO PAINT(クリスタ)」について自分の中での役立ち機能などを少しまとめてみましたので参考にして頂ければと思います。
ちなみに、自分が使っているのは買い切りの「CLIP STUDIO PAINT Pro Ver.2.0」なので、別のバージョンを使っている方とは部分的に差異があるかもしれませんが、その辺はご了承ください。

■クイックアクセス

クイックアクセスはよく使う機能を登録して、一つのウィンドウ内にまとめておける便利機能です。
ショートカットは設定していないけど、よく使うものはここにまとめておくと都度タブを開いて探す手間が省けるのでおすすめです。

■レイヤー検索

レイヤー検索は、条件を指定することで対象のレイヤーやフォルダをピックアップ表示してくれる機能です。
細かくレイヤーを分ける人は特にですが、毎回編集対象のレイヤーを探すのに時間がかかるといったことも多いと思うので、そんなときはこれを利用すると早く見つけることができるかもしれません。

■レイヤー選択ツール

レイヤー選択ツールは、キャンパス上で指定した選択範囲内にあるレイヤーを自動で選択してくれる超便利ツールです。
デフォルトでショートカット[Ctrl+Shift+左ドラッグ]が設定されているので、いちいちツールを選択せず無意識で利用している人も少なくないかもしれません。

しかしながら、このツールは意図していないレイヤーまで選択してしまうことも多いため、個人的には一度サブツール詳細パレットから選択しないレイヤーを自分好みに設定しておくことをおすすめしたいです。

■複数レイヤーの一括塗りつぶし

普段塗りつぶしといえば、ショートカット[Alt+Del]で設定されている塗りつぶしバケツツールが一般的かもしれませんが、これらの場合複数レイヤーを対象として一括で塗りつぶしを行うことはできません。

しかし、クリスタには編集タブの中に「線の色を描画色に変更」という機能があり、これを使うことで複数レイヤーに対して一括で塗りつぶしを行うことが可能になっています。

■Altキーでのレイヤー複製

レイヤーの複製に関しては、専用の「レイヤーを複製」「コピー&ペースト」などいくつか手段がありますが、個人的には「Altを押しながら対象レイヤーをドラッグ」が一番使い勝手がいいと思っています。

理由としては、一番動作が手軽でしかも好きな階層に直接複製できるというのがメインですが、その他にも同じ手順でマスクだけ他レイヤーに複製できるというのも大きなポイントです。

■マスク操作のあれこれ

知っておくとちょっと便利なマスク関連の操作を簡単にまとめました。

■[Shift+マスク左クリック]でマスク有効/無効の切り替え

■[Alt+マスク左クリック]でマスク範囲の表示/非表示の切り替え

■環境設定でマスク表示の色と不透明度の設定が可能

■マスク範囲の反転は色調補正「階調の反転」で可能

■Altを押しながらマスク作成を行うと選択範囲外がマスク対象になる

■マスクに対してフィルタを適用することができる

■選択範囲の境界線非表示

キャンパス上で選択範囲を取った状態だと、その周囲に点線が表示されると思いますが、表示タブ内の「選択範囲の境界線」をクリックしてチェックを外すと点線が非表示になります。
特に色塗りをしているときは点線が邪魔に感じることも多いので、ショートカット登録しておくと便利な項目だと思います。

■定規ツールの複数同時利用

定規ツールは、設定するとそのガイドに従った線が引ける便利ツールです。
単体で使ことが多いこの機能ですが、実はフォルダでの階層構造を利用してそれぞれに定規を設定することで、複数定規の同時利用が可能です。

これを用いると、より複雑なパターンが簡単に作れるので、特に魔法陣紋章などを描きたい時にはおすすめの技法です。

■ノイズテクスチャの作り方

これはすでに知っている人も多いと思いますが、フィルターの「パーリンノイズ」を利用することで、簡単にノイズテクスチャの素材を作成することができます。
また、自分の場合はさらに上から虹のグラデーションマップを素材に適用して、色の幅もノイズに含ませるようにしています。

■色調補正レイヤー+レイヤー合成モード変更

トーンカーブやカラーバランスなど色調補正レイヤーを利用することは多いと思いますが、おそらく「通常」の状態で利用することがほとんどではないでしょうか?
しかし色調補正レイヤーに関しても「乗算」「スクリーン」といったように、合成モードを変更することは可能で、意図的にトーンカーブをめちゃくちゃな波形にしてから合成モードを変更すことで、色味のムラを付加するといった手法でも使うことができます。

自分の場合は、「彩度」「除算」「色相」「ソフトライト」「カラー」などの合成モードで色調補正レイヤーを使うことも多いです。

■ブラシのカーソル形状変更

ブラシのカーソルは、円形やブラシ素材の形をしていることがほとんどだと思いますが、環境設定から自分好みにブラシカーソルの形状をカスタマイズすることが可能です。

特に、細い線を引く場合カーソルが邪魔で描きにくいといったこともあると思うので、まだ触ったことがないという場合は、一度色々試してみるのもいいと思います。 自分も線画ブラシのカーソルを円形から三角形にしたら凄く描き心地が良くなったので。

■オートアクションへのショートカット設定

クリスタには自分が行った操作を記録して、ワンクリックで実行できるオートアクションという機能がありますが、これに対してもショートカットの割り当てが可能なのでよくやる操作をオートアクションに記録してショートカットを設定するだけで、作業効率が何倍にもなったりします。

「新規レイヤーを作成して下にクリッピング」や「選択範囲を切り取って別レイヤーに分割」など、手数としては多くない、何気ない動作でも何回も繰り返し行うものは特にやっておくと便利です。

■修飾キー設定のカスタマイズ

「spaceを押している間は手のひらツール」「Altを押している間はスポイトツール」など、一時的に修飾キーを押すことで別ツールに切り替わる仕様がデフォルトの状態でもされていると思いますが、これに関しても変更が可能になっています。

ネット上では、この機能に関しても「ショートカット」という単語で一括りにされがちなので、設定項目の存在を知らないという人も自分の周りには少なくないですが、これについてはファイルタブ内の「修飾キー設定」から自分が好きなように変更することができます。
非常に使い勝手がいい機能でもあるので、一度自分好みの設定を作っておくことをおすすめします。

■パターンタイルグリッド

クリスタの機能の一つにパターンのタイリング機能というものがありますが、これを上手く用いることで、絵を描くときの補助グリッドを簡単に作成するというテクニックがあります。
素材さえ用意してしまえば導入も簡単ですし、直感的に操作できるので使い勝手は良いです。

■天球グリッド

クリスタには3D機能が付いていて、3Dの素材を扱う際には背景などを表示するための天球が作成されます。
この手法は、その天球にグリッドの画像テクスチャを貼り付けることで、ぐるぐると動かすことができるグリッド空間を作るというもので、一度設定してしまえば以降の導入もドラッグ&ドロップだけです。

しかも素材に関しても、CLIP STUDIOの公式ページにすでにユーザーから無料提供されているものがあるので、それをダウンロードするだけです。

■ファイルオブジェクトで素材管理

ファイルオブジェクトは、別のファイルデータを参照する形で読み込んで、他の画像素材レイヤーと同じように扱えるといった機能です。

一番の魅力は、読み込んだデータが常に参照元と連動しており、元データを変更保存すれば合わせて読み込んだデータも更新されるという部分ですね。また、同じファイルオブジェクトを複製しても、参照元の更新自体はすべてに適用されるため、同じ形状の素材を一括管理したいという場合には特におすすめの機能です。

ただ、フォルダ移動などで参照元のデータがなくなってしまうと、場合によっては意図しない状態になる可能性もあるので、ファイルオブジェクトは最後必ずラスタライズかレイヤー変換で画像素材レイヤーしておくことをおすすめします。
また、ファイルオブジェクトのレイヤーがロック状態だと更新されないのでそこも注意が必要です。

 

アピリッツでは自分が得た情報や技術を積極的に共有し、それらを吸収しながら各々のスキルアップを目指しています。
アピリッツに少しでも興味を持った方、エントリーお待ちしております!

アピリッツは働く仲間を募集中! 採用ページはこちらです!

新卒のガッツリ飯はこれだ!vol.2

0

食べ物に目がないアピリッツ社員!でも東京の物価は高い!ましてやアピリッツのある明治神宮前・原宿エリアなんてめちゃめちゃ高い。。マジで高い。。
でもうまいものが食べたい。。

前回の「新卒のガッツリ飯はこれだ!」では、ラーメン、カフェ、定食屋、キッチンカーの4ジャンルが紹介されていましたが、今回はガッツリご飯、カフェ、テイクアウトの3ジャンルで紹介させていただきます!

そして第2弾では、23新卒の方々に3ジャンルそれぞれのおすすめとご飯に使う予算について聞いてきました。

ご協力いただきありがとうございました!

そしてこれらをもとに、我々食べ物大好きアピリッツスピリッツ編集部で実際に行ってきたところもあるので、そこも楽しみながら見てください!

ガッツリ飯編

ガッツリ飯と一概に言っても定食やパスタ、餃子やハンバーガーなど種類も様々。

そしてやはり新卒社員。お腹は人一倍空く。。だけどこのエリア、おしゃれなだけあって高い!!

そんなここ、明治神宮前・原宿エリアでどんなお店の、どんなご飯でお腹を満たしているのか。。

お店紹介!!の前に。

番外編

今回はお店紹介のほかにも、ごはん代(コンビニ等除く)の予算も聞いてきました。

やはり高くつくのか、はたまた安く抑えることができているのか・・結果はいかに!

全体的に1,000円以下が多く、比較的にリーズナブルにお腹を満たしているそう!

1. まさや 

このお店は私も大好きなのですが、新卒の皆さんからもやはり大人気。

なんといってもここは、ガッツリ!うまい!そして安い!!

個人的におすすめなのが、この唐揚げ定食(580円)のご飯大盛。

なんといってもこのお値段にこのボリューム。しかも味もめっちゃうまいんですよ。めっちゃ。

でもちょっとボリューミーすぎるな。。と思った方には、刺身定食や漬け丼なども1,000円ほどでいただけるのでかなりおすすめです!

場所は、京セラ原宿ビルを出て原宿方面に向かい、ラフォーレの角を曲がってすぐの「めしと酒」の提灯が目印。(地図下記参照)

お昼休憩に歩いて7分ほどで行けるのも良い!

2. T.G.I FRIDAYS

ここも、まさやに次いで大人気のお店、通称フライデーズ

フライデーズと聞くとアメリカンなご飯でお高いイメージが。。なんですが実は、ランチメニューがあるらしい!

1,000円ほどでクオリティーの高いアメリカンなランチを楽しむことができます。

この日は、鶏むね肉とシュリンプのソテーにピリ辛のトマトソースを合わせたパスタを注文。

お肉とエビがたっぷり入っているので、この一皿で大満足!

お味は思ったよりもさっぱりとしていて、女性でもペロリといけちゃいます!

お店の詳しいメニューなどはこちら

場所も徒歩6分。明治通りを原宿方面に歩き、少入ったところにあるのですぐ行けます!

カフェ編

ちょっと一息つきたい時やリモートワークなど様々な場面で活躍するのがこのカフェ。

スターバックス

もう最強の定番カフェ。値段もリーズナブルでドリンクもフードも種類が豊富。

新卒の方々に聞いても大多数がスタバと答えていました。(さすが)

しかも原宿・表参道・渋谷エリアにはなんと15店舗ほどあり、困ったときにすぐ入れるのが便利ですよね!

京セラ原宿ビルからは、信号わたってすぐ目の前に1店舗あり、私もよくテイクアウトでぱぱっとアイスティーとワッフルを買うことが多いです(笑)

中には、コーヒー片手に散歩して息抜きする社員も。(おしゃれ!スマート!)

テイクアウト編

ぱっと買えてさっと食べれる、スマートなアピリッツ社員にはぴったりなご飯。

でも、テイクアウトだと少し物足りなさそうなイメージもありますよね。。そんな中でアピリッツ新卒社員はどこでご飯を買っているのか!!

神宮前J6Frontビル村

テイクアウトの代表格といえばキッチンカー!

ここでは、日替わりで1週間キッチンカーが来るそうでその種類も様々。

オムライスからタコライス、焼きそばやロコモコなど1週間で食の世界旅行をしている気分にも!

1回1,000円でおいしい世界旅行できるならめちゃめちゃお得ですよね!

workstore tokyo do様ホームページより

新卒の方に圧倒的人気があったのは木曜日のロコモコ。肉を大いに感じれるハンバーグに、野菜も取れて健康的!比較的リーズナブルなのもうれしいですね。

ちなみに、私個人的なおすすめは火曜日のオムライス。テイクアウトとは思えないクオリティで卵もふわっふわ。。

どれもがっつり大盛に変更しても1,000円ほどで、その日のお腹とも相談しながらおいしいテイクアウトを楽しめそうです。

場所は、京セラ原宿ビルから信号を渡り、niko and…の脇道を通るとあります。

信号渡ってすぐのniko and… の白円で囲んだ脇道へ
この道を通ったらあなたの世界旅行の始まり。。!

お店の都合によっては、ラインナップなど変更あるそうなので詳しくはこちら

今回は第2弾と題して、ご飯紹介させていただきましたが、

もし、ほかにおすすめあれば編集部の私たちにこっそり教えてください。(絶対行きます)

それでは!Bon Appetit !

新年のご挨拶

0

新年あけましておめでとうございます。

今年も皆さんに喜んでもらえるようなアピリッツ情報をたくさん発信していきたいと思いますので楽しみにしていてください!

2024年もどうぞよろしくお願いいたします。

アピリッツスピリッツ編集部

プレスリリースはこちら

最近人気な記事