日曜倧工のニュヌラルネットワヌク音声合成

珟圚、音声合成はさたざたな分野で䜿甚されおいたす。 これらは、音声アシスタント、IVRシステム、スマヌトホヌムなどです。 タスク自䜓は、私の奜みでは、非垞に明確で理解しやすいものです。曞かれたテキストは、人がするように発音されるべきです。



少し前に、他の倚くの分野ず同様に、機械孊習は音声合成の分野に入りたした。 システム党䜓の倚くのコンポヌネントをニュヌラルネットワヌクに眮き換えるこずができるため、既存のアルゎリズムの品質にアプロヌチできるだけでなく、それらを倧幅に䞊回るこずができたす。







私は完党にニュヌラルネットワヌクの統合を自分の手で行い、同時にコミュニティで経隓を共有しようずするこずにしたした。 これの由来は、猫の䞋を芋るこずでわかりたす。



音声合成



音声合成システムを構築するには、さたざたな分野の専門家チヌム党䜓が必芁です。 それらのそれぞれに぀いお、アルゎリズムずアプロヌチのホストがありたす。 基本的なアプロヌチを説明する博士論文ず厚手の本が曞かれおいたす。 それらのそれぞれの衚面的な理解から始めたしょう。



蚀語孊



  1. テキストの正芏化 。 最初に、すべおの略語、数字、日付をテキストに展開する必芁がありたす。 20䞖玀の50幎代は20䞖玀の50代になり 、サンクトペテルブルクの郜垂、ボリショむpr。P.S. サンクトペテルブルク垂、ボリショむペトログラヌド偎の展望 。 これは、曞かれたものを読むように人に求められたかのように自然に起こるはずです。
  2. ストレス蟞曞の準備 。 アクセントは、蚀語の芏則に埓っお配眮できたす。 英語では、最初の音節に重点が眮かれるこずが倚く、スペむン語では最埌から2番目の音節に重点が眮かれたす。 さらに、これらのルヌルからは、䞀般的なルヌルに埓わない䟋倖が倚数ありたす。 それらを考慮する必芁がありたす。 䞀般的な意味でのロシア語の堎合、ストレスを配眮するためのルヌルはたったく存圚しないため、ストレスが配眮された蟞曞がなければ、行く方法はたったくありたせん。
  3. ホモグラフィの削陀 。 ホモグラフは、スペルは䞀臎するが発音が異なる単語です。 ネむティブスピヌカヌは簡単にストレスをかけるこずができたす ドアロックず山の城 。 しかし、 ロックの鍵はより難しいタスクです。 文脈を考慮するこずなくホモグラフィを完党に削陀するこずは䞍可胜です。


プロ゜ディカ



  1. シンタグマの匷調衚瀺ず䞀時停止 。 シンタグマは、意味においお比范的完成した音声のセグメントを衚したす。 人が話すずき、圌は通垞、文の間にポヌズを挿入したす。 テキストをそのような構文に分割する方法を孊ぶ必芁がありたす。
  2. むントネヌションのタむプの決定 。 完党性、疑問、感嘆の衚珟は最も単玔なむントネヌションです。 しかし、皮肉、疑念、熱意を衚珟するこずは、はるかに難しい課題です。


音声孊



  1. 文字起こしを取埗する 。 最終的にはラむティングではなく発音を䜿甚するため、文字曞蚘玠の代わりに音音玠を䜿甚するこずが論理的であるこずは明らかです。 曞蚘玠の録音を音玠に倉換するこずは、倚くのルヌルず䟋倖で構成される別のタスクです。
  2. むントネヌションパラメヌタの蚈算 。 この時点で、配眮されたポヌズ、遞択された音玠シヌケンス、衚珟されたむントネヌションのタむプに応じお、ピッチず発音速床がどのように倉化するかを決定する必芁がありたす。 基本的なトヌンず速床に加えお、長時間実隓できる他のパラメヌタヌがありたす。


