ENG のテキスト (文字列) を C# の音声 (サウンド) に変換する方法を探しています。このタスクに役立つ方法やオープンソースのライブラリを知っている人はいますか?
6 に答える
.NET lib( System.Speech.Synthesis ) を使用できます。
マイクロソフトによると:
System.Speech.Synthesis 名前空間には、音声合成エンジンの初期化と構成、プロンプトの作成、音声の生成、イベントへの応答、音声特性の変更を可能にするクラスが含まれています。音声合成は、テキスト読み上げまたは TTS と呼ばれることがよくあります。
音声シンセサイザーは、テキストを入力として受け取り、オーディオ ストリームを出力として生成します。音声合成は、テキスト読み上げ (TTS) とも呼ばれます。
シンセサイザーは、文字列を音声ストリームに正確に変換するために、実質的な分析と処理を実行する必要があります。これがどのように機能するかを想像する最も簡単な方法は、2 つの部分からなるシステムのフロント エンドとバック エンドを想像することです。
テキスト分析
フロントエンドは、自然言語ルールを使用したテキストの分析に特化しています。文字列を分析して、単語がどこにあるかを判断します (英語では簡単に実行できますが、中国語や日本語などの言語では簡単ではありません)。このフロントエンドは、関数や品詞などの文法の詳細も把握します。たとえば、どの単語が固有名詞、数字などであるか。文の始まりと終わり。フレーズが質問かステートメントか。ステートメントが過去、現在、または未来の時制であるかどうか。
これらの要素はすべて、単語、フレーズ、文の適切な発音とイントネーションを選択するために重要です。英語では、質問は通常上昇ピッチで終わるか、または「read」という単語は時制によって非常に異なる発音になることを考慮してください。明らかに、単語やフレーズがどのように使用されているかを理解することは、テキストを音声に解釈する上で重要な側面です。さらに複雑なことに、規則は言語ごとにわずかに異なります。したがって、ご想像のとおり、フロントエンドは非常に高度な分析を行う必要があります。
サウンドジェネレーション
バックエンドには、まったく異なるタスクがあります。フロントエンドで行われた分析を利用し、独自の重要な分析を通じて、入力テキストに適したサウンドを生成します。古いシンセサイザー (およびフットプリントが最小の今日のシンセサイザー) は、個々のサウンドをアルゴリズムで生成するため、非常にロボット的なサウンドになります。Windows Vista や Windows 7 などの最新のシンセサイザーは、何時間にもわたる録音された音声から構築されたサウンド セグメントのデータベースを使用します。バックエンドの有効性は、与えられた入力に対して適切なサウンド セグメントを選択し、それらをスムーズにつなぎ合わせる能力に依存します。
使用する準備ができて
上記のテキスト読み上げ機能は、Windows Vista および Windows 7 オペレーティング システムに組み込まれており、アプリケーションでこのテクノロジを簡単に使用できます。これにより、独自の音声エンジンを作成する必要がなくなります。このすべての処理を 1 回の関数呼び出しで呼び出すことができます。文字列の内容を読み上げるを参照してください。
このコードを試してください:
using System.Speech.Synthesis;
namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            SpeechSynthesizer synthesizer = new SpeechSynthesizer();
            synthesizer.Volume = 100;  // 0...100
            synthesizer.Rate = -2;     // -10...10
            // Synchronous
            synthesizer.Speak("Hello World");
            // Asynchronous
            synthesizer.SpeakAsync("Hello World");
        }
    }
}
この機能は、 System.Speech名前空間のメイン クラス ライブラリに存在します。特に、System.Speech.Synthesisを見てください。
System.Speech.dllへの参照を追加する必要がある可能性が高いことに注意してください。
SpeechSynthesizer クラスは、ホスト コンピューターにインストールされている音声合成エンジンの機能へのアクセスを提供します。インストールされた音声合成エンジンは、Microsoft Anna などの音声で表されます。SpeechSynthesizer インスタンスは、既定の音声に初期化されます。インストールされている他の音声のいずれかを使用するように SpeechSynthesizer インスタンスを構成するには、SelectVoice または SelectVoiceByHints メソッドを呼び出します。インストールされているボイスに関する情報を取得するには、GetInstalledVoices メソッドを使用します。
すべての MSDN ドキュメントと同様に、使用するコード サンプルがあります。以下は、System.Speech.Synthesis.SpeechSynthesizer クラスからのものです。
using System;
using System.Speech.Synthesis;
namespace SampleSynthesis
{
  class Program
  {
    static void Main(string[] args)
    {
      // Initialize a new instance of the SpeechSynthesizer.
      SpeechSynthesizer synth = new SpeechSynthesizer();
      // Configure the audio output. 
      synth.SetOutputToDefaultAudioDevice();
      // Speak a string.
      synth.Speak("This example demonstrates a basic use of Speech Synthesizer");
      Console.WriteLine();
      Console.WriteLine("Press any key to exit...");
      Console.ReadKey();
    }
  }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Speech.Synthesis; // first import this package
    namespace textToSpeech
    {
        public partial class home : Form
        {
            public string s = "pran"; // storing string (pran) to s
            private void home_Load(object sender, EventArgs e)
                {
                    speech(s); // calling the function with a string argument
                }
            private void speech(string args) // defining the function which will accept a string parameter
                {
                    SpeechSynthesizer synthesizer = new SpeechSynthesizer();
                    synthesizer.SelectVoiceByHints(VoiceGender.Male , VoiceAge.Adult); // to change VoiceGender and VoiceAge check out those links below
                    synthesizer.Volume = 100;  // (0 - 100)
                    synthesizer.Rate = 0;     // (-10 - 10)
                    // Synchronous
                    synthesizer.Speak("Now I'm speaking, no other function'll work");
                    // Asynchronous
                    synthesizer.SpeakAsync("Welcome" + args); // here args = pran
                }       
         }
    }
- 「SpeakAsync」を使用する方が良いでしょう。「Speak」関数が実行中/実行中は、動作が完了するまで他の関数が動作しないためです (個人的には推奨)。
最近、Google はGoogle Cloud Text To Speech を公開しました。
Google.Cloud.TextToSpeech の .NETクライアント バージョンは、 https ://github.com/jhabjan/Google.Cloud.TextToSpeech.V1 にあります。
ナゲット:Install-Package JH.Google.Cloud.TextToSpeech.V1
クライアントの使用方法の短い例を次に示します。
GoogleCredential credentials =
    GoogleCredential.FromFile(Path.Combine(Program.AppPath, "jhabjan-test-47a56894d458.json"));
TextToSpeechClient client = TextToSpeechClient.Create(credentials);
SynthesizeSpeechResponse response = client.SynthesizeSpeech(
    new SynthesisInput()
    {
        Text = "Google Cloud Text-to-Speech enables developers to synthesize natural-sounding speech with 32 voices"
    },
    new VoiceSelectionParams()
    {
        LanguageCode = "en-US",
        Name = "en-US-Wavenet-C"
    },
    new AudioConfig()
    {
        AudioEncoding = AudioEncoding.Mp3
    }
);
string speechFile = Path.Combine(Directory.GetCurrentDirectory(), "sample.mp3");
File.WriteAllBytes(speechFile, response.AudioContent);