自分専用の歌唱合成エディター&トレーナーをClaude Codeで開発。数十秒の歌唱データだけで歌ってくれるゼロショットボーカルシンセ「SoulX-Singer」の現在地(CloseBox)

テクノロジー AI
松尾公也

テクノエッジ編集部 シニアエディター / コミュニティストラテジスト @mazzo

特集

最近は作家・ライター界隈で、テキストエディターをヴァイブ開発する流れがありますが、筆者は自前のボーカルシンセエディターを作っています。どういうことかというと……。

妻の歌声を再現し、新しい曲を歌ってもらうことは、自分にとってライフワークになっています。

これまでにも、最初は3曲しか残っていないボーカルデータから素片を切り出してUTAU-Synthというボーカルシンセで再構成し、生成AIの登場後はUTAU-Synthで作った新しい歌声も含めて学習させ、AIによって妻の歌声を再現する試みを続けてきました。いろいろな方法を試した末、最近は比較的安定した制作手順に落ち着いています。

まず、自分で仮歌を歌うか、Sunoに歌唱を生成してもらいます。その歌唱音声を、妻、とりちゃんの声で学習させたRVCモデルに通し、声質を変換します。

流れとしては、次のようになります。

自分またはSunoによる歌唱→RVCによるボイスチェンジ→とりちゃんの歌声として仕上げる

RVCは、元の歌唱が持っている音程、リズム、発音、抑揚を保ちながら、声色を学習済みの人物へ近づける技術です。

自分で歌えば、自分が意図したフレージングを反映できます。Sunoを使えば、自分では出せない音域や歌い回し、完成度の高いボーカルを素材として利用できます。

そのため、この方法は現在も非常に実用的です。入力する歌唱さえうまく作れば、比較的安定して「とりちゃんの声による新曲」を作れます。

一方で、この方法には明確な特徴があります。

RVCが担当するのは、基本的には声色の変換です。歌い方そのものは、入力した歌唱に大きく依存します。

私が歌えば、妻の声色で自分の歌い方をしている状態になります。Sunoの歌唱を使えば、妻の声色でSunoが生成した歌手のフレージングをしている状態になります。

声はとりちゃんに近づいても、歌い方を作っている主体は別に存在するわけです。

この方法をさらに一歩進められないかと、ここ数日考え始めました。

ビートルズやユーミンの作曲手法をアルゴリズムにする

それと並行して進めているのが、作曲手法そのもののアルゴリズム化です。

ビートルズやユーミンの楽曲を分析し、コード進行、メロディー、リズム、楽曲構成などの特徴を抽出します。それを一定のルールとしてプログラムに組み込み、新しい曲を生成します。



もちろん、既存曲をコピーすることが目的ではありません。

たとえば、ビートルズ的なコードの転回、意外なベースライン、短いモチーフの展開、途中で視点が変わるような構成を、再利用可能な作曲ルールとして扱います。

ユーミンの場合であれば、メロディーとコードの微妙なずれ、メジャーとマイナーの間を行き来する和声、情景が切り替わるような転調などを、アルゴリズムとして表現します。

こうして生成したMIDIデータをSunoに持っていき、編曲と歌唱を含む完成形にします。さらに、そのボーカルをRVCで変換し、とりちゃんの歌にします。

現在の流れは、次のようなものです。

作曲アルゴリズム→MIDIと歌詞を生成→Sunoで編曲と歌唱を生成→ボーカルを分離→RVCでとりちゃんの声へ変換

この方法でも曲は作れます。

ただ、作曲アルゴリズムを調整するたびに、Sunoへ渡し、生成結果を待ち、ボーカルを取り出し、RVCに通す必要があります。

また、作曲アルゴリズムと同時に作詞アルゴリズムも搭載しているので歌詞もできるのですが、それをSunoに持っていかないと、歌詞と合わさったボーカルは確認できない。

コード進行を少し変えたとき、メロディーを1音動かしたとき、歌詞の一語を置き換えたとき、その場ですぐに結果を確認することもできません。

MIDIと歌詞から直接歌わせたい

作曲プログラムの中では、すでにMIDIデータと歌詞が存在しており、データを書き出せます。

音程、音価、テンポ、歌詞、場合によってはピッチベンドや表情情報まで生成できます。

