ofxTrueTypeFontUC + oF systemSpeak “Kyoko” test

openFrameworksのサンプルで英語で発音できていたので日本語でも発音できないのかな〜と思ったら普通に出来ました。

testApp.h

#pragma once
#include "ofMain.h"
#include "ofxTrueTypeFontUC.h"  // https://github.com/hironishihara/ofxTrueTypeFontUC

// ---------------------------------------------
class testApp : public ofBaseApp, public ofThread {
	
public:
    
    void setup();
    void draw();
    void exit();
    void threadedFunction();
    
    ofxTrueTypeFontUC font;
    vector <string> words;
    int step;
    
    string voice;
};

testApp.cpp

#include "testApp.h"

//--------------------------------------------------------------
void testApp::setup() {

    font.loadFont("ヒラギノ明朝 ProN W3.otf", 34);  //日本語対応フォントを ./bin/data下に
    voice = "Kyoko";                           //http://veadardiary.blog29.fc2.com/blog-entry-3854.html参照

    // load the lyrics from a text file and split them
    // up in to a vector of strings
    string lyrics = ofBufferFromFile("lyrics.txt").getText();  //適当な文章を。区切りたいところに半角スペースを入れる
    step = 0;
    words = ofSplitString(lyrics, " ");

    // we are running the systems commands
    // in a sperate thread so that it does
    // not block the drawing
    startThread();
}

//--------------------------------------------------------------
void testApp::threadedFunction() {

    while (isThreadRunning()) {
        // call the system command say
        #ifdef TARGET_OSX
            string cmd = "say -v "+voice+" "+words[step]+" ";   // create the command
            system(cmd.c_str());
        #endif
        #ifdef TARGET_WIN32
            string cmd = "data\\SayStatic.exe "+words[step];   // create the command
            cout << cmd << endl;
            system(cmd.c_str());
        #endif

        // step to the next word
        step ++;
        step %= words.size();

        // slowdown boy
        ofSleepMillis(10);
    }
}
//--------------------------------------------------------------
void testApp::draw() {
    // center the word on the screen
    float x = (ofGetWidth() - font.stringWidth(words[step])) / 2;
    float y = ofGetHeight() / 2;

    // draw the word
    ofSetColor(0);
    font.drawString(words[step], x, y);    
}

//--------------------------------------------------------------
void testApp::exit() {
    // stop the thread on exit
    waitForThread(true);
}

元は↓の歌詞でした。

Benny Benassi – Satisfaction


09/03 17:19