喋るブログパーツのPHPソース(プログラム)です。PHPで複数のWAVEファイル(wav形式)連結を行っています。
PHPで簡易的な音声合成プログラムを作成したい方はご参考ください。ただし、実行には各文字に対応した音声ファイル(wav形式で100種類以上)が必要になります。
設置、改造はご自由にどうぞ。ただし、自己責任でお願いします。
※下記プログラムソースについて、ホームページ、ブログ、書籍、雑誌等への二次転載は行わないでください。
※下記プログラムソースは実際にサーバー上で動作しているものと若干異なります。


<?php
	
mb_language("ja");
mb_internal_encoding("SJIS");

//音声ワードの取得
$word = $_POST['WORD'];

//音声ワードのエンコード変換
$word = mb_convert_encoding($word,"SJIS","UTF-8");

print '<img src="blank.gif" height="3"><input type="text" name="WORD" size="'.$fsize.'" value="'.$word.'"><br>';
print '<img src="blank.gif" height="3"><input type="submit" value="声を出す"><br>';
print '<img src="blank.gif" height="3"><small>※全角ひらがなで入力。</small><br>';
print '<img src="blank.gif" height="10"><br>';

$yomi = $word; //ひらがな読み

$yomi = mb_convert_kana($yomi,H); //半角カタカナを全角ひらがなに変換
$yomi = mb_convert_kana($yomi,V); //濁点付きの文字を一文字に変換
$yomi = mb_convert_kana($yomi,c); //全角カタカナを全角ひらがなに変換

$wave2 = '';

$yomi_len = mb_strlen($yomi); //読みの文字長さ取得

if ($yomi_len > 100) { //100文字以上は100文字だけ処理
$yomi_len = 100;
}