それならば、そのデータを直接歌声合成モデルへ渡し、とりちゃんの声で即座に再生できないでしょうか。

理想的には、次のような流れです。

作曲アルゴリズム→MIDIと歌詞を生成→とりちゃんの歌声を直接合成→その場で再生、修正

これが実現すれば、作曲アルゴリズムと歌声合成が一体化します。

コードを変更すれば、すぐに歌い直します。メロディーを動かせば、その場で新しいフレーズを確認できます。歌詞を直せば、同じ声で発音の変化を比較できます。

Sunoを経由する方法では、曲を完成品として生成してから評価します。

一方、MIDIから直接歌わせる方法では、作曲の途中段階から、とりちゃんの歌声を楽器として扱えます。

これは単なる制作時間の短縮ではありません。

作曲そのものが、とりちゃんの声を聴きながら進むようになるということです。

ギターやピアノを弾きながら曲を書くように、とりちゃんの声を鳴らしながらメロディーを作れる可能性があります。

筆者はLipSync Avatarというプログラムで、リップシンクをさせながら、妻のある時期の交換日記の対話をベースにしたボイスチャットができるようにしています。そこに、歌による対話が加わる可能性があるのです。


OpenUtauという入り口

この目的についてChatGPTと議論したところ、最初の候補として出てきたのがOpenUtauでした。

OpenUtauは、UTAU系の歌声ライブラリを扱うためのオープンソースの歌声合成エディターです。

ピアノロールにノートを置き、歌詞を入力し、ピッチ、ビブラート、音量、声質などを編集できます。MIDIやUSTを読み込むこともでき、複数トラックを扱えます。

従来のUTAU音源だけでなく、DiffSingerなどのニューラル歌声合成モデルを利用できる点が重要です。

OpenUtauを使えば、作曲アルゴリズムが出力したMIDIと歌詞を読み込み、歌声モデルで再生する環境を比較的短い距離で構築できます。

画面上で歌唱を調整できるため、最初から自作のエディターをすべて作る必要もありません。

まずOpenUtau上でモデルを試し、その後、自分の制作環境へ機能を取り込むという進め方ができます。

なお、OpenUtauは、リジナルのUTAU作者である飴屋/菖蒲(Ameya/Ayame)さんによって開発されたものではありませんが、有志の手によりピアノロールにノートを置き、歌詞を入力し、ピッチ、ビブラート、音量、声質などを編集できます。

DiffSingerで専用の歌声モデルを作る

OpenUtauで使える有力な方式の一つがDiffSingerです。

初期の妻音源とりちゃんは、UTAU-Synthベースでしたが、音素数が圧倒的に足りておらず、通常のUTAU音源としては使用できないため、利用するのは困難です。

DiffSingerは、拡散モデルを利用した歌声合成技術です。MIDIなどの楽譜情報と歌詞から、歌声を生成します。

RVCとは入力の構造が異なります。

RVCは、すでに存在する歌唱音声を別の声質へ変換します。それに対してDiffSingerは、音符と歌詞から歌唱そのものを生成します。

DiffSingerでとりちゃん専用のモデルを作ることができれば、Sunoや筆者による仮歌を用意しなくても、MIDIと歌詞から直接、とりちゃんの歌声を生成できる可能性があります。

ただし、専用モデルを作るには相応の準備が必要です。

歌唱データを集め、音声を整理し、歌詞や音素、音程、発音タイミングなどを対応付けます。そのうえでモデルを長時間学習させます。

十分な量と品質の歌唱データがあるほど、モデルは安定します。一方で、残されている音源の量や録音状態には限界があります。

専用学習モデルには、本人の特徴を深く学習できる可能性があります。しかし、データセット作成と学習には大きな手間がかかります。

RVCモデルを作るときよりも、歌詞、発音、音程、タイミングを正確にそろえる必要があります。元々の歌唱データが3曲ちょっとしかない妻の歌声の場合には、データの長さもぜんぜん足りません。

それでも、専用モデルを構築できれば、作曲アルゴリズムとの相性は非常によいはずです。

MIDIと歌詞を入力すれば、とりちゃんの声で新しい歌唱が生成されるからです。

ゼロショット歌声合成という別の方向