音響孊



  1. 音の芁玠の遞択 。 合成システムは、いわゆる異音で動䜜したす-環境に応じお、音玠の実珟。 トレヌニングデヌタのレコヌドは、音玠マヌキングによっお断片に切り分けられ、異音のベヌスを圢成したす。 各異音は、コンテキスト音玠近傍、ピッチ、持続時間などの䞀連のパラメヌタによっお特城付けられたす。 合成プロセス自䜓は、珟圚の条件に最も適した、異音の正しいシヌケンスの遞択です。
  2. 倉曎および効果音 。 結果の録音では、合成埌の音声を人間の音声に少し近づけたり、䜕らかの欠陥を修正したりする特別なフィルタヌが必芁になる堎合がありたす。


これがすべお簡単になり、頭の䞭で理解できるか、個々のモゞュヌルのヒュヌリスティックをすぐに芋぀けられるず思われたら、ヒンディヌ語で合成する必芁があるず想像しおください。 蚀語がわからない堎合、適切なレベルの蚀語を知っおいる人を匕き付けるこずなく、合成の品質を評䟡するこずさえできたせん。 私の母囜語はロシア語で、合成がストレスず間違えられたり、間違った口調で話されたりするず聞こえたす。 しかし同時に、合成されたすべおの英語の音は、私にずっおはほが同じであり、より゚キゟチックな蚀語は蚀うたでもありたせん。



実装



シンセシスのEnd-2-EndE2E実装を芋぀けようずしたす。これは、蚀語の埮劙な点に関連するすべおの困難を匕き受けたす。 蚀い換えるず、入力ずしおテキストを受け取り、出力ずしお合成音声を生成するニュヌラルネットワヌクに基づいたシステムを構築したいず考えおいたす。 狭い地域の専門家チヌム党䜓を機械孊習に特化したチヌム堎合によっおは1人でもに眮き換えるようなネットワヌクをトレヌニングするこずは可胜ですか



end2end ttsリク゚ストで、Googleは倚数の結果を生成したす。 䞀番䞊にあるのは、Google自䜓からのTacotronの実装です。 この分野の研究に埓事し、さたざたなアヌキテクチャの実装を共有しおいるGithubの特定の人々から行くこずは、私にずっお最も簡単に思えたした。



私は3぀を遞びたす



  1. キュビョン公園
  2. キヌス・むト
  3. 山本韍䞀


リポゞトリでそれらを芋お、情報の倉庫がありたす。 E2E合成の問題には、倚くのアヌキテクチャずアプロヌチがありたす。 䞻なものの䞭で



  1. タコトロンバヌゞョン1、2。
  2. DeepVoiceバヌゞョン1、2、3。
  3. Char2Wav。
  4. DCTTS。
  5. WaveNet


いずれかを遞択する必芁がありたす。 将来の実隓の基瀎ずしお、 久by公園のディヌプコンボリュヌショナルテキスト読み䞊げDCTTSを遞択したした。 オリゞナルの蚘事はこちらでご芧いただけたす 。 実装を詳しく芋おみたしょう。



著者は、合成の結果を3぀の異なるベヌスで、トレヌニングの異なる段階でレむアりトしたした。 私の趣味ずしおは、ネむティブスピヌカヌではないにしおも、かなりたずもです。 私のデヌタベヌスにはほが同皋床の量のデヌタが含たれおいるため、最埌の英語のデヌタベヌスケむトりィンスレットのオヌディオブックにはわずか5時間のスピヌチしか含たれおいたせん。



システムをトレヌニングしおしばらくしお、リポゞトリに著者が韓囜語のモデルを正垞にトレヌニングしたずいう情報が衚瀺されたした。 これは非垞に重芁です。蚀語は倧きく異なる可胜性があり、蚀語に察する堅牢性は玠晎らしい远加機胜だからです。 トレヌニングプロセス䞭、トレヌニングデヌタの各セットぞの特別なアプロヌチ蚀語、音声、たたはその他の特性は必芁ないこずが予想されたす。



この皮のシステムのもう1぀の重芁なポむントは、トレヌニング時間です。 私が持っおいるその鉄のタコトロンは、私の掚定によるず、玄2週間勉匷したす。 初期レベルでのプロトタむピングに぀いおは、リ゜ヌスを集䞭的に䜿甚するように思えたした。 もちろん、ペダルをねじる必芁はありたせんが、いく぀かの基本的なプロトタむプを䜜成するには倚くのカレンダヌ時間がかかりたす。 最終バヌゞョンのDCTTSは、数日で孊習したす。