for ($i = 0; $i < $yomi_len; $i++){
$wave = '';

$moji = mb_substr($yomi, $i, 1); //一文字分取得
$moji2 = mb_substr($yomi,$i, 2); //つぎの一文字分取得

//文字→音声変換
if ($moji == 'あ') {
$wave = file_get_contents("a.wav");
}
if ($moji == 'い') {
$wave = file_get_contents("i.wav");
}
if (($moji == 'う')&&($moji2 != 'うぃ')&&($moji2 != 'うぇ')&&($moji2 != 'うぉ')) {
$wave = file_get_contents("u.wav");
}
if ($moji2 == 'うぃ') {
$wave = file_get_contents("wi.wav");
}
if ($moji2 == 'うぇ') {
$wave = file_get_contents("we.wav");
}
if ($moji2 == 'うぉ') {
$wave = file_get_contents("wo.wav");
}
if ($moji2 == 'ヴぁ') {
$wave = file_get_contents("va.wav");
}
if ($moji2 == 'ヴぃ') {
$wave = file_get_contents("vi.wav");
}
if ($moji2 == 'ヴぇ') {
$wave = file_get_contents("ve.wav");
}
if ($moji2 == 'ヴぉ') {
$wave = file_get_contents("vo.wav");
}
if ($moji == 'え') {
$wave = file_get_contents("e.wav");
}
if ($moji == 'お') {
$wave = file_get_contents("o.wav");
}
if ($moji == 'か') {
$wave = file_get_contents("ka.wav");
}
if (($moji == 'き')&&($moji2 != 'きゃ')&&($moji2 != 'きゅ')&&($moji2 != 'きょ')) {
$wave = file_get_contents("ki.wav");
}
if ($moji2 == 'きゃ') {
$wave = file_get_contents("kya.wav");
}
if ($moji2 == 'きゅ') {
$wave = file_get_contents("kyu.wav");
}
if ($moji2 == 'きょ') {
$wave = file_get_contents("kyo.wav");
}
if ($moji == 'く') {
$wave = file_get_contents("ku.wav");
}
if ($moji == 'け') {
$wave = file_get_contents("ke.wav");
}
if ($moji == 'こ') {
$wave = file_get_contents("ko.wav");
}
if ($moji == 'さ') {
$wave = file_get_contents("sa.wav");
}
if (($moji == 'し')&&($moji2 != 'しゃ')&&($moji2 != 'しゅ')&&($moji2 != 'しょ')&&($moji2 != 'しぇ')) {
$wave = file_get_contents("shi.wav");
}
if ($moji2 == 'しゃ') {
$wave = file_get_contents("sya.wav");
}
if ($moji2 == 'しゅ') {
$wave = file_get_contents("syu.wav");
}
if ($moji2 == 'しょ') {
$wave = file_get_contents("syo.wav");
}
if ($moji2 == 'しぇ') {
$wave = file_get_contents("she.wav");
}
if ($moji == 'す') {
$wave = file_get_contents("su.wav");
}
if ($moji == 'せ') {
$wave = file_get_contents("se.wav");
}
if ($moji == 'そ') {
$wave = file_get_contents("so.wav");
}
if ($moji == 'た') {
$wave = file_get_contents("ta.wav");
}
if (($moji == 'ち')&&($moji2 != 'ちゃ')&&($moji2 != 'ちゅ')&&($moji2 != 'ちょ')&&($moji2 != 'ちぇ')) {
$wave = file_get_contents("chi.wav");
}
if ($moji2 == 'ちゃ') {
$wave = file_get_contents("cha.wav");
}
if ($moji2 == 'ちゅ') {
$wave = file_get_contents("chu.wav");
}
if ($moji2 == 'ちょ') {
$wave = file_get_contents("cho.wav");
}
if ($moji2 == 'ちぇ') {
$wave = file_get_contents("che.wav");
}
if ($moji == 'つ') {
$wave = file_get_contents("tsu.wav");
}
if (($moji == 'て')&&($moji2 != 'てぃ')) {
$wave = file_get_contents("te.wav");
}
if ($moji2 == 'てぃ') {
$wave = file_get_contents("ti.wav");
}
if ($moji == 'と') {
$wave = file_get_contents("to.wav");
}
if ($moji == 'な') {
$wave = file_get_contents("na.wav");
}
if (($moji == 'に')&&($moji2 != 'にゃ')&&($moji2 != 'にゅ')&&($moji2 != 'にょ')) {
$wave = file_get_contents("ni.wav");
}
if ($moji2 == 'にゃ') {
$wave = file_get_contents("nya.wav");
}
if ($moji2 == 'にゅ') {
$wave = file_get_contents("nyu.wav");
}
if ($moji2 == 'にょ') {
$wave = file_get_contents("nyo.wav");
}
if ($moji == 'ぬ') {
$wave = file_get_contents("nu.wav");
}
if ($moji == 'ね') {
$wave = file_get_contents("ne.wav");
}
if ($moji == 'の') {
$wave = file_get_contents("no.wav");
}
if ($moji == 'は') {
$ml1 = mb_substr($yomi,$i-1, 1); //直前の1文字分取得
$ml2 = mb_substr($yomi,$i-2, 1); //2個前の1文字分取得
$ml3 = mb_substr($yomi,$i-3, 1); //3個前の1文字分取得
$ml4 = mb_substr($yomi,$i-4, 1); //4個前の1文字分取得
$mld = $ml2.$ml1; //直前の2文字分
$mlt = $ml3.$ml2.$ml1; //直前の3文字分
$mlq = $ml4.$ml3.$ml2.$ml1; //直前の4文字分
	if (($mld == 'ぼく')||($mld == 'おれ')||($mld == 'きみ')||($mlt == 'わたし')||($mlt == 'なまえ')||($mlt == 'きょう')||($mlt == 'きのう')||($mlt == 'じかん')||($mlt == 'こんち')||($mlq == 'こんにち')||($mlq == 'こんばん')) {
		$wave = file_get_contents("wa.wav");
	} else {
		$wave = file_get_contents("ha.wav");
	}
}
if (($moji == 'ひ')&&($moji2 != 'ひゃ')&&($moji2 != 'ひゅ')&&($moji2 != 'ひょ')) {
$wave = file_get_contents("hi.wav");
}
if ($moji2 == 'ひゃ') {
$wave = file_get_contents("hya.wav");
}
if ($moji2 == 'ひゅ') {
$wave = file_get_contents("hyu.wav");
}
if ($moji2 == 'ひょ') {
$wave = file_get_contents("hyo.wav");
}
if (($moji == 'ふ')&&($moji2 != 'ふぁ')&&($moji2 != 'ふぃ')&&($moji2 != 'ふぇ')&&($moji2 != 'ふぇ')) {
$wave = file_get_contents("fu.wav");
}
if ($moji2 == 'ふぁ') {
$wave = file_get_contents("fa.wav");
}
if ($moji2 == 'ふぃ') {
$wave = file_get_contents("fi.wav");
}
if ($moji2 == 'ふぇ') {
$wave = file_get_contents("fe.wav");
}
if ($moji2 == 'ふぉ') {
$wave = file_get_contents("fo.wav");
}
if ($moji == 'へ') {
$wave = file_get_contents("he.wav");
}
if ($moji == 'ほ') {
$wave = file_get_contents("ho.wav");
}
if ($moji == 'ま') {
$wave = file_get_contents("ma.wav");
}
if (($moji == 'み')&&($moji2 != 'みゃ')&&($moji2 != 'みゅ')&&($moji2 != 'みょ')) {
$wave = file_get_contents("mi.wav");
}
if ($moji2 == 'みゃ') {
$wave = file_get_contents("mya.wav");
}
if ($moji2 == 'みゅ') {
$wave = file_get_contents("myu.wav");
}
if ($moji2 == 'みょ') {
$wave = file_get_contents("myo.wav");
}
if ($moji == 'む') {
$wave = file_get_contents("mu.wav");
}
if ($moji == 'め') {
$wave = file_get_contents("me.wav");
}
if ($moji == 'も') {
$wave = file_get_contents("mo.wav");
}
if ($moji == 'や') {
$wave = file_get_contents("ya.wav");
}
if ($moji == 'ゆ') {
$wave = file_get_contents("yu.wav");
}
if ($moji == 'よ') {
$wave = file_get_contents("yo.wav");
}
if ($moji == 'ら') {
$wave = file_get_contents("ra.wav");
}
if (($moji == 'り')&&($moji2 != 'りゃ')&&($moji2 != 'りゅ')&&($moji2 != 'りょ')) {
$wave = file_get_contents("ri.wav");
}
if ($moji2 == 'りゃ') {
$wave = file_get_contents("rya.wav");
}
if ($moji2 == 'りゅ') {
$wave = file_get_contents("ryu.wav");
}
if ($moji2 == 'りょ') {
$wave = file_get_contents("ryo.wav");
}
if ($moji == 'る') {
$wave = file_get_contents("ru.wav");
}
if ($moji == 'れ') {
$wave = file_get_contents("re.wav");
}
if ($moji == 'ろ') {
$wave = file_get_contents("ro.wav");
}
if ($moji == 'わ') {
$wave = file_get_contents("wa.wav");
}
if ($moji == 'を') {
$wave = file_get_contents("wo.wav");
}
if ($moji == 'ん') {
$wave = file_get_contents("n.wav");
}
if ($moji == 'っ') {
$wave = file_get_contents("ttsu.wav");
}
if ($moji == 'が') {
$wave = file_get_contents("ga.wav");
}
if (($moji == 'ぎ')&&($moji2 != 'ぎゃ')&&($moji2 != 'ぎゅ')&&($moji2 != 'ぎょ')) {
$wave = file_get_contents("gi.wav");
}
if ($moji2 == 'ぎゃ') {
$wave = file_get_contents("gya.wav");
}
if ($moji2 == 'ぎゅ') {
$wave = file_get_contents("gyu.wav");
}
if ($moji2 == 'ぎょ') {
$wave = file_get_contents("gyo.wav");
}
if ($moji == 'ぐ') {
$wave = file_get_contents("gu.wav");
}
if ($moji == 'げ') {
$wave = file_get_contents("ge.wav");
}
if ($moji == 'ご') {
$wave = file_get_contents("go.wav");
}
if ($moji == 'ざ') {
$wave = file_get_contents("za.wav");
}
if (($moji == 'じ')&&($moji2 != 'じゃ')&&($moji2 != 'じゅ')&&($moji2 != 'じょ')&&($moji2 != 'じぇ')) {
$wave = file_get_contents("ji.wav");
}
if ($moji2 == 'じゃ') {
$wave = file_get_contents("ja.wav");
}
if ($moji2 == 'じゅ') {
$wave = file_get_contents("ju.wav");
}
if ($moji2 == 'じょ') {
$wave = file_get_contents("jo.wav");
}
if ($moji2 == 'じぇ') {
$wave = file_get_contents("je.wav");
}
if ($moji == 'ず') {
$wave = file_get_contents("zu.wav");
}
if ($moji == 'ぜ') {
$wave = file_get_contents("ze.wav");
}
if ($moji == 'ぞ') {
$wave = file_get_contents("zo.wav");
}
if ($moji == 'だ') {
$wave = file_get_contents("da.wav");
}
if ($moji == 'ぢ') {
$wave = file_get_contents("ji.wav");
}
if ($moji == 'づ') {
$wave = file_get_contents("zu.wav");
}
if (($moji == 'で')&&($moji2 != 'でぃ')) {
$wave = file_get_contents("de.wav");
}
if ($moji2 == 'でぃ') {
$wave = file_get_contents("di.wav");
}
if ($moji == 'ど') {
$wave = file_get_contents("do.wav");
}
if ($moji == 'ば') {
$wave = file_get_contents("ba.wav");
}
if (($moji == 'び')&&($moji2 != 'びゃ')&&($moji2 != 'びゅ')&&($moji2 != 'びょ')) {
$wave = file_get_contents("bi.wav");
}
if ($moji2 == 'びゃ') {
$wave = file_get_contents("bya.wav");
}
if ($moji2 == 'びゅ') {
$wave = file_get_contents("byu.wav");
}
if ($moji2 == 'びょ') {
$wave = file_get_contents("byo.wav");
}
if ($moji == 'ぶ') {
$wave = file_get_contents("bu.wav");
}
if ($moji == 'べ') {
$wave = file_get_contents("be.wav");
}
if ($moji == 'ぼ') {
$wave = file_get_contents("bo.wav");
}
if ($moji == 'ぱ') {
$wave = file_get_contents("pa.wav");
}
if (($moji == 'ぴ')&&($moji2 != 'ぴゃ')&&($moji2 != 'ぴゅ')&&($moji2 != 'ぴょ')) {
$wave = file_get_contents("pi.wav");
}
if ($moji2 == 'ぴゃ') {
$wave = file_get_contents("pya.wav");
}
if ($moji2 == 'ぴゅ') {
$wave = file_get_contents("pyu.wav");
}
if ($moji2 == 'ぴょ') {
$wave = file_get_contents("pyo.wav");
}
if ($moji == 'ぷ') {
$wave = file_get_contents("pu.wav");
}
if ($moji == 'ぺ') {
$wave = file_get_contents("pe.wav");
}
if ($moji == 'ぽ') {
$wave = file_get_contents("po.wav");
}
if ($moji == '。') {
$wave = file_get_contents("maru.wav");
}
if ($moji == '、') {
$wave = file_get_contents("ten.wav");
}
if ($moji == ' ') {
$wave = file_get_contents("spe.wav");
}
if ($moji == ' ') {
$wave = file_get_contents("spe.wav");
}

if ($moji == 'ゐ') {
$wave = file_get_contents("wi.wav");
}
if ($moji == 'ゑ') {
$wave = file_get_contents("we.wav");
}
if (($moji == 'ー')||($moji == '~')) {
	if (($moji_last == 'あ')||($moji_last == 'か')||($moji_last == 'さ')||($moji_last == 'た')||($moji_last == 'な')||($moji_last == 'は')||($moji_last == 'ま')||($moji_last == 'や')||($moji_last == 'ら')||($moji_last == 'わ')||($moji_last == 'が')||($moji_last == 'ざ')||($moji_last == 'だ')||($moji_last == 'ば')||($moji_last == 'ぱ')||($moji_last == 'ぁ')||($moji_last == 'ゃ')) {
	$wave = file_get_contents("a.wav");
	}
	if (($moji_last == 'い')||($moji_last == 'き')||($moji_last == 'し')||($moji_last == 'ち')||($moji_last == 'に')||($moji_last == 'ひ')||($moji_last == 'み')||($moji_last == 'り')||($moji_last == 'ぎ')||($moji_last == 'じ')||($moji_last == 'ぢ')||($moji_last == 'び')||($moji_last == 'ぴ')||($moji_last == 'ぃ')||($moji_last == 'ゐ')) {
	$wave = file_get_contents("i.wav");
	}
	if (($moji_last == 'う')||($moji_last == 'く')||($moji_last == 'す')||($moji_last == 'つ')||($moji_last == 'ぬ')||($moji_last == 'ふ')||($moji_last == 'む')||($moji_last == 'ゆ')||($moji_last == 'る')||($moji_last == 'ぐ')||($moji_last == 'ず')||($moji_last == 'づ')||($moji_last == 'ぶ')||($moji_last == 'ぷ')||($moji_last == 'ぅ')||($moji_last == 'ゅ')) {
	$wave = file_get_contents("u.wav");
	}
	if (($moji_last == 'え')||($moji_last == 'け')||($moji_last == 'せ')||($moji_last == 'て')||($moji_last == 'ね')||($moji_last == 'へ')||($moji_last == 'め')||($moji_last == 'れ')||($moji_last == 'げ')||($moji_last == 'ぜ')||($moji_last == 'で')||($moji_last == 'べ')||($moji_last == 'ぺ')||($moji_last == 'ぇ')||($moji_last == 'ゑ')) {
	$wave = file_get_contents("e.wav");
	}
	if (($moji_last == 'お')||($moji_last == 'こ')||($moji_last == 'そ')||($moji_last == 'と')||($moji_last == 'の')||($moji_last == 'ほ')||($moji_last == 'も')||($moji_last == 'よ')||($moji_last == 'ろ')||($moji_last == 'を')||($moji_last == 'ご')||($moji_last == 'ぞ')||($moji_last == 'ど')||($moji_last == 'ぼ')||($moji_last == 'ぽ')||($moji_last == 'ぉ')||($moji_last == 'ょ')) {
	$wave = file_get_contents("o.wav");
	}
}
if ($moji == 'ぁ') {
	if (($moji_last == 'あ')||($moji_last == 'か')||($moji_last == 'さ')||($moji_last == 'た')||($moji_last == 'な')||($moji_last == 'は')||($moji_last == 'ま')||($moji_last == 'や')||($moji_last == 'ら')||($moji_last == 'わ')||($moji_last == 'が')||($moji_last == 'ざ')||($moji_last == 'だ')||($moji_last == 'ば')||($moji_last == 'ぱ')||($moji_last == 'ぁ')||($moji_last == 'ゃ')) {
	$wave = file_get_contents("a.wav");
	}
}
if ($moji == 'ぃ') {
	if (($moji_last == 'い')||($moji_last == 'き')||($moji_last == 'し')||($moji_last == 'ち')||($moji_last == 'に')||($moji_last == 'ひ')||($moji_last == 'み')||($moji_last == 'り')||($moji_last == 'ぎ')||($moji_last == 'じ')||($moji_last == 'ぢ')||($moji_last == 'び')||($moji_last == 'ぴ')||($moji_last == 'ぃ')||($moji_last == 'ゐ')) {
	$wave = file_get_contents("i.wav");
	}
}
if ($moji == 'ぅ') {
	if (($moji_last == 'う')||($moji_last == 'く')||($moji_last == 'す')||($moji_last == 'つ')||($moji_last == 'ぬ')||($moji_last == 'ふ')||($moji_last == 'む')||($moji_last == 'ゆ')||($moji_last == 'る')||($moji_last == 'ぐ')||($moji_last == 'ず')||($moji_last == 'づ')||($moji_last == 'ぶ')||($moji_last == 'ぷ')||($moji_last == 'ぅ')||($moji_last == 'ゅ')) {
	$wave = file_get_contents("u.wav");
	}
}
if ($moji == 'ぇ') {
	if (($moji_last == 'え')||($moji_last == 'け')||($moji_last == 'せ')||($moji_last == 'て')||($moji_last == 'ね')||($moji_last == 'へ')||($moji_last == 'め')||($moji_last == 'れ')||($moji_last == 'げ')||($moji_last == 'ぜ')||($moji_last == 'で')||($moji_last == 'べ')||($moji_last == 'ぺ')||($moji_last == 'ぇ')||($moji_last == 'ゑ')) {
	$wave = file_get_contents("e.wav");
	}
}
if ($moji == 'ぉ') {
	if (($moji_last == 'お')||($moji_last == 'こ')||($moji_last == 'そ')||($moji_last == 'と')||($moji_last == 'の')||($moji_last == 'ほ')||($moji_last == 'も')||($moji_last == 'よ')||($moji_last == 'ろ')||($moji_last == 'を')||($moji_last == 'ご')||($moji_last == 'ぞ')||($moji_last == 'ど')||($moji_last == 'ぼ')||($moji_last == 'ぽ')||($moji_last == 'ぉ')||($moji_last == 'ょ')) {
	$wave = file_get_contents("o.wav");
	}
}

$moji_last = $moji;

if ($wave != '') {
	if ($i > 0) {
		$wave = substr_replace($wave,"",0,64); //最初の64文字分(ファイル情報)だけカット
	}
	$wave2 = $wave2.$wave; //音声連結
}

}