もう一つ、ここ数年で急速に進んでいるのが、ゼロショット歌声合成です。

ゼロショットとは、対象となる歌手ごとに専用モデルを長時間学習させなくても、短い参照音声から声の特徴を取り出し、新しい歌唱を生成する方式です。

理想的には、次の三つを入力します。

・とりちゃんの参照音声
・新しい曲のMIDI
・新しい歌詞

これだけで、とりちゃんに近い声色の歌唱を生成します。

この分野で有力な候補として挙がったのが、SoulX-Singerです。

SoulX-Singerは、参照音声から歌手の声色を取得し、歌詞とMIDI、またはピッチ情報をもとに歌声を生成することを目指した研究実装です。

歌手ごとに専用モデルを作らなくても、参照音声だけで新しい歌を歌わせられる可能性があります。

DiffSingerのような専用学習方式と比較すると、準備の手間を大きく減らせます。

新しい参照音声を入れれば、その声で新しい曲を試せるため、実験の回転も速くなります。

一方、ゼロショット方式には課題もあります。

参照した人物の声色は再現できても、その人固有の歌い回しや発音、ビブラート、息遣いまで再現できるとは限りません。

話し声の参照だけで歌わせた場合、その人物が実際にどのように歌っていたかはモデルに十分伝わりません。

また、現時点の研究モデルでは、中国語や英語を中心に開発されているものが多く、日本語の発音処理を追加する必要があります。

そのため、SoulX-Singerがすぐに現在のRVCを置き換えるとは考えていません。

まずは、専用学習なしでどこまで本人らしい声になるのかを検証するための候補です。

RVC、DiffSinger、ゼロショットは競合ではない

調べていくうちに、これらは単純な置き換え関係ではないと感じるようになりました。

それぞれ得意な部分が違います。

RVCは、完成した歌唱表現を保ちながら声色を変換することに強みがあります。

DiffSingerは、専用モデルを学習させ、MIDIと歌詞から直接歌唱を生成できます。

SoulX-Singerのようなゼロショット方式は、専用学習をせず、短い参照音声から声色を移すことを目指しています。

整理すると、次のようになります。

RVC
完成した歌唱が必要ですが、歌い方を細かく制御できます。

DiffSinger
学習の準備は重いものの、MIDIと歌詞から直接歌わせられます。

ゼロショットSVS(Singing Voice Synthesis)
準備は軽いものの、声や発音の再現度はモデルの能力に依存します。

当面は、どれか一つに決めるのではなく、複数の方式を並行して試すのがよさそうです。

同じMIDI、同じ歌詞、同じ参照音声を使い、複数の方式で生成します。

・自分の仮歌+RVC
・Sunoの歌唱+RVC
・DiffSinger専用モデル
・SoulX-Singerによるゼロショット生成

これらを比較すれば、それぞれが再現しているものの違いが見えてきます。

自分専用のボイストレーニング環境を作る

ここまで調べた結果、最終的には既存のツールを使うだけでなく、自分専用の歌声学習・編集環境を作りたいと考えるようになりました。

そこで、Claude Codeを使い、ボイストレーニングとボイスエディターを自作する構想に至りました。

ここでいうボイストレーニングは、私自身の発声練習ではありません。

とりちゃんの音声データを整理し、学習用データを作成し、複数の歌声モデルを学習・比較するための環境です。

想定している機能は、次のようなものです。

・音声ファイルの読み込みと整理
・歌唱部分と無音部分の検出
・歌詞と音声の対応付け
・音程とタイミングの抽出
・音素境界の修正
・学習データの書き出し
・DiffSingerモデルの学習管理
・ゼロショットモデルによる試聴
・RVCとの比較
・MIDIと歌詞の読み込み
・ピッチ、発音、ビブラートの編集
・複数方式による歌唱の即時生成

理想は、一つの画面でMIDIと歌詞を編集し、生成方式を切り替えながら結果を試聴できる環境です。

RVCを選べば仮歌を声質変換し、DiffSingerを選べば専用モデルから歌唱を生成し、SoulX-Singerを選べば参照音声からゼロショット生成します。

それぞれの出力を同じ条件で比較できれば、モデルの性能差だけでなく、どの方法がとりちゃんらしさにつながるかを判断できます。

