トマトが「リンゴじゃない。でもフルーツだ」と主張するシュールなアニメがすごい
何気なくプライムビデオ見ていたらとんでもないものを見つけてしまいました。
オレンジがトマトに「Hey Apple!!」としつこく話しかけて、トマトがその度にリンゴじゃないと言い返しています。
トマトが「確かに自分はリンゴのようなフルーツだけどリンゴではない」と返したら「Your Vegetable!!」と言われ、
「よくある誤解だ」と自分がフルーツである説明をしようとしたら「お前は種を飛ばせるのか」と言われて口から吐き出した種をぶつけられます。
終始馬鹿にし続けられたトマトは後半でミキサーにかけられてしまいます。
トマトジュースにでもなるのかと思ったら…オチはご自身でご覧ください。
※トマトが野菜か果物かについてはリンクを置いとくだけにします。
アニメの内容としてはオレンジが主人公?らしく、トマトの他にはリンゴ、マンゴー、レモンなどがオレンジに馬鹿にされています。
自分が最初に見たのはプライムビデオでしたが、公式のYoutubeチャンネルもあるようで、プライムに登録しなくてもたぶんそちらで全部見れるのではないでしょうか。
日本語字幕はないですが簡単な英語だし動画も2〜3分なので割りと気軽に見ることができます。
トマト以外に個人的に面白かったのはオレンジvsオレンジです。
野菜やフルーツ以外にはハンバーガーやスーパーボウルなどがあります。
ハンバーガーはトマトやチーズなど複数の素材が使われているためにモンスター扱いされて銃を乱射されています。
あとはなぜかゲーム実況もあって Minecraft をやったり…
マリオランもやってます。
こんな感じでかなり多様な動画がアップされているので自分のお好みのエピソードを探してはいかがでしょうか。
ちなみに、子どもの英語教材には下品過ぎて使えないと思います。
トランプさんの自動翻訳サイトを作りました
何かと物議をかもしているあの方のツイートを機械翻訳して更新するサイトを作りました。
主に以下のサービスを利用しております。
Twitter アカウントも用意してるのですが、自動投稿が悪いのかスパム報告されるのか、開発中に何度もアカウントロックされました。
継続したいので寛容にお願いします、Twitter さん。
realDonaldTrump: @Samsung、ありがとう!我々 はあなたが大好き! https://t.co/PRo3Fs4y45 https://t.co/QfxM6YfA3q
— ドナルド・トランプ日本語訳 (@TrumpJPN) 2017年2月3日
高校生が運用しているらしい @DonaldTrumpJPN との違いとしては主に以下の5点があります。
1. 過去発言を検索できる
大統領就任後から現在に至るまでのツイートから検索することができます。
リツイートは翻訳対象に入れていないので無駄なノイズもなく検索できます。
日本語でも検索できますが、検索結果として表示される数と実際に表示される件数が違うという問題が発生しています。
Tumblr の仕様なのかテーマの問題なのかは調査中です。
2. 副大統領もいます
大統領ご本人のアカウントだけなく、@WhiteHouse と @POTUS 、 @VP も翻訳対象に入れています。
投稿を見ている限り、前者の2つもご本人が更新されているようです。
今後は報道官も必要かなぁと考えています。
3. 深夜でもリアルタイムで更新
日本とアメリカ西海岸(NY)の時差は14時間です。
向こうで午前9時のときに日本では夜の23時なので、機械にお任せすると人は幸せになります。
最初は本当にリアルタイムを目指して1分ごとにチェックしていたのですが、
主に副大統領がツイートを削除して同じような内容を再投稿することが何度もあり、今は10分ごとにチェックしています。
他国のことながら投稿前にチェックする人はいないのだろうかと心配しております。
4. 機械翻訳だから中立
開発中にこんなツイートを見かけました。
トランプ語法をめぐる、世界の翻訳者の苦悩。「そのまま訳せば、理解しがたい。訳者が整えてしまうと、普通の政治家みたいに誤認させる」と仏語訳者。「矛盾だらけなので、翻訳がおかしいと疑われる」と独語訳者。https://t.co/mKOfpJeSUY
— 和田浩明/Hiroaki Wada (@spearsden) 2017年1月27日
大統領のツイートは文法がおかしいことが多々あるので、正しく翻訳するにはどういう背景なのかを汲み取る必要があります。
つまりはどうしても翻訳者の意図が入ってしまうわけです。
好きか嫌いか、右よりか左よりかでも変わってくると思います。
その点、機械は感情も政治的思想もありません。
ただ与えられた英語を訳すだけです。
その訳が正しいかはさておき、最も中立的な立場での翻訳になるのではないでしょうか。
5. 翻訳の精度が低い
実際に作ってみて衝撃を受けました。
想像していた以上に翻訳の精度が低かったです。
(星になったらあかん。)
realDonaldTrump: おめでとうレックスティラーソン状態の私たちの新長官に就任されています。彼は星になります! https://t.co/33kwcBL1Cs https://t.co/b0I8JXcuyN
— ドナルド・トランプ日本語訳 (@TrumpJPN) 2017年2月3日
翻訳には Microsoft の 翻訳 API を使っています。
文法が整っておらずスラングを多用する英文は機械翻訳が苦手とするところなので、
Twitter と機械翻訳はかなり相性が悪いものと言えます。
実用的な精度を求めるなら、Google 翻訳 を使わないと無理だなーという印象です。
開発中に Ring を開発したメーカーの新商品の動画を見ましたが、精度は大丈夫なのでしょうか。
逆に文法が整っていてスラングの少ない英文書籍の翻訳は機械が得意とするものだと思います。
まとめ
作った経緯の一つとして、コア部分に Google Apps Script を用いてどれだけのものを作れるかという実験的な意味がありました。
精度に納得のいかない部分はありますが、その点においては目的を果たせたと考えています。
それなりに楽しんで作ることができたので、モチベーションを維持し続けることもできました。
President が自動翻訳したら毎回社長になるのウケる
— inamura (@ina6ra) 2017年1月30日
他で使えるかわからない無駄な知識が増えたので、それはおいおい公開してこうと思います。
最後に、お世話になったライブラリのリンクなどをまとめておきます。
- GitHub - googlesamples/apps-script-oauth1
- objDB - Google Script Libraries
- underscoreGS - Google Apps Script Examples
- Query Language Reference (Version 0.7) | Charts | Google Developers
- 正規表現チェッカー PHP: preg_match() / JavaScript: match()
- POST statuses/update — Twitter Developers
- POST statuses/update - ツイートを投稿する
- GET statuses/oembed — Twitter Developers
- The Search API — Twitter Developers
- JavaScriptでURIエンコード(URLエンコード)を行う|プログラムメモ
- API | Tumblr
- Creating a custom HTML theme | Tumblr
- Tumblr API call or request limits - Stack Overflow
- IFTTT Maker ChannelでWebhook送受信ができるようになった。 - ワタナベ書店
- Google Apps ScriptにてPOSTで受け取って書き込む | eye4brain
- google apps script - Handle 404 errors in UrlFetchApp.fetch() - Stack Overflow
Youtube API で動画を検索して再生時間も取得する方法
前ブログからの引き継ぎと加筆。
本題
検索と再生時間の取得を一発でしたかったけど、それはできない模様。
詳細は以下のリンク。
検索のAPIと動画の詳細情報を取得するAPIが異なるため、
最低でも検索+詳細取得の2回、APIを呼び出す必要がある。
以下、GASでのサンプルコード。
function myYoutubeDuration() { var url = 'https://www.googleapis.com/youtube/v3/search'; var token = 'APIKey'; url += '?key='+token; url += '&q=ppap'; url += '&part=id'; url += '&type=video'; var json = ''; var vid = []; json = UrlFetchApp.fetch(url); json = JSON.parse(json.getContentText()); json.items.forEach(function(item) { vid.push(item.id.videoId); }); url = 'https://www.googleapis.com/youtube/v3/videos'; url += '?key='+token; url += '&part=snippet,contentDetails'; url += '&id='+vid.join(','); json = UrlFetchApp.fetch(url); json = JSON.parse(json.getContentText()); json.items.forEach(function(item) { Logger.log(item.snippet.title); Logger.log(item.id); Logger.log(item.contentDetails.duration); }); }