のんびりやの日記

のんびり、たまに更新。

株式会社エーアイのインターンシップに参加します!

こんこんにちは、こんにちは。

記事によって文体がぶれぶれになるだーやまんですどうもお。

今回は、タイトルの通り、株式会社エーアイ様のインターンシップに参加するので、その報告の記事になります!

株式会社エーアイとは

主に、音声合成技術を開発したり、それによるサービスの提供を行っている会社です。ソフトバンクのpepperくんの音声だったり、AHSより販売されているVOICEROIDの音声合成エンジンであるAITalkが有名かと思います。僕が運営している喋太郎でも、こちらの技術が使われていました。そのほかにも、防災無線だったり、博物館の案内だったり、我々の生活の至る所でこの会社の技術が使われているようです。詳しくはこちら

経緯

色々あって、代表取締役の吉田大介様とお話する機会がありました。その際、内定等がまだならインターンシップに参加しませんか?とお誘いいただいたので参加することに!

目標

僕自身、VOICEROIDを用いた動画をニコニコ動画で投稿しているのもあって、AITalkにはとてもとても興味がありまくりなんですよね。
- 日本のトップを走るサービスは、どのような意識を持って提供しているのか
- 音声合成を用いたサービスには、どのような可能性があるのか
ということを学んできたいと思います!

期間は9/2~9/13と少々先ですが、頑張りたいと思います!!

Discordに、Voice Statusとかいう設定項目ができてた

どうも、だーやまんです。

入り浸ってるDiscord鯖の通話に参加したら、見慣れない設定項目ができててナンジャラホイってなったんですね。

f:id:pvvn3135:20190618145157p:plain
場所は、ウィンドウ左下の通話切るボタンの横
よくわからんが、とりあえずクリックしてみよう。
f:id:pvvn3135:20190618145421p:plain
なんのこっちゃ。
英弱なのでスラングはよくわからん。 とりあえず、主張を入力してみる。
f:id:pvvn3135:20190618145735p:plain
This is my room.
すると、ボイスチャンネルにいる自分のユーザ名の横にアイコンが生えてて、カーソルを合わせると主張してきた。
f:id:pvvn3135:20190618145909p:plain
チャンネル名は気にしたら負け
なるほどね、いいじゃないこれ。ゲームとかやってて、何をやってる部屋なのか通話未参加の人に教えられるねって感じ。

Twitter検索してみると、一部のサーバにしか実装されていない機能らしい。画面共有鯖と同じく、リセマラしてたら当たるみたい。運が良ければ、画面共有とSet Voice Statusと両方持ってる鯖を当てられるとか(未検証)。
まあ、サーバリセマラはDiscord運営側に負荷をかけちゃうからやめようね...と一応。

追記
どうやら、利用できる鯖の中でも、限られたユーザが利用できる模様...条件が判明し次第、追記します。(Nitroでもなかった)

追記2
昨日、ボイスチャットに入ったら設定できなくなってた...剥奪されたんだけどなんで...?

discord.pyでシャーディングして大規模なBotを運用する

喋太郎の規模が大きくなってきたので、複数のサーバでBotを運用する方法を探してたのだが、日本語のドキュメントが全くない(全ギレ)。 色々試行錯誤しながらなんとか実現できたので、同じ悩みを持っている方のために書いていく。大規模Botを開発できるぐらいなんだから英語くらい読めるだろっていうツッコミは無しで。(読めない人) pythonでやる場合について書いてるけど、他の言語でやっても同じだと思うので参考にしてもらえたら。雰囲気で書いてるので、間違ってたらコメントで教えていただきたい。

※2019 5/16 コメントで指摘があったため、良さげな形へ訂正

喋太郎については以下の記事から www.dayaman.work

シャーディングって何

よくわからない。俺たちは雰囲気でシャーディングしている。

何ができるようになるの?

複数のプロセスでBotを運用できるようになる。CPUが余ってるから並列処理した方がもっと効率的に運用できるのにな〜、とか、サーバの増設、いわゆるスケールアウトがしたい、だとかが実現するよ。 詳しくはDIscord公式のドキュメントを読んでほしい。どのような基準でギルドを振り分けるのかも書いてある。 discordapp.com

シャーディングをする目安

discord.pyのドキュメントでは1000ギルドからと書いてあった。Rythmのエンジニアさんは2000ギルドを超えたならシャーディングした方がいいと言っていた。そんな感じで。

やり方

複数サーバで運用する場合

2台のサーバに1プロセスずつ走らせるとする。 Clientのインスタンス生成時に、何番目のプロセスなのか示す shard_id とプロセスの総数の shard_count を指定する。
サーバA

client = discord.Client(shard_id=0, shard_count=2)

サーバB

client = discord.Client(shard_id=1, shard_count=2)

shard_id は0から始まることに注意する。 あとはすべてのプロセスを立ち上げるだけで完了。

1つのサーバ上で複数プロセスを立ち上げたい場合

Client クラスの代わりに、 AutoShardedClient を使う。このクラスは、自動でいい感じにshardingしてくれるやつらしい。すごい。詳しくは公式のドキュメントを読んでほしい。

client = discord.AutoShardedClient()

これだけでOK。1000ギルドにつき1つプロセスを生やしてくれる。もし、生やしたいプロセス数があるならば、 shard_count を渡してやればそれだけ立ててくれる。

複数サーバで、それぞれ複数のプロセスを立てたい場合

AutoShardedClientshard_ids を渡す。
例えば、2台のサーバに4プロセスずつ、合計8プロセス生やす場合 サーバA

client = discord.AutoShardedClient(shard_count=8, shard_ids=(0, 1, 2, 3))

サーバB

client = discord.AutoShardedClient(shard_count=8, shard_ids=(4, 5, 6, 7))

どのサーバにどれだけプロセスを割り振るかは、スペックに応じて柔軟に臨機応変してほしい。

注意点

  • shard_count の数だけプロセスが立ち上がらないと、Botはオンライン扱いにならない
  • DMは、 shard_id が0のプロセスが受け取る

思うこと

それぞれ独立した複数のサーバで運用する場合は、1つでもプロセスが落ちたらBotが機能しなくなるので、その辺の工夫が必要になると思う。

 
 ブログバナーです  
 ご自由にお使いください

リンク先は
http://www.dayaman.work
でお願いします
プライバシーポリシー お問い合わせ