Hatena::ブログ(Diary)

sdkt4aの日記 このページをアンテナに追加 RSSフィード

2010-06-23 このエントリーを含むブックマーク このエントリーのブックマークコメント

2010-02-23

いつの間にかyoutubeの動画ファイルのダウンロードが楽になってた

以前、youtubeの動画をダウンロードするPHPのスクリプトの例ってのを書いてたんだけど、前はgoogleAPIから取って来てて、なんか仕様変わってたみたいでURL取れなくなってた。

調べてみると、今はもっと簡単に動画ファイルのURLが取れるようになってるというか、フツーに動画を見るページのHTMLの中にURLが書いてあったのでちょこちょこっとphpすればいいだけみたい。

ってことで、動画のページにアクセスしてそのHTMLの中から動画ファイルのURLを持ってくるPHPスクリプトの例を書いてみたよ。

$ cat test.php 
<?php
$url = "http://www.youtube.com/watch?v=2N1XGtYXPrc";
$html = file_get_contents($url);
preg_match('#"fmt_url_map": "(.*?)",#', $html, $match);
$fmt_urls = split(",", urldecode($match[1]));
foreach($fmt_urls as $fmt_url){
        $t = split("\|", $fmt_url);  
        $fmt = $t[0];
        $url = $t[1];
        echo "$fmt : $url\n";
}
?>
$ php test.php 
34 : http://v15.lscache5.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor&fexp=903103%2C904704&algorithm=throttle-factor&itag=34&ipbits=0&burst=40&sver=3&expire=1266948000&key=yt1&signature=3F82D7DE305A4678E96DA859914165CCECF0CF98.7B738D97CEF4445AB8505A49DB56D1D6D13C39DF&factor=1.25&id=d8dd571ad6173eb7
5 : http://v23.lscache1.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor&fexp=903103%2C904704&algorithm=throttle-factor&itag=5&ipbits=0&burst=40&sver=3&expire=1266948000&key=yt1&signature=06FFEAFE03A9B7F403CB23AE44545357303000D8.D19916967550EB1EE883653EE7A90AB312D8F4F1&factor=1.25&id=d8dd571ad6173eb7

2010-02-19

画像に「!?」をつけて遊ぶWEBサービス作ったよ!

f:id:sdkt4a:20100219132850p:image

作ったサイト↓

「!?」画像ジェネレーター

作ろうと思った

いつものようにはてブホットエントリーを開いて「あとで読む」タグをつける簡単なお仕事をしていたら、ASCII.jp:40分で覚える!jQuery速習講座ってのがあって、サブタイトルに”「あとで」読まずに今すぐ始める”とか書いてある訳で、「40分で覚えれるわけねーだろwwww」とか思って仕方なく実際にやって見ると意外にほいほい出来て楽しかった。

んで、カジ速Full Auto:画像に「!?」をつけて遊ぼうぜが面白かったのを思い出して、jquery使えばページ移動無しに画像に「!?」つけれるWEBサービスが簡単に作れるんじゃね?って事で、画像に「!?」つけた画像を作るジェネレータ、もしくは「!?」画像メーカーぽいの作ったよ。画像に「!?」をつけて遊ぶWEBサービスってことだけど、誰得なのかよくからん。



開発環境

いつもと同じように、windowsからpoderosadebianサーバーsshして入ってscreenで複数窓開いてvimして作ってる。

開発言語はPHPで、ちょこっとだけjquery使ってjavascriptDBmysqlテンプレートエンジンはsmarty

画像の取得はfile_get_contentsとかで適当実装で、文字の合成とかサムネ作成はGDさん。

開発中に飲んだ飲み物はホットコーヒー

PHPGDで文字を合成する

参考にしたサイトは、「php gd 文字」でググって出てきた以下のサイト。

離れPHP島

GDで入力された文字列を画像で出力 - PHP入門(GD編 2) - イクケン

PHPで画像にGD使って文字を合成するにはimagettftext関数をつけばいいらしい。

例にならって、フォントM+ WEB FONTSを使ってみた。

$font = "./mplus-2p-bold.ttf"; // フォントファイル
$image = @imagecreatefromjpeg("./test.jpg"); // ./test.jpgを読み込む

// フォントサイズが$font_sizeで、角度が0で、$fontを使用して、
// $textを表示する画像を作った場合の縦横の座標を取得する。
$r = imagettfbbox($font_size, 0, $font, $text); 
$width = ($r[2] - $r[0]);
$height = ($r[3] - $r[7]);
$col = ImageColorAllocate($image, $red, $green, $blue); // RGBで色を作る
// $imageの($x - $width/2), ($y + $height/2)なところに、
// フォントが$fontでフォントサイズが$font_sizeで色が$colで
// 文字の角度が0な$textって文字を合成
ImageTTFText($image, $font_size, 0, ($x - $width/2), ($y + $height/2) , $col, $font, $text);

// jpeg出力
header("Content-type: image/jpeg");
Imagejpeg($image);