各研究者には、自分の仕事で䜿甚する䞀連のツヌルがありたす。 誰もが奜みに合わせおそれらを遞択したす。 私はPyTorchが本圓に奜きです。 残念ながら、DCTTSの実装を芋぀けるこずができず、TensorFlowを䜿甚する必芁がありたした。 おそらくある時点で、実装をPyTorchに投皿するでしょう。



トレヌニングデヌタ



合成を実装するための優れた基盀は、成功の䞻な保蚌です。 新しい声の準備は非垞に培底的に行われおいたす。 プロのアナりンサヌが事前に準備したフレヌズを䜕時間も発音したす。 発話ごずに、すべおのポヌズに耐え、ゞャヌクやスロヌダりンなしで話をし、基本音の正しいアりトラむンを再珟し、これらすべおを正しいむントネヌションで再珟する必芁がありたす。 ずりわけ、すべおの声が同じように心地よく聞こえるわけではありたせん。



プロのアナりンサヌによっお蚘録された玄8時間のベヌスを手にしたした。 私の同僚ず私は珟圚、この音声を非営利目的で自由に利甚できるようにする可胜性に぀いお議論しおいたす。 すべおがうたくいけば、録音自䜓に加えお、音声付きの配信にそれぞれの正確なテキストが含たれたす。



始めたしょう



入力ずしおテキストを受け取り、出力ずしお合成されたサりンドを生成するネットワヌクを䜜成したす。 豊富な実装はこれが可胜であるこずを瀺しおいたすが、もちろん倚くの予玄がありたす。



メむンシステムパラメヌタヌは通垞ハむパヌパラメヌタヌず呌ばれ、個別のファむルに取り出されたす。このファむルは、この䟋のようにhparams.pyたたはhyperparams.pyず呌ばれたす。 メむンコヌドに觊れるこずなくツむストできるすべおのものは、ハむパヌパラメヌタヌで取り出されたす。 ログのディレクトリから始たり、隠しレむダヌのサむズで終わりたす。 その埌、コヌド内のハむパヌパラメヌタヌは次のように䜿甚されたす。



from hyperparams import Hyperparams as hp batch_size = hp.B #     
      
      





さらに、 hp接頭蟞を持぀すべおの倉数。 ハむパヌパラメヌタヌファむルから取埗。 これらのパラメヌタはトレヌニングプロセス䞭に倉曎されないため、新しいパラメヌタで䜕かを再起動する堎合は泚意しおください。



テキスト



テキストの凊理には、通垞、最初に配眮されるいわゆる埋め蟌みレむダヌが䜿甚されたす。 その本質はシンプルです-文字ベクトルを文字ベクトルに関連付ける単なるプレヌトです。 孊習プロセスでは、これらのベクトルに最適な倀を遞択し、完成したモデルに埓っお合成するずきに、このプレヌトから倀を取埗したす。 このアプロヌチは、すでに広く知られおいるWord2Vecで䜿甚されおおり、単語のベクトル衚珟が構築されたす。



たずえば、単玔なアルファベットを䜿甚したす。



 ['a', 'b', 'c']
      
      





孊習プロセスにおいお、各シンボルの最適倀は次のずおりであるこずがわかりたした。



 { 'a': [0, 1], 'b': [2, 3], 'c': [4, 5] }
      
      





次に、埋め蟌み局を通過した埌のaabbcc行に぀いお、次のマトリックスを取埗したす。



 [[0, 1], [0, 1], [2, 3], [2, 3], [4, 5], [4, 5]]
      
      





このマトリックスは、シンボルの抂念で動䜜しなくなった他のレむダヌに送られたす。



珟時点では、私たちの囜に最初に珟れる制限がありたす。合成のために送信できる文字のセットは限られおいたす。 キャラクタヌごずに、できれば異なるコンテキストで、れロ以倖の数のトレヌニングデヌタのサンプルが必芁です。 これは、アルファベットの遞択に泚意する必芁があるこずを意味したす。



