C#とJavaScriptでテキストを読み上げるアプリを作成します。
C# WindowsFormsでテキストを読み上げる
まず参照の追加で System.Speech を追加します。あとは以下のコードで読み上げさせることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System; using System.Text; using System.Windows.Forms; using System.Speech.Synthesis; public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { SpeechSynthesizer synthesizer = new SpeechSynthesizer(); synthesizer.SetOutputToDefaultAudioDevice(); synthesizer.Speak("読み上げさせたい文字列"); synthesizer.Dispose(); } } |
読み上げの声の情報は以下のコードで取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public partial class Form1 : Form { private void button2_Click(object sender, EventArgs e) { SpeechSynthesizer synthesizer = new SpeechSynthesizer(); StringBuilder sb = new StringBuilder(); foreach (var voice in synthesizer.GetInstalledVoices()) { var info = voice.VoiceInfo; string str = $"Id: {info.Id} | Name: {info.Name} | Age: {info.Age} | Gender: {info.Gender} | Culture: {info.Culture}"; sb.Append(str + "\n"); } synthesizer.Dispose(); // string str = sb.ToString(); で情報を取得できる } } |
鳩でもわかるC#管理人の場合は以下のように出力されました。日本語と英語をそれぞれ女性の声で読み上げます。
1 2 |
Id: TTS_MS_JA-JP_HARUKA_11.0 | Name: Microsoft Haruka Desktop | Age: Adult | Gender: Female | Culture: ja-JP Id: TTS_MS_EN-US_ZIRA_11.0 | Name: Microsoft Zira Desktop | Age: Adult | Gender: Female | Culture: en-US |
音声ファイルとして保存する
読み上げではなく音声ファイルとして保存するのは以下のようにします。
SetOutputToDefaultAudioDeviceメソッドの代わりにSetOutputToWaveFileメソッドを呼び出すことで指定したパスにwavファイルとして保存できます。
1 2 3 4 5 6 7 8 9 10 |
public partial class Form1 : Form { private void button3_Click(object sender, EventArgs e) { SpeechSynthesizer synthesizer = new SpeechSynthesizer(); synthesizer.SetOutputToWaveFile(@"d:\voice.wav"); // wavとして保存する パスを指定する synthesizer.Speak("読み上げさせたい文字列"); synthesizer.Dispose(); } } |
JavaScriptでテキストを読み上げる
JavaScriptでも同じようにテキストの読み上げは可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>テキストを読み上げる</title> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <input type="text" id="speech_text" value="ここに読み上げさせたい文字列を入力してください。" size="50"><br> <input type="button" id="speech_button" value="話す"> <input type="button" id="stop_button" value="止める"> <input type="button" id="start_button" value="再開"> <select id = "voice"></select> <script> let voices = window.speechSynthesis.getVoices(); let select = document.getElementById('voice'); voices.forEach((v) => { const option = document.createElement('option'); option.value = v.name; option.textContent = v.name; select.appendChild(option); }); document.getElementById("speech_button").addEventListener("click", Speech); document.getElementById("stop_button").addEventListener("click",()=>{ window.speechSynthesis.pause(); }); document.getElementById("start_button").addEventListener("click",()=>{ window.speechSynthesis.resume(); }); function Speech(){ window.speechSynthesis.cancel(); const uttr = new SpeechSynthesisUtterance(document.getElementById("speech_text").value); // 読み上げの速度 0.0(遅い)~1.0(標準)~2.0(速い) uttr.rate=1.0; // 読み上げの声の高さ 0.0(低め)~1.0(標準)~2.0(高め) uttr.pitch=1.0; // 読み上げが完了したときに実行する関数 uttr.onend = OnSpeechEnd; uttr.voice = window.speechSynthesis.getVoices().filter(voice => voice.name === select.value)[0]; // 読み上げ開始 window.speechSynthesis.speak(uttr); } function OnSpeechEnd(){ //alert("終了"); } </script> </body> </html> |