//連結文字列の長さ(ファイルサイズ)取得
$leng = strlen($wave2);

//ファイル情報用バイト変換計算(1)
$leng_a = $leng - 8;
$leng_b = $leng_a - 54;

//3桁目
$data3 = (int)($leng_a / 65536);
$leng_a = $leng_a - $data3 * 65536;

//2桁目
$data2 = (int)($leng_a / 256);
$leng_a = $leng_a - $data2 * 256;
//1桁目
$data1 = $leng_a;

$wave2 = substr_replace($wave2,chr($data1),4,1); //ファイルサイズ1桁目置換
$wave2 = substr_replace($wave2,chr($data2),5,1); //ファイルサイズ2桁目置換(x256)
$wave2 = substr_replace($wave2,chr($data3),6,1); //ファイルサイズ3桁目置換(x65536)

//ファイル情報用バイト変換計算(2)

//3桁目
$datb3 = (int)($leng_b / 65536);
$leng_b = $leng_b - $datb3 * 65536;

//2桁目
$datb2 = (int)($leng_b / 256);
$leng_b = $leng_b - $datb2 * 256;
//1桁目
$datb1 = $leng_b;

$wave2 = substr_replace($wave2,chr($datb1),54,1); //ファイルサイズ1桁目置換
$wave2 = substr_replace($wave2,chr($datb2),55,1); //ファイルサイズ2桁目置換(x256)
$wave2 = substr_replace($wave2,chr($datb3),56,1); //ファイルサイズ3桁目置換(x65536)