私の実隓では、オプションを決定したした



 #       vocab = "E -"
      
      





これは、ロシア語のアルファベット、ハむフン、スペヌス、および行末の指定です。 いく぀かの重芁なポむントず仮定がありたす。



  1. アルファベットに句読点を远加したせんでした。 䞀方では、実際には発音したせん。 䞀方、句読点によれば、フレヌズを郚分シンタグマに分割し、䞀時停止で分割したす。 システムはどのように実行を蚱せないず発音したすか
  2. アルファベットには数字がありたせん。 合成を適甚する前、぀たり正芏化する前に、それらが数字に展開されるこずを期埅しおいたす。 䞀般に、私が芋たすべおのE2Eアヌキテクチャには、正確に正芏化されたテキストが必芁です。
  3. アルファベットにはラテン文字がありたせん。 英語システムは発音できたせん。 あなたは音蚳を詊しお、匷いロシア語のアクセントを埗るこずができたす。
  4. アルファベットにはeずいう文字がありたす。 システムをトレヌニングしたデヌタでは、システムが必芁な堎所に立っおいたため、この配眮を倉曎しないこずにしたした。 しかし、私が結果を評䟡しおいた瞬間に、今、合成を申請する前に、この文字も正しく蚭定する必芁があるこずがわかりたした。そうでなければ、システムはeではなくeを正確に発音したす。


将来のバヌゞョンでは、各アむテムにさらに泚意を払うこずができたすが、今のずころは、そのようなわずかに単玔化された圢匏のたたにしおおきたす。



音



ほずんどすべおのシステムは、信号自䜓ではなく、特定のステップでりィンドりで取埗されたさたざたな皮類のスペクトルで動䜜したす。 詳现に぀いおは説明したせんが、このトピックに぀いおはさたざたな皮類の文献がありたす。 実装ず䜿甚に焊点を圓おたす。 DCTTS実装では、振幅スペクトルずチョヌクスペクトルの2皮類のスペクトルが䜿甚されたす。



これらは次のように考慮されたすこのリストおよび埌続のすべおのコヌドはDCTTS実装から取埗されたすが、明確にするために倉曎されおいたす。



 #      y, sr = librosa.load(wavename, sr=hp.sr) #     y, _ = librosa.effects.trim(y) # Pre-emphasis  y = np.append(y[0], y[1:] - hp.preemphasis * y[:-1]) #    linear = librosa.stft(y=y, n_fft=hp.n_fft, hop_length=hp.hop_length, win_length=hp.win_length) #   mag = np.abs(linear) # - mel_basis = librosa.filters.mel(hp.sr, hp.n_fft, hp.n_mels) mel = np.dot(mel_basis, mag) #    mel = 20 * np.log10(np.maximum(1e-5, mel)) mag = 20 * np.log10(np.maximum(1e-5, mag)) #  mel = np.clip((mel - hp.ref_db + hp.max_db) / hp.max_db, 1e-8, 1) mag = np.clip((mag - hp.ref_db + hp.max_db) / hp.max_db, 1e-8, 1) #       mel = mel.T.astype(np.float32) mag = mag.T.astype(np.float32) #      t = mel.shape[0] num_paddings = hp.r - (t % hp.r) if t % hp.r != 0 else 0 mel = np.pad(mel, [[0, num_paddings], [0, 0]], mode="constant") mag = np.pad(mag, [[0, num_paddings], [0, 0]], mode="constant") #     - mel = mel[::hp.r, :]
      
      





蚈算には、ほがすべおのE2E合成プロゞェクトでLibROSAラむブラリ https://librosa.github.io/librosa/ が䜿甚されたす 。 これには倚くの有甚なものが含たれおいたす。ドキュメントを調べお、内容を確認するこずをお勧めしたす。



次に、䜿甚したデヌタベヌスのファむルの1぀で振幅スペクトルがどのように芋えるかを芋おみたしょう。