PHPGDで画像のサムネイルを作る

参考にしたのは、「php gd サムネ」でググって出てきた以下のサイト。

【PHP】GDライブラリを使って画像のサムネイルを作成する。

サムネは縦横が128px以下にしたかったので、縦横のサイズの大き方を基準にして圧縮比を求めるようにした。

// make thumb
$width = ImageSX($image); //横幅(ピクセル)
$height = ImageSY($image); //縦幅(ピクセル)
if($width > $height){
    $new_width = 128;
    $rate = $new_width / $width; //圧縮比
    $new_height = $rate * $height;
} else {
    $new_height = 128;
    $rate = $new_height / $height; //圧縮比
    $new_width = $rate * $width;
}
$thumb = ImageCreateTrueColor($new_width, $new_height);
ImageCopyResampled($thumb,$image,0,0,0,0,$new_width,$new_height,$width,$height);
$save_filename = ".thumb.jpg";
Imagejpeg($thumb, "$save_filename");

マウスが画像をクリックした時の、マウスの画像上の座標を取得する

検索キーワード忘れたけど、ググったら出てきたサイトを参考にした。

jQueryを利用してwebページ要素内の座標を得る方法

やっぱりjquery使うと便利らしい。

例えば、↓みたいなHTMLがあった場合に、クリックした画像上の座標を取得するには、

<img id="preview_img "src="test.jpg">

↓みたいにjavascript書いておけばいいみたい。 Math.roundしてるのは、ブラウザの環境なのかよくわかんないけど、なぜか座標に小数が含まれていたので、四捨五入するため。

$("#preview_img").click(function(e){
    var x = e.pageX - $('#preview_img').position().left;
    var y = e.pageY - $('#preview_img').position().top;
    x = Math.round(x);
    y = Math.round(y);
    alert("x=" + x + "y=" + y);
});

今回作った「!?」画像ジェネレーターで実際にどうやってるかは、http://sdkt.info/bikkuri/bikkuri.jsがソースなので、それを参考に。

私的まとめ

  • jqueryはいろいろHTMLDOM?)を弄れるので面白い。
  • html+css+javascript凄い。
  • phpで画像に文字入れたり、画像のサムネイルを作ったりする時はgdが簡単かも。
  • mysqlクエリにはmysql_real_escape_stringしまくろう。
  • smarty変数出力するときも|escapeしまくろう。
  • ファイル名をつけるときに、適当にmd5ハッシュを使うのは楽だけど、URLが長くなるのはどうしたものか。

2010-02-11

LM358でオーディオミキサー作ったら音割れし過ぎた

f:id:sdkt4a:20100211153423p:image

PCとかラジオとかテレビとかいろいろ配線あって、それをまとめてヘッドホンで聞きたかったので、入力4つをまとめるオーディオミキサーを自作してみた。入力側の個別の音量調整はなし(入力機器側で調整する)で、出力側にボリューム調整できるようにした。入力側にもそれつけようとしたら入力系等分だけ可変抵抗要るので、適当に安く作るのが難しいくなるので。

参考にしたサイトは↓。

オーディオミキサーの製作

携帯型ヘッドホンオーディオミキサー:Nayutaの雑談

オーディオミキーサーのキットとかもWEBを探せばあるけど、とりあえず安く作ろうと思ってオペアンプとかコンデンサは汎用品。超安い。だいたい1500円ちょいで作れた。

とりあえず、マルツパーツ館博多千代店で買ったもの。

  • 赤い線 1m @21 x1 \21
  • 黒い線 1m @21 x1 \21
  • オペアンプLM358(2回路入り) @63 x2 \126
  • ステレオジャック @73 x5 \365
  • DCジャック @84 x1 \84
  • 2連式ボリューム 50kΩ Aカーブ @157 x1 \157
  • 電解コンデンサ 10uF @42 x5 \210
  • 積層セラミックコンデンサ 0.1uF @21 x4 \84
  • ICソケット8pin(2個入り) @115 x1 \115
  • スイッチ @115 x1 \115
  • 抵抗 22kΩ @5 x10 \50
  • 抵抗アレイ 4抵抗 22kΩ @52 x2 \104

回路図は、↓こんな感じ。

f:id:sdkt4a:20100211153422p:image

↑これが、ステレオの片方の回路なので、同じやつを2回路作らないといけない。

左側が加算演算で音をまぜまぜする回路。右側が音量を調整する回路。

LM358の4ピンはGNDで8ピンはVccに接続。

適当に家にあった基板で組み立てて完成。

ケースはダイソーで適当なやつ見つけてそれに入れた。 

音質とかどうでも良いよねって思ってLM358でオーディオミキサー作ったら、音割れし過ぎてワロタ

せめて、LM358とピン配置の互換がある、ちょこっと高いNE5532P(\73)とか少し高いNE5532AP(\378)とか使ってたら音割れひどくなかったかも。出来れば負電源とかも作ってやるといいかも。