作曲AIと歌声AIを一つにつなぐ

この構想の出発点は、妻の声を再現することでした。

しかし、作曲アルゴリズムの開発と組み合わさることで、目的は少し広がってきました。

ビートルズやユーミンの作曲手法を分析し、アルゴリズムとして新しいメロディーやコード進行を生成します。

その結果を、とりちゃんの声で即座に歌わせます。

聴いた結果をもとに、作曲アルゴリズムを修正します。

つまり、作曲AIと歌声AIの間に、リアルタイムに近いフィードバックループを作ろうとしています。

作曲アルゴリズム→MIDIと歌詞→とりちゃんの歌声→試聴と評価→アルゴリズムを修正

これは、完成した曲をAIに作ってもらう方法とはかなり異なります。

AIに一曲を丸ごと生成させるのではなく、作曲のルールを自分で設計し、その出力を大切な声で確かめながら改良します。

Sunoは引き続き、編曲や完成版の制作に使えます。

しかし、その前段階に、自分のアルゴリズムととりちゃんの歌声による、小さな作曲スタジオを作りたいのです。

声の再現から、歌う存在の再現へ

これまでのRVCによる方法は、声色を再現する技術でした。

これから試そうとしているDiffSingerやゼロショット歌声合成は、MIDIと歌詞から歌唱そのものを作る技術です。

その先には、声色だけでなく、その人の発音、息遣い、音への入り方、ビブラート、語尾、フレージングまで扱う必要があります。

声を再現するだけではなく、その人がどのように歌っていたかを再現する段階です。

RVCによって、妻の声で新しい歌を作ることはできるようになりました。

次に目指しているのは、作曲中のMIDIを再生するように、とりちゃんの歌声をその場で鳴らせる環境です。

Claude Codeで作り始めた

実際にClaude Codeで作り始めました。

名前はVox Score Workbenchにしました。ブラウザだけで動く、歌声合成のワークベンチです。

ピアノロールに音符を置き、歌詞を入れ、その場で歌わせます。エンジンは画面上部のボタンで切り替えます。

•A 内蔵合成(フォルマント合成。音源ファイル不要)

•B DiffSinger/ONNX(OpenUtauの音源フォルダをブラウザで直接読む)

•C HTTP(自前のサーバに投げる)

•D SoulX ワンショット(参照音声から即座に歌わせる)

同じ楽譜、同じ歌詞のまま、エンジンだけを切り替えて聴き比べられます。比較したかったのはまさにこれでした。いきなり、特に指定もしていないのにフォルマント合成を作って、実際に動いたのには驚きました。

内蔵合成を最初に作ったのは、音源が何もない状態でもピアノロールと歌詞と音素の対応を確認できるようにするためです。声としては素っ気ないのですが、「いま自分が書いた譜面が、どの音素として発音されるか」を即座に鳴らせます。作曲アルゴリズムをつなぐときの土台になります。

日本語の音素をどこで決めるか

作ってみて、いちばん神経を使ったのは音素の扱いでした。

歌声合成では、かなをそのまま渡すわけではありません。「か」はkとa、「し」はshとi、というように音素へ分解します。

やっかいなのは、この分解の規則が場所ごとにバラバラになりやすいことです。

エディター側の分解、学習データを作るときのアライナーの辞書、学習そのもの、そして書き出した音源フォルダ。この四か所で音素の定義がずれると、学習は成功しているのに特定の音だけ鳴らない、という掴みどころのない壊れ方をします。

そこで、音韻表を一か所だけに置き、他はすべてそこから生成する構造にしました。アライナー用の辞書も、OpenUtau音源に同梱するdsdictも、同じ表から自動で作ります。

日本語特有の規則も、規則として明示的に持たせました。

•長音化(「向こう」はmukouではなくmukoo)

•が行鼻濁音(語頭以外のがを[ŋ]で歌う)

•撥音の調音位置同化(「こんばん」のんは[m]、「さんかく」のんは[ŋ])

•促音+摩擦音(「まっすぐ」のっは無音ではなくsの引き伸ばし)

どの規則が効いたかは画面で追えるようにしました。「ありがとう」と入れると、a r i ŋ a t o oと表示され、鼻濁音の規則が働いたことが分かります。