りィンドりスペクタヌを衚すこのオプションはスペクトログラムず呌ばれたす。 秒単䜍の時間は暪座暙にあり、ヘルツ単䜍の呚波数は瞊座暙にありたす。 スペクトルの振幅が色で匷調衚瀺されたす。 ポむントが明るいほど、振幅は倧きくなりたす。



チョヌクスペクトルは振幅スペクトルですが、チョヌクスケヌルで特定のステップずりィンドりで撮圱されたす。 事前にステップ数を蚭定したす;ほずんどの実装では、倀80が合成に䜿甚されたす hp.n_melsパラメヌタヌで蚭定。 チョヌクスペクトルぞの移行は、デヌタ量を倧幅に削枛できたすが、同時に音声信号にずっお重芁な特性を保持したす。 同じファむルのチョヌクスペクトログラムは次のずおりです。









リストの最埌の行で、チョヌクスペクトルが時間ずずもに薄くなるこずに泚意しおください。 それぞれ4぀のベクトル hp.r == 4 のみを䜿甚するため、サンプリング呚波数が削枛されたす。 音声合成では、䞀連の文字からチョヌクスペクトルを予枬したす。 考え方は単玔です。ネットワヌクの予枬が小さいほど、うたく察凊できたす。



スペクトログラムは音声で取埗できたすが、聞くこずはできたせん。 したがっお、信号を元に戻す必芁がありたす。 これらの目的のために、システムは倚くの堎合、Griffin-Limアルゎリズムずその最新の解釈たずえば、RTISILA、 link を䜿甚したす。 このアルゎリズムにより、振幅スペクトルから信号を埩元できたす。 私が䜿甚した実装



 def griffin_lim(spectrogram, n_iter=hp.n_iter): x_best = copy.deepcopy(spectrogram) for i in range(n_iter): x_t = librosa.istft(x_best, hp.hop_length, win_length=hp.win_length, window="hann") est = librosa.stft(x_t, hp.n_fft, hp.hop_length, win_length=hp.win_length) phase = est / np.maximum(1e-8, np.abs(est)) x_best = spectrogram * phase x_t = librosa.istft(x_best, hp.hop_length, win_length=hp.win_length, window="hann") y = np.real(x_t) return y
      
      





そしお、振幅スペクトログラムからの信号は、次のように埩元できたすスペクトルを取埗するのず逆の手順。



 #  mag = mag.T #  mag = (np.clip(mag, 0, 1) * hp.max_db) - hp.max_db + hp.ref_db #      mag = np.power(10.0, mag * 0.05) #   wav = griffin_lim(mag**hp.power) # De-pre-emphasis  wav = signal.lfilter([1], [1, -hp.preemphasis], wav)
      
      





振幅スペクトルを取埗しお、埩元しおから、詊しおみたしょう。



オリゞナル



埩元された信号

私の奜みでは、結果は悪化しおいたす。 Tacotronの著者最初のバヌゞョンもこのアルゎリズムを䜿甚は、Griffin-Limアルゎリズムを䞀時的な゜リュヌションずしお䜿甚しお、アヌキテクチャの機胜を実蚌しおいるこずに泚目したした。 WaveNetおよび同様のアヌキテクチャにより、より質の高い音声を合成できたす。 しかし、それらはよりヘビヌりェむトであり、トレヌニングには倚少の努力が必芁です。



トレヌニング



遞択したDCTTSは、2぀の実質的に独立したニュヌラルネットワヌクで構成されおいたすText2MelずSpectrogram Super-resolution NetworkSSRN。









Text2Melは、2぀の゚ンコヌダヌTextEnc、AudioEncず1぀のデコヌダヌAudioDecをリンクするアテンションメカニズムを䜿甚しお、テキスト内のチョヌクスペクトルを予枬したす。 Text2Melはたばらなチョヌクスペクトルを正確に埩元するこずに泚意しおください。



SSRNは、フレヌムの欠萜を考慮し、サンプリング呚波数を埩元しお、チョヌクスペクトルから完党な振幅スペクトルを埩元したす。



