2009年01月11日
翻訳機(リンデンスクリプト Tips)
今回は、翻訳機のスクリプトをご紹介します。 チャットに英文を入力するとオブジェクト上に翻訳結果をフローティングテキストで表示します。 翻訳部分には、yahoo pipe のサービスを利用しています。 yahoo pipeのサービスについては、こちらの記事を参照ください。
「スクリプト内容」「使用方法」 1. オブジェクトを1つ作成します。(球でもボックスでも何でも構いません。) 2. オブジェクトにスクリプトをドラッグします。 3. チャットに英文を入力して下さい。 4. オブジェクト上に日本文が表示されます。 「スクリプトの説明」 流れとしては、listenコマンドでチャット入力を監視して、入力があると入力値をキーワードとした yahoo pipeのURLを作成し、結果をフローティングテキストで表示します。 このスクリプトのポイントは、llHTTPRequestコマンドとhttp_responseイベントです。 llHTTPRequestコマンドは、HTTPリクエストを発行するコマンドで、HTTP(HyperText Transfer Protocol) を使用して、webサーバに対してデータを送信するコマンドです。 データの送信には、POST及びGETを指定可能です。 http_responseコマンドは、HTTPレスポンスを受信するコマンドで、HTTP(HyperText Transfer Protocol) を使用してwebサーバからデータを受信します。 HTTPの仕組みについては、ググればいろいろと情報があるのでそちらを参考下さい(^^ゞ LSLでは、データを保存する仕組みがないので、外部にデータベースサーバを設置してこのコマンドを 使用して、データのやり取りに使用したりします。LSLで大規模なシステムを作ろうとした場合、必須と なるコマンドなので覚えておくと良いと思いますw 今回のスクリプトでは、GETを使用して、チャットで入力された英文をyahoo pipeのサービスに渡します。 GETでは、渡したいデータをパラメータとしてURLの中に含ませる形になります。 listen(integer ch, string name, key id, string message) { list l=llParseString2List(message, [" "], []); string keyword=llDumpList2String(l,"+"); // スペースを+に変換 string httpURL=pipeURL+"&_render=html&textinput="+keyword; // URLを作成 http_req=llHTTPRequest(httpURL,[HTTP_METHOD,"GET"],""); // HTTPリクエストを発行 } チャットに英文が入力されるとlistenイベントが発生します。リッスンイベント内では、入力された キーワードを元にyahoo pipe用のURLを作成し、HTTPリクエストを発行します。 ○スクリプト内で作成するyahoo pipe のURL(入力キーワードがhello worldの場合) http://pipes.yahoo.com/pipes/pipe.run?_id=9eaba5df32f74ca92f5cfcc33ddd0d05&_render=html&textinput=hello+world * helloとworldの間のスペースは、プラス記号(+)に変換します。(決まりだと考えてくださいw) このURLには、2つのキーワードがあります。_renderとtextinputです。_renderは、リクエストの 結果のフォーマットを指定します。_render=htmlとなっているので結果はhtmlで返されることに なります。html以外にもcsv(CSV形式),rss(RSS形式)があるようです。 textinputは、サーバに渡すキーワードを指定するパラメータです。textinput=hello+worldとなって いるので"hello+world"というキーワードがサーバに渡されることになります。textinputは、yahoo pipeで、 私が作成したパイプに配置したTextinputという部品の名前になります。 // データ受信部分 http_response(key request_id, integer status, list metadata, string body) { if (request_id == http_req) { list l=llParseString2List(body, ["<p>"], []); list l2=llParseString2List(llList2String(l,1), ["</p>"], []); string output=llList2String(l2,0); llSetText(output,<1,1,1>,1); } } llHTTPRequestコマンドでリクエストした結果は、http_responseイベントで受け取ります。 リクエストのパラメータで、_renderにhtmlを指定したので結果は、html形式で返ります。 返される値は、http_responseイベントのbodyパラメータにセットされます。 bodyパラメータには、下記のデータが格納されます。 * 入力キーワードがhello worldの場合 <UL class=htmlresults><LI><H4>Untitled</H4><!--BODY--><p>こんにちは世界</p></LI></UL> <!-- fe2.pipes.re3.yahoo.com compressed Sun Jan 11 03:39:46 PST 2009 --> この中で、翻訳された部分は、<p>と</p>に挟まれた"こんにちは世界"という部分になります。 あとは、リスト関数のllParseString2ListとllList2Stringを使用して、"こんにちは世界"の 部分を抜き出して、llSetTextでフローティングテキストで表示します。 [参考] llHTTPRequest http_response llParseString2List llDumpList2String llSetText リンデンスクリプト Tips Indexへ// // SHOP ZERO Tips37 Translation v1.0 // // Created by Zero2000 Kid 2009/01/11 // integer handle; key http_req; string pipeURL="http://pipes.yahoo.com/pipes/pipe.run?_id=9eaba5df32f74ca92f5cfcc33ddd0d05"; default { state_entry() { handle = llListen(0,"",NULL_KEY,""); } listen(integer ch, string name, key id, string message) { list l=llParseString2List(message, [" "], []); string keyword=llDumpList2String(l,"+"); string httpURL=pipeURL+"&_render=html&textinput="+keyword; http_req=llHTTPRequest(httpURL,[HTTP_METHOD,"GET"],""); } http_response(key request_id, integer status, list metadata, string body) { if (request_id == http_req) { list l=llParseString2List(body, ["<p>"], []); list l2=llParseString2List(llList2String(l,1), ["</p>"], []); string output=llList2String(l2,0); llSetText(output,<1,1,1>,1); } } }
サウンド再生スクリプト(リンデンスクリプト Tips)
カメラコントロール(リンデンスクリプト Tips)
標準時間表示スクリプト(リンデンスクリプト Tips)
プリムカウンター2(リンデンスクリプト Tips)
土地情報チェッカー(リンデンスクリプト Tips)
SIM負荷チェッカー(リンデンスクリプト Tips)
カメラコントロール(リンデンスクリプト Tips)
標準時間表示スクリプト(リンデンスクリプト Tips)
プリムカウンター2(リンデンスクリプト Tips)
土地情報チェッカー(リンデンスクリプト Tips)
SIM負荷チェッカー(リンデンスクリプト Tips)
Posted by Zero2000 Kidd at 22:46│Comments(4)
│リンデンスクリプトTips
この記事へのコメント
さっそく、翻訳機を試用してみました。で、気がついたことを書きます。文章をフローティングテキストにすると、電光掲示板同様、長文になった場合に弊害が出てきます。これ、普通にチャット画面に発言させるようには出来ないのでしょうか?
Posted by たまちゃん at 2009年01月17日 07:45
たまちゃんさんへ
こんにちは。
いつも貴重なご意見ありがとうございます。
チャットに表示させたい場合は、以下の行を変更すれば可能です。
llSetText(output,<1,1,1>,1);
↓
llOwnerSay(output);
この場合、翻訳機のオーナーのチャット画面上のみに翻訳結果が表示されますので、
他の方の迷惑にもならないので良いかもですw
こんにちは。
いつも貴重なご意見ありがとうございます。
チャットに表示させたい場合は、以下の行を変更すれば可能です。
llSetText(output,<1,1,1>,1);
↓
llOwnerSay(output);
この場合、翻訳機のオーナーのチャット画面上のみに翻訳結果が表示されますので、
他の方の迷惑にもならないので良いかもですw
Posted by Zero2000 Kidd at 2009年02月02日 18:25
こんばんは、自分はペットにこちらのスクリプトを組み込んだんですが
外人のアバター同士の喧嘩まで勝手に訳し始めて、かなりきまずかったとです;
タッチかリッスンで動作させることはできませんか?
外人のアバター同士の喧嘩まで勝手に訳し始めて、かなりきまずかったとです;
タッチかリッスンで動作させることはできませんか?
Posted by Tさん at 2009年02月12日 06:10
こんにちは。
この翻訳機は日本語を英語に訳す事は出来ないのでしょうか?
この翻訳機は日本語を英語に訳す事は出来ないのでしょうか?
Posted by 匿名希望 at 2010年10月12日 14:04