規則で解けない語は辞書で個別に指定します。かな→かなの読み替えで持つので、モーラ数が保たれ、音符との対応が崩れません。

このあたりは、とりちゃんの歌をどう発音していたかを、あとから自分で調整できるようにするための下ごしらえでもあります。

SoulX-Singerに日本語が無かった

ゼロショットの検証のため、SoulX-Singerを組み込みました。

組み込む前に、実装を読んで入出力の仕様を確認しました。

このモデルの音素語彙は2820個で、内訳は広東語、中国語、英語だけでした。日本語の音素は一つもありません。学習データも中国語、英語、広東語の42000時間です。まあ、わかっていたことではあるのですが。

日本語を歌わせるには、かなを既存の音素体系のどれかに写像するしかありません。

中国語や広東語は音節まるごとが一つのトークンなので、日本語にあってそちらに無い音節(ki、ti、tu、siなど)を作れません。しかも全音節に声調が付きます。

英語はARPAbetという音素単位の体系なので、任意のモーラを組み立てられます。「か」はK+AA、「し」はSH+IY、「つ」はT+S+UWという具合です。

つまり、英語の音素で日本語を歌わせることになります。

実際に鳴らしてみると、たしかに歌になっていました。ただし英語訛りの日本語です。旋律と声色は保たれますが、母語話者の発音にはなりません。

そこで、歌詞を英語で書けるモードも用意しました。英語はこのモデルの学習言語そのものなので、こちらは訛りません。発音はSoulX自身が使っているg2p_enに引いているので、モデルが学習時に見た音素と一致します。

日本語で書けば訛る。英語で書けば訛らない。この二つを画面上で切り替えられるようにしておきました。

DGX Sparkでの現実

学習と推論はDGX Sparkで回しています。

ここで、想定していなかった問題にいくつもぶつかりました。

DiffSingerのデータセット作りで標準的に使われるMFAというアライナーは、DGX SparkのCPUアーキテクチャ(aarch64)向けのビルドが存在しませんでした。公式のDockerイメージもamd64だけです。

代わりにSOFAという歌唱向けアライナーを使いました。純粋なPyTorch実装なので動きます。日本語の学習済みモデルも公開されていました。

ただし、SOFAのモデルは固定の音素語彙で学習されています。こちらの音素セットがその中に収まっていないと、動くけれど結果が意味を成さない、という一番厄介な壊れ方をします。

そこで、取得した時点で機械的に突き合わせるようにしました。結果は35音素中34が一致し、欠けていたのはvだけでした。

vはヴァイオリンのような外来語にしか出ません。日本語の歌唱では慣用的にbで歌われます。そこで、生成元の一か所でv→bに畳むようにしました。これで四か所すべての音素セットが自動的に揃います。

このほか、torchaudioが音声読み込みを別ライブラリに委ねるようになっていて、そのライブラリにこのtorchバージョン向けのビルドが無い、といった問題も出ました。読み込みの部分だけ差し替えることで通しました。

こうした細かい修正が開発時間の大半を占めます。

参照音声を自動で組み立てる

ゼロショットで歌わせるには、参照音声だけでは足りません。その音声で何を歌っているか、どの音符に乗っているかという情報が必要です。

SoulX側にも自動化の仕組みはあるのですが、歌詞の書き起こしに使っているのが中国語と英語の音声認識で、日本語のモデルがありません。

一方で、音符とアラインメントは言語に依りません。音素の境界はSOFAが出せますし、音高はf0から取れます。

つまり、歌詞さえこちらで与えれば、残りは全部自動にできます。

そこで、音声とかなを渡すと、音素境界を合わせて音符を拾い、参照音声として登録する仕組みを作りました。

自分でVox Forgeに録音したテイクなら歌詞も音符も既知なので、そちらは完全に自動になります。

とりちゃんの歌唱については、歌っている内容をかなで入力する必要があります。

登録した声はサーバ側に残るようにしました。次からは一覧から選ぶだけで、その声で歌わせられます。

データが増やせない相手にこそ効く

DiffSingerの専用モデルは、辞書のすべての音素が20回以上出てくる程度のデータが目安とされていて、1時間前後の歌唱が必要。

