読者です 読者をやめる 読者になる 読者になる

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

さて、巷でゆっくりを見かけるようになって久しいですが、Windowsでないと使えないというのが寂しいところ。
そこでLinuxからでも使える方法を考えてみました。


まずはWineで実行してみるわけですが、VB版/.net版ともにまともに動かない。

SofTalkは音声の合成にAquesTalkというライブラリを使っているので、
さっそく公式(http://www.a-quest.com/download/index.html)を見てみると
タダなのはWindows用だけのようで・・・
サンプルのAqTkAppも動かないし・・・


どうもSofTalk本体と同じく、サウンドかGDIでこけているようだ。


そこでFedora 12の公式のリポジトリに入っているWindows用クロスコンパイラを使ってライブラリを直接たたいてみる。
まずはgccをインストール:

# yum install mingw32-gcc

コードを書く:

#include <stdio.h>
#include <stdlib.h>
#include "AquesTalk.h"

int main(int argc,char **argv){
    // parse arguments
    int speed=100;
    if(argc!=3 && argc!=4){
        printf("usage:\n");
        printf("  aqwrap <input-file(SJIS)> <output-file(WAV)> <speed>?\n");
        return -1;
    }
    if(argc==4) speed=atoi(argv[3]);

    // load text
    unsigned char *text;
    FILE *fi=fopen(argv[1],"rb");
    if(fi==NULL){
        fprintf(stderr,"couldn't open input file %s\n",argv[1]);
        return -2;
    }
    fseek(fi,0,SEEK_END);
    int fsize=ftell(fi);
    text=malloc(fsize);
    fseek(fi,0,SEEK_SET);

    fread(text,fsize,1,fi);
    fclose(fi);

    // feed the text to AquesTalk
    int size;
    unsigned char *wav=AquesTalk_Synthe(text,speed,&size);
    free(text);
    
    if(wav==NULL){
        fprintf(stderr,"AquesTalk_Synthe:error:%d\n",size);
        return -1;
    }
    
    // write out to a file
    FILE *fo=fopen(argv[2],"wb");
    if(fo==NULL){
        fprintf(stderr,"couldn't open output file %s\n",argv[2]);
        AquesTalk_FreeWave(wav);
        return -2;
    }
    fwrite(wav,1,size,fo);
    AquesTalk_FreeWave(wav);
    fclose(fo);

    return 0;
}

ファイルを適当に集めてコンパイル:

$ ls
AquesTalk.h AquesTalk.dll AquesTalk.lib main.c
$ i686-pc-mingw32-gcc main.c AquesTalk.lib -o aqwrap.exe

使ってみる:

$ echo "わいんでも、ゆっくりしていってね。"|nkf -s > test
$ wine aqwrap.exe test x.wav 80

その結果できたのがこれ。
Download


仕様:

バイナリは要望があれば公開します。