アラサーリーマンの開発日誌
http://cider40.ikora.tv
プログラムの開発日誌を備忘録として書いていきます
ja
才田一
2017-05-08T00:41:45+09:00
-
開発日誌10(Live2D改良)
http://cider40.ikora.tv/e1274971.html
先日公開した動画の改良版です。
閉じ目と笑顔を描いた目に変更、腕のデフォーマの追加及び手パーツの追加を行いました。
※モーションはイプシロンのものを基にしています。
※BGMは煉獄庭園様のものを使用させていただきましたm(_ _)m
http://www.rengoku-teien.com/
先日公開した動画の改良版です。
閉じ目と笑顔を描いた目に変更、腕のデフォーマの追加及び手パーツの追加を行いました。
※モーションはイプシロンのものを基にしています。
※BGMは煉獄庭園様のものを使用させていただきましたm(_ _)m
http://www.rengoku-teien.com/]]>
開発日誌
才田一
2017-05-08T00:41:45+09:00
-
開発日誌9(Live2D試作2)
http://cider40.ikora.tv/e1271684.html
久しぶりの更新です。
前回の記事の試作品で得た知識を基にインターフェース用のキャラを作りました!
※BGMは煉獄庭園様のものを使用させていただきましたm(_ _)m
http://www.rengoku-teien.com
久しぶりの更新です。
前回の記事の試作品で得た知識を基にインターフェース用のキャラを作りました!
※BGMは煉獄庭園様のものを使用させていただきましたm(_ _)m
http://www.rengoku-teien.com]]>
開発日誌
才田一
2017-04-21T07:35:41+09:00
-
開発日誌8(live2d試作)
http://cider40.ikora.tv/e1266912.html
イラストを動かすことができる、live2dを使いたいと思い、ここ数日勉強しておりました(笑)
試作品として、株式会社ボルテージ様の今話題のアプリ、ダウト~嘘つきオトコは誰?~の間宮さんを動かしてみました。
live2dはすごいですね、2次元の新たな可能性を感じます(*≧∀≦*)
試作品として、株式会社ボルテージ様の今話題のアプリ、ダウト~嘘つきオトコは誰?~の間宮さんを動かしてみました。
live2dはすごいですね、2次元の新たな可能性を感じます(*≧∀≦*)
]]>
開発日誌
才田一
2017-03-26T01:53:49+09:00
-
開発日誌7(形態素解析)
http://cider40.ikora.tv/e1265969.html
文章を発音するにあたり、文章を形態素解析し、発音などの情報を取得する必要があります。
形態素解析とは、平たく言うと文章を最小単位まで分割することです。
例えば、"初めまして、私の名前は才田一です。"という文章の場合、"初めまして | 、 | 私 | の | 名前 | は | 才田 | 一 | です | 。"のように分割されます。
文章を取得→形態素解析→品詞・発音・アクセントなどの情報を取得→発音
以上の流れで発音を制御し、聞き取りやすい発音を目指していきたいと思います。
形態素解析とは、平たく言うと文章を最小単位まで分割することです。
例えば、"初めまして、私の名前は才田一です。"という文章の場合、"初めまして | 、 | 私 | の | 名前 | は | 才田 | 一 | です | 。"のように分割されます。
文章を取得→形態素解析→品詞・発音・アクセントなどの情報を取得→発音
以上の流れで発音を制御し、聞き取りやすい発音を目指していきたいと思います。
]]>
才田一
2017-03-20T19:07:41+09:00
-
開発日誌6(text to speech改良)
http://cider40.ikora.tv/e1265199.html
少し動作を調整しました。
まだまだ不自然で聞き取りにくいので、改良が必要です(-_-;)
少し動作を調整しました。
まだまだ不自然で聞き取りにくいので、改良が必要です(-_-;)
]]>
開発日誌
才田一
2017-03-16T21:39:35+09:00
-
嬉しいニュース
http://cider40.ikora.tv/e1265194.html
飴音わめあちゃんの作者、あめころもるぢ様よりアプリへの音源使用許可をいただきました(*≧∀≦*)
あめころもるぢ様、本当にありがとうございますm(_ _)m
飴音わめあ(https://t.co/jDzjxEpF9Y)
あめころもるぢ様、本当にありがとうございますm(_ _)m
飴音わめあ(https://t.co/jDzjxEpF9Y)]]>
才田一
2017-03-16T21:20:37+09:00
-
開発日誌5(色々メモ)
http://cider40.ikora.tv/e1264457.html
①Web Audio APIのエラー
"SyntaxError: Failed to construct 'AudioContext':
number of hardware contexts reached maximum (6)."
Web Audio APIを触っていると、上記のエラーに遭遇した。
Audio Contextを作成できるのは6回までですよ~
と怒られた(-_-;)
Audio Contextはその都度作成するのではなく、最初に宣言したものを使い回さないといけないようです。
②ファイル名の指定
ファイル名を指定して音声の再生を行うので、文字列(ひらがな)を分割する必要があります。
splitメソッドを使用して、文字列を分割します。
var array = string.split("");
これで、1文字ずつに分割されて配列に格納される。
これだけだと、捨て仮名(ぁぃぅぇぉ等)を含むファイルや、長音記号(ー)に対応できないので、調べる必要があります。
if分を使って調べます。
var convertArray = [];
for(var i = 0; i < array.length; i++){
if(array[i+1]=="ぁ"|| array[i+1]=="ぃ"|| array[i+1]=="ぅ"|| array[i+1]=="ぇ"|| array[i+1]=="ぉ"|| array[i+1]=="ゃ"|| array[i+1]=="ゅ"|| array[i+1]=="ょ"){
convertArray.push(array[i]+array[i+1]);
i++;
}
else if (array[i+1]=="ー"){
convertArray.push(array[i]+array[i+1]);
i++;
}
elese{
convertArray.push(array[i]);
}
};
これで、"ちゃ"などのファイル名を指定できます。
③再生時間の設定
"っ"・"、"・"。"は無音、"ー"は再生時間を通常の2倍にする。
if文とsliceメソッドを使って、判定します。
string.slice(-1);
これで最後の文字列を取得できます。
var playTime = 0;
for(var i = 0; i < convertArray.length; i++){
if(convertArray[i].slice(-1)=="ー"){
playTime = 0.4;
}
elese if(convertArray[i]=="っ"){
playTime = 0.1;
}
elese{
playTime = 0.2;
}
};
"SyntaxError: Failed to construct 'AudioContext':
number of hardware contexts reached maximum (6)."
Web Audio APIを触っていると、上記のエラーに遭遇した。
Audio Contextを作成できるのは6回までですよ~
と怒られた(-_-;)
Audio Contextはその都度作成するのではなく、最初に宣言したものを使い回さないといけないようです。
②ファイル名の指定
ファイル名を指定して音声の再生を行うので、文字列(ひらがな)を分割する必要があります。
splitメソッドを使用して、文字列を分割します。
var array = string.split("");
これで、1文字ずつに分割されて配列に格納される。
これだけだと、捨て仮名(ぁぃぅぇぉ等)を含むファイルや、長音記号(ー)に対応できないので、調べる必要があります。
if分を使って調べます。
var convertArray = [];
for(var i = 0; i < array.length; i++){
if(array[i+1]=="ぁ"|| array[i+1]=="ぃ"|| array[i+1]=="ぅ"|| array[i+1]=="ぇ"|| array[i+1]=="ぉ"|| array[i+1]=="ゃ"|| array[i+1]=="ゅ"|| array[i+1]=="ょ"){
convertArray.push(array[i]+array[i+1]);
i++;
}
else if (array[i+1]=="ー"){
convertArray.push(array[i]+array[i+1]);
i++;
}
elese{
convertArray.push(array[i]);
}
};
これで、"ちゃ"などのファイル名を指定できます。
③再生時間の設定
"っ"・"、"・"。"は無音、"ー"は再生時間を通常の2倍にする。
if文とsliceメソッドを使って、判定します。
string.slice(-1);
これで最後の文字列を取得できます。
var playTime = 0;
for(var i = 0; i < convertArray.length; i++){
if(convertArray[i].slice(-1)=="ー"){
playTime = 0.4;
}
elese if(convertArray[i]=="っ"){
playTime = 0.1;
}
elese{
playTime = 0.2;
}
};
]]>
開発日誌
才田一
2017-03-12T20:40:53+09:00
-
開発日誌4(音声の出力3)
http://cider40.ikora.tv/e1264138.html
AudioはandroidやiOSでつかえないらしいので、Web Audio APIを使用することに(-_-;)
// 音声ファイルの場所
var SOUND_URL = './sound/.wav';
var context = new AudioContext();
var buffer = null;
var source = context.createBufferSource();
var request = new XMLHttpRequest();
request.open('GET', SOUND_URL, true);
request.responseType = 'arraybuffer';
request.send();
request.onload = function () {
var res = request.response;
context.decodeAudioData(res, function (buf) {
source.buffer = buf;
});
};
source.connect(context.destination);
source.start(0);
このコードで、音が出せるらしい
もっと勉強しなくては…
// 音声ファイルの場所
var SOUND_URL = './sound/.wav';
var context = new AudioContext();
var buffer = null;
var source = context.createBufferSource();
var request = new XMLHttpRequest();
request.open('GET', SOUND_URL, true);
request.responseType = 'arraybuffer';
request.send();
request.onload = function () {
var res = request.response;
context.decodeAudioData(res, function (buf) {
source.buffer = buf;
});
};
source.connect(context.destination);
source.start(0);
このコードで、音が出せるらしい
もっと勉強しなくては…
]]>
開発日誌
才田一
2017-03-10T23:54:25+09:00
-
開発日誌3(音声の出力2)
http://cider40.ikora.tv/e1263950.html
開発日誌2のAudioを利用して、wavを連続して再生するコードを書きました。
//音声ファイルの場所
var SOUND_PATH = "./sound/";
//ファイル名の配列
var Strings = ["あ","い","う","え","お"];
//再生回数
var PlayedCount = 0;
//音声ファイルのパスの配列
var FullPathArray = [];
//ファイルのFullPathの作成
function MakePath(Path,Strings){
var SoundsPath =[];
//逆に配列に追加(逆に格納する方が速いらしい)
for(i=Strings.length-1;i>=0;i--){
SoundsPath.unshift(Path+Strings[i]);
}
//配列を返す
return SoundsPath;
}
//音声の再生
function SoundPlay(){
FullPath = FullPathArray[PlayedCount];
var audio = new Audio(FullPath + ".wav");
audio.play();
//再生回数がwavファイルの総数以下の場合、ennedイベントを拾う(この際呼び出す関数を自身にすることでループを形成する)
if(PlayedCount
//音声ファイルの場所
var SOUND_PATH = "./sound/";
//ファイル名の配列
var Strings = ["あ","い","う","え","お"];
//再生回数
var PlayedCount = 0;
//音声ファイルのパスの配列
var FullPathArray = [];
//ファイルのFullPathの作成
function MakePath(Path,Strings){
var SoundsPath =[];
//逆に配列に追加(逆に格納する方が速いらしい)
for(i=Strings.length-1;i>=0;i--){
SoundsPath.unshift(Path+Strings[i]);
}
//配列を返す
return SoundsPath;
}
//音声の再生
function SoundPlay(){
FullPath = FullPathArray[PlayedCount];
var audio = new Audio(FullPath + ".wav");
audio.play();
//再生回数がwavファイルの総数以下の場合、ennedイベントを拾う(この際呼び出す関数を自身にすることでループを形成する)
if(PlayedCount
audio.addEventListener("ended", SoundPlay, false);
PlayedCount++;
}
//再生回数がwavファイルの総数と同じになったらループを抜けて、再生回数を初期化する
else if(PlayedCount==FullPathArray.length){
PlayedCount=0;
}
}
//動作確認
FullPathArray = MakePath(SOUND_PATH,Strings50);
SoundPlay();
上記のコードを動かすと、"あ"~"お".wavを順番に再生します。
はじめはfor文によるループを考えていましたが、上手くいかなかったため、代替案として作ったコードです。
このコードはきちんと動作するのですが、再生範囲を指定してファイルを再生した場合、endedイベントが拾えず、ループが作れないという問題点を抱えています(-_-;)
]]>
開発日誌
才田一
2017-03-09T23:11:57+09:00
-
開発日誌2(音声の出力)
http://cider40.ikora.tv/e1263729.html
どのようにして、テキストを音声に変換するのか?
これに関しては、辞書をプログラムに登録し、入力された文字を読む必要があります。
辞書に関しては自作のクラスで対応するつもりですが、音声の出力はHTML5のAudioとフリーのボーカロイドソフト、UTAU(http://utau2008.web.fc2.com/)用の音声を使用させていただきたいと思います。
UTAU用の音源は多く作られているので、それを利用できるようにしておくことで、プログラムの拡張性を高めることができます。
HTML5のAudio
HTML5のAudioを利用すれば、以下の2行のコードで音を出すことができます。
var audio = new Audio(FullPath + ".wav");
audio.play();
audioは変数の名前、FullPathはファイルのある場所です。
UTAU用の音源には"あ"~"ん"の音声+αのwavファイルが入っているので、ディレクトリ+ファイル名で単音を発声できます。
単音を複数つなげて、音声を作っていきます。
これに関しては、辞書をプログラムに登録し、入力された文字を読む必要があります。
辞書に関しては自作のクラスで対応するつもりですが、音声の出力はHTML5のAudioとフリーのボーカロイドソフト、UTAU(http://utau2008.web.fc2.com/)用の音声を使用させていただきたいと思います。
UTAU用の音源は多く作られているので、それを利用できるようにしておくことで、プログラムの拡張性を高めることができます。
HTML5のAudio
HTML5のAudioを利用すれば、以下の2行のコードで音を出すことができます。
var audio = new Audio(FullPath + ".wav");
audio.play();
audioは変数の名前、FullPathはファイルのある場所です。
UTAU用の音源には"あ"~"ん"の音声+αのwavファイルが入っているので、ディレクトリ+ファイル名で単音を発声できます。
単音を複数つなげて、音声を作っていきます。
]]>
開発日誌
才田一
2017-03-08T19:45:17+09:00
-
開発日誌1(開発環境について)
http://cider40.ikora.tv/e1263722.html
マルチプラットホームで動作させるために、開発環境をどうするか??
↓
パソコン・タブレット・スマホで動作するプログラムが理想。
↓
ティラノスクリプト(http://tyrano.jp/)というゲームエンジンが、HTML5とjavascriptで動作し、パソコン・タブレット・スマホ全てで起動できるアプリを作成できる。
また、javascriptを用いることで、自由にカスタマイズできる。
↓
javascriptを勉強しよう!!
上記の流れでjavascriptを勉強する所からはじめたいと思います。
プログラミングはC#を少しかじっているのですが、javascriptとは作法が結構作法が違うので最初かなり戸惑いました(-_-;)
↓
パソコン・タブレット・スマホで動作するプログラムが理想。
↓
ティラノスクリプト(http://tyrano.jp/)というゲームエンジンが、HTML5とjavascriptで動作し、パソコン・タブレット・スマホ全てで起動できるアプリを作成できる。
また、javascriptを用いることで、自由にカスタマイズできる。
↓
javascriptを勉強しよう!!
上記の流れでjavascriptを勉強する所からはじめたいと思います。
プログラミングはC#を少しかじっているのですが、javascriptとは作法が結構作法が違うので最初かなり戸惑いました(-_-;)]]>
開発日誌
才田一
2017-03-08T19:27:23+09:00
-
このブログと開発中のプログラムについて
http://cider40.ikora.tv/e1263719.html
このブログは、現在開発中のプログラムについての記事が中心になると思います。
現在、マルチプラットホームで動作する、text to speechもどきを作成しています。
このプログラムはもともと、癌により余命宣告された祖父が、声を出しにくくなった時、何とかコミュニケーションを円滑にとれないかと考えたことがきっかけです。
祖父とのコミュニケーション方法を考える内、近所に住む聴覚障害者の方とコミュニケーションをとる際に、筆談が非常に有効であったことを思いだしました。
これをヒントに、入力された文字列を音声に、音声を文字列に変換できるプログラムがあれば、祖父のように何らかの事情で声を失った方や、聴覚・視覚に障害のある方とのコミュニケーションを円滑化できるのでは?と思い、開発をスタートしました。
現在、マルチプラットホームで動作する、text to speechもどきを作成しています。
このプログラムはもともと、癌により余命宣告された祖父が、声を出しにくくなった時、何とかコミュニケーションを円滑にとれないかと考えたことがきっかけです。
祖父とのコミュニケーション方法を考える内、近所に住む聴覚障害者の方とコミュニケーションをとる際に、筆談が非常に有効であったことを思いだしました。
これをヒントに、入力された文字列を音声に、音声を文字列に変換できるプログラムがあれば、祖父のように何らかの事情で声を失った方や、聴覚・視覚に障害のある方とのコミュニケーションを円滑化できるのでは?と思い、開発をスタートしました。]]>
才田一
2017-03-08T19:12:11+09:00