あと、なんかラジオが聞こえる。超受信してる。アルミホイルぐるぐる巻きすれば大丈夫そう。試してないけど。

2010-02-10

wine使ってlinuxでゆっくりボイス

wineすごい。↓こんなこともできるなんて。

Wineでもゆっくりしていってね!!! - ⊥=⊥



ってことで、AquesTalkはひらがなしか受け付けないみたいなので、mecabに投げたりして漢字をひらがなにしたうえで、AquesTalkに渡すphp書いた。といってもphpからshellで呼んでるだけなので超適当。

 


debianlennyだと、↓こんな流れで準備。


# aptitude install mecab
# aptitude install mingw32

$ mkdir yukkuri_test
$ cd yukkuri_test


$ wget http://www.a-quest.com/download/package/aqtk20090609.zip
$ unzip aqtk20090609.zip
$ cp AquesTalk?/lib/AquesTalk.lib .
$ cp AquesTalk?/inc/AquesTalk.h .
$ cp AquesTalk?/bin/AquesTalk.dll .

$ ls
AquesTalk AquesTalk.dll AquesTalk.h AquesTalk.lib aqtk20090609.zip

$ vi main.c

$ i586-mingw32msvc-gcc main.c AquesTalk.lib -o aqwrap.exe

$ echo "わいんでも、ゆっくりしていってね。"|nkf -s > test

$ wine aqwrap.exe test x.wav 80

$ ls
AquesTalk AquesTalk.dll AquesTalk.h AquesTalk.lib aqtk20090609.zip aqwrap.exe main.c test x.wav

↓これが標準入力から与えられた文章をゆっくりボイスにするphp 変数名とか超適当。

  test.php
  1 <?php
  2 
  3 $str = file_get_contents("php://stdin");
  4 
  5 $str = mecabru($str);
  6 
  7 $id = "test";
  8 $speed = 100;
  9 yukkuri($str, $id, $speed);
 10 mkmp3($id)
 11 
 12 
 13 exit;
 14 
 15 function mecabru($str){
 16     $str = str_replace("'", "", $str);
 17     $result =  `echo '$str'|/usr/bin/mecab|awk  '/[^EOS]$/ {print $1"\t"$2}'`;
 18     $l = preg_split("#\n#", $result, -1, PREG_SPLIT_NO_EMPTY);
 19     $r = "";
 20     foreach($l as $a){
 21         $t = preg_split("#\t#", $a, -1, PREG_SPLIT_NO_EMPTY);
 22         $s = preg_split("#,#", $t[1], -1, PREG_SPLIT_NO_EMPTY);
 23         
 24         if(!isset($s[8]) || strcmp($s[8],"*")==0){
 25             $c = $t[0];
 26         } else {
 27             $c = $s[8];
 28         }
 29         $r .= $c;
 30     }
 31     return $r;
 32 }
 33 
 34 function yukkuri($str, $id, $speed){                                            
 35     $alpha = array("a", "b", "c", "d", "e", "f", "g",                           
 36                     "h", "i", "j", "k", "l", "m", "n", "o",
 37                     "p", "q", "r", "s", "t", "u", "v", "w",
 38                     "x", "y", "z");
 39     $hira = array("えー","びー","しー","でー","いー","えふ","じー",
 40                 "えいち","あい","じぇい","けい","える","えむ","えぬ","おー",
 41                 "ぴー","きゅー","あーる", "えす","てー","ゆー","ぶい","だぶる",
 42                 "えっくす","わい","ぜっと");
 43     $komoji = array("","","","","");
 44     $oomoji = array("","","","","");
 45     $str = mb_convert_kana($str, "KVa");
 46     $str = mb_convert_kana($str, "c");
 47     $str = mb_ereg_replace("", "", $str, "utf-8");
 48     $str = strtolower($str);
 49     $str = str_replace($alpha, $hira, $str);
 50     $str = str_replace($komoji, $oomoji, $str);
 51 
 52     $str = mb_ereg_replace("[^ぁ-んー、。]", "", $str);
 53     aqwrap($str, $id, $speed);
 54 }
 55 
 56 function aqwrap($str, $id, $speed){
 57     $str = str_replace("'", "", $str);
 58     `echo '$str'|nkf -s >$id.txt`; //s-jis
 59     `wine aqwrap.exe $id.txt $id.wav $speed`;
 60 }
 61 
 62 function mkmp3($id){ //wav->mp3
 63     `/usr/bin/ffmpeg -y -ab 128k -ar 16000  -i $id.wav $id.mp3 &>/dev/null`;
 64 }
 65 ?>

↓こんな感じで、実行すると1秒くらいで、test.wavとかtest.mp3とかが出来る。

$ echo にゃんにゃん|php test.php 

ちなみに、別にどうでもいいけど、フツーに読み上げるだけなので、SoftTalkとはアクセントが違ったりする。

twitterタイムラインとかを取ってきて、↑を通してmp3作って、mpg123とかで再生すれば、twitterのゆっくりボイス化が出来るハズ。