
過去ログ 15
過去ログは下にいくほど新しい記事となっております。
※注意:このサイトにあるプログラムのソースコードや、その他の情報はすべて無保証です。やばいと思ったら実行しないでください。コンパイル、実行などによって生じた損害に対する責任は負いませんので、ご了承ください。
AquesTalk2で遊んでみた
12-4-2010
他のOS用はどうなっているのか知らないけど、Linux用では、ライブラリとサンプルプログラムのソースが入っていた。ライブラリはそのままlibフォルダにコピーしろと書いてあったので、その通りにして、とりあえずサンプルソースをコンパイルして動かしてみることに。
ところがサンプルプログラムが最初エラーになったので、なんでかなと思ったら指定エンコードがEUC-JPになっていた。Ubuntu9.10はUTF-8だから、サンプルソースを変えなきゃ。
エンコードを直したら普通に音声合成できた。これは面白い。
デフォルト以外の声(テトとかゆっくりとか)もchar固定配列を用意してphontファイルをfopen()、fread()で読み込んで関数に渡してやったら簡単に声が変えられた。これは面白い。感動した。
※メール、リンクは適当に。
昨日のつづき
13-4-2010
面白いものはついついいじってみたくなっちゃう。
簡単に作ってみた、いい加減なプログラム。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
int main(){
char c[1024];
pid_t pid = 0;
int status;
for(;;){
memset(c, 0x00, sizeof(c));
fgets(c, sizeof(c), stdin);
if(c[0] == 0x00 || c[0] == '\n' || c[0] == '\r'){
break;
}
else {
pid = fork();
if(pid > 0){
wait(&status);
}
else {
execlp("./call.sh", "./call.sh", c, NULL);
}
}
}
return 0;
}
エンター押せば終了。文字を入力すればそれをcall.shに渡すというプログラム。
call.shはこのようなもの。
#!/bin/sh echo $1 | ./SampleTalk > test.wav mplayer test.wav
サンプルそのままですね。
call.shでサンプルプログラムとmplayerを呼び出すつくりだが、スクリプトで呼び出すプログラムが違えばまったく別のプログラムになるので、汎用性があるともいえる・・・。
次回はもうちょっとまともなものを考えられたらいいな。
---
※メール、リンクは適当に。
まあ、こうなるかな
14-4-2010
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <sys/wait.h>
#include <unistd.h>
GtkWidget *entry;
GtkWidget *window;
gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer user_data){
const gchar* text;
int status;
if(event->keyval == GDK_Return){
text = gtk_entry_get_text(GTK_ENTRY(entry));
if(*text == 0x00){
}
else {
if(fork() > 0){
wait(&status);
}
else {
execlp("./call.sh", "./call.sh", text, NULL);
_exit(1);
}
}
gtk_entry_set_text(GTK_ENTRY(entry), "");
}
return FALSE;
}
int main(int argc,char *argv[]){
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Program");
gtk_window_set_default_size(GTK_WINDOW(window), 480, 3); /* ←ひどい設定のしかただネ */
entry=gtk_entry_new_with_max_length(256); /* ←てきとー */
gtk_container_add(GTK_CONTAINER(window), entry);
gtk_widget_show(entry);
gtk_widget_show(window);
g_signal_connect(window, "destroy", gtk_main_quit, NULL);
g_signal_connect(entry, "key-press-event", G_CALLBACK(key_pressed), NULL);
gtk_main();
return 0;
}
(コンパイル方法:gcc [ソースファイル名] `pkg-config --cflags --libs gtk+-2.0`)
これだけ見せられてもよくわからないソース。何がなんだか、という人は、前回、前々回も見てみてください。
こんないいかげんでいいのかな

