ソラマメブログ
< 2025年01月 >
S M T W T F S
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

2009年01月11日

翻訳機(リンデンスクリプト Tips)

今回は、翻訳機のスクリプトをご紹介します。
チャットに英文を入力するとオブジェクト上に翻訳結果をフローティングテキストで表示します。
翻訳部分には、yahoo pipe のサービスを利用しています。
yahoo pipeのサービスについては、こちらの記事を参照ください。

翻訳機(リンデンスクリプト Tips)

「スクリプト内容」
//
//    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);
        }
    }
 
}
 
「使用方法」 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へ



同じカテゴリー(リンデンスクリプトTips)の記事画像
サウンド再生スクリプト(リンデンスクリプト Tips)
カメラコントロール(リンデンスクリプト Tips)
標準時間表示スクリプト(リンデンスクリプト Tips)
プリムカウンター2(リンデンスクリプト Tips)
土地情報チェッカー(リンデンスクリプト Tips)
SIM負荷チェッカー(リンデンスクリプト Tips)
同じカテゴリー(リンデンスクリプトTips)の記事
 サウンド再生スクリプト(リンデンスクリプト Tips) (2009-12-16 20:13)
 カメラコントロール(リンデンスクリプト Tips) (2009-11-21 21:26)
 標準時間表示スクリプト(リンデンスクリプト Tips) (2009-11-02 00:34)
 プリムカウンター2(リンデンスクリプト Tips) (2009-10-12 20:40)
 土地情報チェッカー(リンデンスクリプト Tips) (2009-10-11 21:33)
 SIM負荷チェッカー(リンデンスクリプト Tips) (2009-08-09 20:26)
この記事へのコメント
さっそく、翻訳機を試用してみました。で、気がついたことを書きます。文章をフローティングテキストにすると、電光掲示板同様、長文になった場合に弊害が出てきます。これ、普通にチャット画面に発言させるようには出来ないのでしょうか?
Posted by たまちゃん at 2009年01月17日 07:45
たまちゃんさんへ

こんにちは。
いつも貴重なご意見ありがとうございます。
チャットに表示させたい場合は、以下の行を変更すれば可能です。

llSetText(output,<1,1,1>,1);

llOwnerSay(output);

この場合、翻訳機のオーナーのチャット画面上のみに翻訳結果が表示されますので、
他の方の迷惑にもならないので良いかもですw
Posted by Zero2000 KiddZero2000 Kidd at 2009年02月02日 18:25
こんばんは、自分はペットにこちらのスクリプトを組み込んだんですが
外人のアバター同士の喧嘩まで勝手に訳し始めて、かなりきまずかったとです;
タッチかリッスンで動作させることはできませんか?
Posted by Tさん at 2009年02月12日 06:10
こんにちは。
この翻訳機は日本語を英語に訳す事は出来ないのでしょうか?
Posted by 匿名希望 at 2010年10月12日 14:04
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。