//ファイル名決定用
//乱数ジェネレーターの初期化 
srand(microtime()*1000000); 

//乱数の発生(1000~9999); 
$rd = rand (1000,9999); 

//今現在のタイムスタンプを取得 
$tims= floor((time() - 1100000000)/60); 

//IDの作成
$id = $tims.$rd;

//ファイル名の定義
$b_file = 'j_voice'.$id.'.wav';

$fp = fopen($b_file,'w');
fwrite($fp,$wave2);
fclose($fp);

//古いファイルの除去処理
//ディレクトリハンドルをオープン 
$res_dir = opendir( '.' ); 

//ディレクトリ内のファイル名を1つずつを取得 
while( $file_name = readdir( $res_dir ) ){ 

//j_voiceの拡張子の名が入ったファイル名のみを表示 
if (mb_eregi("j_voice",$file_name)){ 

//該当IDファイルの更新日時の取得 
$stam = filemtime($file_name); 

//更新から2分以上(120秒)経過したキーファイルは削除
$timnow= time(); 
if (($timnow - $stam) > 120){ 
unlink($file_name); 
} 

}
}

if ($word != '') {

print '
<script language="JavaScript">
<!--
bro = navigator.appName;
if(bro == "Microsoft Internet Explorer") {
document.write("<bgsound src='.$b_file.'>");
} else {
document.write("<embed src='.$b_file.' height=0 width=0 autostart=true loop=false>");
}
//-->
</script>
';

}

?>

ホームに戻る

Copyright (C) 2008 KUNISAN.JP. All Rights Reserved.