※メール、リンクは適当に。
mplayerに頼らないver.
17-4-2010
いつまでもmplayerに頼っていてはいけません。文字列入力部分と音声再生部分は自分でなんとかしましょう。
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>
GtkWidget *entry;
GtkWidget *window;
gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer user_data){
const gchar* text;
int status;
Mix_Chunk* chunk;
if(event->keyval == GDK_Return){
text = gtk_entry_get_text(GTK_ENTRY(entry));
if(*text == 0x00){
}
else {
if(fork() > 0){
wait(&status);
}
else {
execlp("./call.sh", "./call.sh", text, NULL);
_exit(1);
}
}
chunk = Mix_LoadWAV("test.wav");
if(chunk != NULL){
Mix_PlayChannel(1, chunk, 0);
while(Mix_Playing(1) == 1){
SDL_Delay(100);
}
Mix_FreeChunk(chunk);
}
else {
printf("%s\n", Mix_GetError());
}
gtk_entry_set_text(GTK_ENTRY(entry), "");
}
return FALSE;
}
int main(int argc,char *argv[]){
SDL_Init(SDL_INIT_AUDIO);
/* 周波数は8000Hzに設定 */
if( Mix_OpenAudio(8000, AUDIO_S16SYS, 2, 1024) < 0){
fprintf(stderr, "Audio open error!\n");
}
else {
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Program");
gtk_window_set_default_size(GTK_WINDOW(window), 480, 3);
entry = gtk_entry_new_with_max_length(256);
gtk_container_add(GTK_CONTAINER(window), entry);
gtk_widget_show(entry);
gtk_widget_show(window);
g_signal_connect(window, "destroy", gtk_main_quit, NULL);
g_signal_connect(entry, "key-press-event", G_CALLBACK(key_pressed), NULL);
gtk_main();
Mix_CloseAudio();
}
SDL_Quit();
return 0;
}
(コンパイル方法:gcc [ソースファイル名] `pkg-config --cflags --libs gtk+-2.0` -lSDL -lSDL_mixer)
音声再生部分はSDLの力を借りました。無駄に豪華?
なお、mplayerを使わなくしたので、call.shはこうなります。
#!/bin/sh echo $1 | ./SampleTalk > test.wav
※メール、リンクは適当に。
gladeを使った開発
18-4-2010
GCCのページから、昔書いたgtk+のページにいけますが、その中のgladeを使った開発のコーナーの記事が余りにも古すぎて、現在のバージョン(3.6.7)に対応できないので、バージョン3.6.7を使った開発について書きます。
GCCページの方の更新はスクリーンショット付きで後日まとめて行います。
起動時にプロジェクトのオプションを設定します。プロジェクトファイルの形式をGtkBuilderにし、それ以外は適当に設定します。Gtkバージョンを上げると、使えるモジュールの数が増えます。
オブジェクトを配置し、プロパティを適当に設定して、保存します。現在のバージョンでは「ソースコードの書き出し」ができないので、保存したら終了です。
次にプログラムのソースコードを書きます。Gtkモジュールの呼び出しはGtkBuilderのAPIを使います。
GNOME Documentation Library (GtkBuilder)
実際に使ってみるとこんな感じ。GtkBuilderに関係ある部分を強調表示してあります。
#include <gtk/gtk.h>
int main(int argc, char *argv[]){
GtkBuilder* g_builder;
GtkWidget* window;
gtk_init(&argc, &argv);
g_builder = gtk_builder_new();
gtk_builder_add_from_file(g_builder, "file.glade", NULL);
window = (GtkWidget*)gtk_builder_get_object(g_builder, "window");
gtk_widget_show_all(window);
gtk_main();
return 0;
}
GtkBuilderを用意し、gtk_builder_add_from_file()で、gladeで作成したファイルを指定して読み込みます。GtkBuilderからオブジェクトを取得するにはgtk_builder_get_object()を使います。
シグナルをgladeで設定した自作コールバック関数で受信するには、次のようにします。
/* entryのkey-press-eventを受信する関数 */
G_MODULE_EXPORT gboolean on_entry1_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data){
/* 省略 */
}
gladeファイルで指定したコールバック関数にG_MODULE_EXPORTをつけます。
また、コンパイルを次のようにします。
gcc [ファイル名] `pkg-config --cflags --libs gtk+-2.0 gmodule-2.0`
glage旧バージョンの「ソースコード書き出し」方式よりも、シンプルになってちょっと使いやすくなっていると思います。
※メール、リンクは適当に。
前回の修正
27-4-2010
gladeでシグナル設定をした場合は、gtk_builder_connect_signals()を呼ばないと、関数呼び出しができません。強調部分を追加。
#include <gtk/gtk.h>
int main(int argc, char *argv[]){
GtkBuilder* g_builder;
GtkWidget* window;
gtk_init(&argc, &argv);
g_builder = gtk_builder_new();
gtk_builder_add_from_file(g_builder, "file.glade", NULL);
window = (GtkWidget*)gtk_builder_get_object(g_builder, "window");
gtk_widget_show_all(window);
gtk_builder_connect_signals(g_builder, NULL);
gtk_main();
return 0;
}
※メール、リンクは適当に。
新しいOSがきた
1-5-2010
今日からUbuntu 10.04です。
起動と終了がスピードアップしました。多分。
あと、ウインドウの最小化、最大化、閉じるボタンの位置が左に移動しました。

これはUbuntu 10.04の仕様とのこと(gnomeのサイトのスクリーンショットでは右にあるので、多分そうなんでしょう)。外観の設定でも変更不可です。
あと、OpenOffice.orgがバージョン3.2になってオラクルの名前が入るようになりました。そんな話題が前にありましたよね。
まあ、でもちょっと使ってみた感触では、あまり変わっていないような気がします。
---
追記) ボタンの配置はこのページのスクリプトを使えば変更できるようです。

あれ?ウインドウアイコンなくなった??
※メール、リンクは適当に。
1月前にOSが新しくなったけど
1-6-2010
続きのネタがない。まあ、あまりに普通に使えるので、仕方ないか。
あと、質の悪いウイルスが蔓延しているようですので、ご注意ください。
※メール、リンクは適当に。
Copyright (c) 2010 greencap

