投稿

8月, 2012の投稿を表示しています

(2)C言語で音声合成もどき ~母音の生成~

イメージ
この記事は素人が音声合成で遊んでいるだけの記事です。完全に行き当たりばったりなので、紹介している内容の保証はできません。また、記事の内容を予告なく変更することがあります。 生成した「お」の波形 今回は本題の音声合成に移っていきます。 前回 は波形データをWAVファイルに書き出す部分を作ったので、ここからはさっそく母音の合成をしていきます。 ざっくりいうと人間の声は、 声帯 で基となる音がつくられ、 声道 で加工されたものです。 今回のプログラムは、この「声帯→声道」という構成を参考にして音声を合成していきます。 まずは、声帯にあたる部分から実装することにします。 声帯が振動すると、周期的な波が発生します。 つまり、なんらかの周期的な波を使えば模倣できそうです。 一般的なシンセサイザーのようにノコギリ波や三角波を使うこともできますが、ここでは声帯振動の波を模倣した Rosenberg波 とよばれる波形を使います。 以下がRosenberg波の式です。 出典: https://dspace.jaist.ac.jp/.../896paper.pdf のP14 (2.1)、一部式の変形・表記変更あり τ1は 声門開大期 *1 の長さ 、τ2は 声門閉小期 *2 の長さ を表します。 *1 声門開大期……声門が閉じた状態から開ききるまでの時間 *2 声門閉小期…… 声門が開いた状態から閉じきるまでの時間 これらの値は、τ1 + τ2 が 0〜1 の範囲におさまるように決めます。 今回は  τ1 = 0.90, τ2 = 0.05 としました。 Cで書くとこんな感じです。 double GenRosenberg(double freq) { /* Rosenberg波を生成 */ static double t = 0; double tau = 0.90; /* 声門開大期 */ double tau2 = 0.05; /* 声門閉小期 */ double sample = 0.0; t += freq / (double)サンプリング周波数; t -= floor(t); if (t <= tau) {

(1)C言語で音声合成もどき ~WAVファイルを生成する~

この記事は素人が音声合成で遊んでいるだけの記事です。完全に行き当たりばったりなので、紹介している内容の保証はできません。 また、記事の内容を予告なく変更することがあります。 「C言語で音声合成もどき」ということで、このシリーズではフォルマント合成と呼ばれる手法を使った音声合成プログラムをC言語で作っていきます。 本題の音声合成に入る前に、まずは肩慣らしとして 音声ファイルを作るプログラム をつくります。 今回は  8bit, 44100Hz, 1ch  の WAV形式 のファイルを作成するプログラムを書いてみます。 ( この記事では、比較的実装が簡単なWAV形式を扱います。 ひょっとするとMP3形式等のほうが馴染み深いかもしれませんが、MP3ではデータ圧縮にやや複雑なアルゴリズムを使うことになります。) なお、WAVファイルの構造については WAVファイルフォーマット WAVE file format を参考にしました。