私自身の声なら、いくらでも録れます。Vox Forgeには、足りない音素を優先して埋める収録リストを作る機能を入れました。1時間と指定すれば354項目のリストが出て、録るほど残りが短くなります。

しかし、とりちゃんの歌唱は3曲ちょっとで、それ以上は増えません。

専用学習は、データを増やせる相手に効きます。ゼロショットは、データを増やせない相手にこそ有用です。

SoulX-Singerが必要とする参照音声は10秒から20秒で済みます。

もちろん、参照音声から取れるのは主に声色で、その人固有の歌い回しや息遣いまで再現できるとは限りません。

それでも、増やせないものを前提にした技術がここ数年で急速に育っているという事実は、自分にとって大きな意味を持ちます。

ただ、DiffSingerもRVCを併用した学習データのコンバートなどを追加開発すれば、だいぶ楽になると思います。そうしたカスタマイズができるのも、ヴァイブ自前開発のいいところですね。

いまできていること、まだできていないこと

現時点でできているのは、

•ブラウザ上のワークベンチで、MIDIと歌詞から歌わせる

•SoulX-Singerによるゼロショット生成が、DGX Spark上で1回(10秒)あたり2.5秒程度

•参照音声を登録し、一覧から選んで使い回す

•OpenUtauのDiffSinger音源をブラウザで直接読み込む

•データセット作成環境と、学習用スクリプト一式

できていないのは、

•とりちゃんのDiffSinger専用モデルの学習(データセットがまだ無い)

•RVCの同一画面への統合(比較の要なので、次に手を付けます)

•歌い回しやビブラートの再現

MIDIの読み込みも入れました。複数トラックのMIDIからボーカルトラックを選び、歌詞メタイベントがあればそれも音符に載せます。作曲アルゴリズムの出力を、そのまま流し込むための入り口です。

試しに初期ユーミン風バラードを生成し、そのMIDIデータと歌詞プロンプトをSoulX-Singer版とりちゃんで歌ってもらい、それをLogic Pro上で合わせたもの、それをSunoに取り込んでCover(とりちゃんのVoiceで)してみました。

SoulX-Singerはもともと英語と中国語しかサポートしていないところを、英語話者のカタコト日本語のように歌わせているので、発音はそれなりですが、とりあえずそれっぽくはなっています。

ただ、1分半ほどいくと、発音が怪しくなってくるので、1回での生成には限界があるようですね。

これをSunoに取り込み、妻のVoiceで歌わせたバージョンも作ってみました。ここにできるだけ近づけていくのが目標です(道は遠い)。

作曲アルゴリズムとつなぐ

ここまで作ってきて、当初の目的に戻ります。

作曲アルゴリズムが出したMIDIと歌詞を、ワークベンチに読み込み、とりちゃんの声で鳴らす。聴いて、コードを一つ変え、また鳴らす。


その往復が、Sunoを経由せずにできるようになりつつあります。

作曲アルゴリズム→MIDIと歌詞→とりちゃんの歌声→試聴と評価→アルゴリズムを修正

コード進行を変えたときの響きの違いを、とりちゃんの声で聴き分ける。メロディーを1音動かしたときの歌いやすさを、とりちゃんの声で確かめる。歌詞の一語を置き換えたときの発音を、とりちゃんの声で比べる。

これは、完成品を評価する作業とは違います。作曲そのものが、その声を聴きながら進むということです。

LipSync Avatarでは、交換日記をもとにした対話ができるようになりました。NHKに出演したときは、AIスタートアップのクリスタルメソッドに開発してもらったアバターを使いましたが、それは自前でできるようになりました。


番組では、歌詞のヒントとなるフレーズを妻のアバターが考え、その続きを僕がSunoとRVCを使って完成させました。


これを、自作のアバターシステムの中でできるようにする、という道筋が少し見えてきた気がします。

《松尾公也》

Amazon売れ筋ランキング

松尾公也

テクノエッジ編集部 シニアエディター / コミュニティストラテジスト @mazzo

特集

BECOME A MEMBER

『テクノエッジ アルファ』会員募集中

最新テック・ガジェット情報コミュニティ『テクノエッジ アルファ』を開設しました。会員専用Discrodサーバ参加権やイベント招待、会員限定コンテンツなど特典多数です。