凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Open JTalk で作った wav を OpenAL で再生する

はじめに

前回、Open JTalk で wav ファイルを作成するところまで出来ました。今回はそれを OpenAL を使って喋らせてみます。

環境

  • Ubuntu 10.04
  • gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
  • boost 1.48.0
  • Open JTalk version 1.04

OpenAL と alut のバージョンは不明。

OpenALインストール

sudo aptitude install libopenal-dev
sudo aptitude install libalut-dev

コード

talk.cpp
#include <sstream>
#include <cstdlib>
#include <boost/format.hpp>
#include <AL/alut.h>

int main(int argc, char* argv[])
{
	// 出力 wav ファイル名
	const std::string output_wavfile_name = "test.wav";

	// wav を生成
	std::stringstream ss;
	ss << boost::format("./talk %1% %2% %3%")
		% "ハローワールド!"
		% output_wavfile_name
		% "mei_normal"
	;
	system(ss.str().c_str());

	// alutの初期化
	alutInit(&argc, argv);

	// ソースの用意
	ALuint buf, src;
	ALenum state;
	buf = alutCreateBufferFromFile(output_wavfile_name.c_str());
	alGenSources(1, &src);
	alSourcei(src, AL_BUFFER, buf);

	// 再生
	alSourcePlay(src);
	alGetSourcei(src, AL_SOURCE_STATE, &state);
	while (state == AL_PLAYING) {
		alGetSourcei(src, AL_SOURCE_STATE, &state);
	}

	// 後片付け
	alDeleteSources(1, &src);
	alDeleteBuffers(1, &buf);
	alutExit();

	return EXIT_SUCCESS;
}
talk
#!/bin/sh

VOICE=$3
echo $1 | open_jtalk \
-td $VOICE/tree-dur.inf \
-tf $VOICE/tree-lf0.inf \
-tm $VOICE/tree-mgc.inf \
-md $VOICE/dur.pdf \
-mf $VOICE/lf0.pdf \
-mm $VOICE/mgc.pdf \
-df $VOICE/lf0.win1 \
-df $VOICE/lf0.win2 \
-df $VOICE/lf0.win3 \
-dm $VOICE/mgc.win1 \
-dm $VOICE/mgc.win2 \
-dm $VOICE/mgc.win3 \
-ef $VOICE/tree-gv-lf0.inf \
-em $VOICE/tree-gv-mgc.inf \
-cf $VOICE/gv-lf0.pdf \
-cm $VOICE/gv-mgc.pdf \
-k  $VOICE/gv-switch.inf \
-x /usr/lib/open_jtalk/dic/utf-8 \
-s 48000 \
-p 220 \
-a 0.46 \
-u 0.0 \
-jm 0.8 \
-jf 2.0 \
-jl 2.0 \
-z 48000 \
-b 0.5 \
-ow $2 \
-ot out.log

コンパイル

g++ talk.cpp -lalut

結果

無事再生されました。