蚈算のシヌケンスに぀いおは、元の蚘事で詳しく説明しおいたす。 さらに、実装甚の゜ヌスコヌドがあるため、い぀でもデバッグしお埮劙なずころを調べるこずができたす。 実装の䜜者がいく぀かの堎所で蚘事から離れたこずに泚意しおください。 2぀のポむントを匷調したす。



  1. 正芏化のための远加の局正芏化局があり、それなしでは、著者によれば䜕も機胜したせんでした。
  2. 実装では、正芏化を改善するためにドロップアりトメカニズムを䜿甚したす。 これは蚘事にはありたせん。


8時間の録音数千ファむルを含む音声を取りたした。 巊の蚘録のみ



  1. テキストには、文字、スペヌス、ハむフンのみが含たれたす。
  2. テキストの長さはhp.max_Nを超えたせん。
  3. 垌釈埌のチョヌクスペクトルの長さはhp.max_Tを超えたせん。


私は5時間匷を埗たした。 すべおの蚘録に必芁なスペクトルを蚈算し、Text2MelずSSRNのトレヌニングを開始したした。 これはすべお非垞に巧劙に行われたす



 $ python prepro.py $ python train.py 1 $ python train.py 2
      
      





元のリポゞトリでは、 prepro.pyはprepo.pyず呌ばれるこずに泚意しおください 。 私の内なる完璧䞻矩者はこれに耐えられなかったので、改名したした。



DCTTSには畳み蟌み局のみが含たれおおり、TacotronのようなRNN実装ずは異なり、はるかに高速に孊習したす。



Intel Core i5-4670、16 Gb RAM、GeForce 1080を搭茉した私のマシンでは、Text2Melの5䞇ステップは15時間で孊習し、SSRNの7侇5ステップは5時間で孊習したす。 孊習プロセスの1000ステップに必芁な時間はほずんど倉わらなかったので、倚くのステップで孊習するのにどれだけの時間がかかるかを簡単に把握できたす。



バッチサむズはhp.Bで調敎できたす。 時々、孊習プロセスはメモリ䞍足で萜ちたため、パッチサむズを2に分割し、れロから孊習を再開したした。 この問題はTensorFlowの腞私は最新版を䜿甚しなかったずバッチ凊理の実装の耇雑さにあるず信じおいたす。 倀8ですべおが萜ちるのをやめたので、私はこれに察凊したせんでした。



結果



モデルがトレヌニングされた埌、最終的に合成を開始できたす。 これを行うには、ファむルにフレヌズを入力しお実行したす



 $ python synthesize.py
      
      





実装を少し調敎しお、目的のファむルからフレヌズを生成したした。



結果はwaveファむルの圢匏で、 samplesディレクトリに保存されたす 。 私が手に入れた合成システムの䟋を次に瀺したす。





結論ず発蚀



結果は、品質に察する私の個人的な期埅を䞊回りたした。 システムはストレスをかけ、スピヌチは読みやすく、音声は認識可胜です。 䞀般に、最初のバヌゞョンでは悪くありたせんでした。特に、トレヌニングに䜿甚されたのは5時間のトレヌニングデヌタだけだったためです。



そのような合成の可制埡性に぀いおは疑問が残っおいたす。 それが間違っおいる堎合、単語のストレスを修正するこずさえ䞍可胜です。 フレヌズの最倧長ずチョヌクスペクトログラムのサむズに厳密に関連付けられおいたす。 むントネヌションず再生速床を制埡する方法はありたせん。



元の実装のコヌドに倉曎を投皿したせんでした。 圌らは、既補システムによる合成のためのトレヌニングデヌタずフレヌズの読み蟌み、およびハむパヌパラメヌタヌの倀アルファベット hp.vocab ずバッチのサむズ hp.B のみに関係しおいたした。 残りの実装は元のたたです。



話の䞀郚ずしお、私はそのようなシステムの実装の生産のトピックにたったく觊れたせんでした、それはただ完党にE2E音声合成システムから非垞に遠いです。 私はCUDAでGPUを䜿甚したしたが、それでもすべおがリアルタむムよりも䜎速です。 すべおがCPUでずお぀もなくゆっくり動䜜するだけです。



これらの問題はすべお、今埌数幎間で倧䌁業や科孊コミュニティによっお察凊されたす。 非垞に興味深いものになるず確信しおいたす。



All Articles