首頁 > 軟體

C#實現文字轉語音功能

2022-03-27 16:00:14

本文範例為大家分享了C#實現文字轉語音的具體程式碼,供大家參考,具體內容如下

客戶提出要求,將文字內容轉為語音,因為內網環境,沒辦法採用聯網,線上這種方式,靈機一動,能否寫一個簡單的例子呢,搜尋相關資料還真行,話不多說,有圖有真相

關鍵是,c#有現成的一個參照

右鍵點選專案 > 新增參照 > .Net > 找到System.Speech點選確定

控制檯程式程式碼:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Speech.Synthesis;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
 
 
namespace TxtToVoice
{
    class Program
    {
        [STAThread] //預設執行緒模型是單執行緒單元 (STA) 模式
        static void Main(string[] args)
        {
 
            //Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());
 
            //return;
          
 
               OpenFileDialog open = new OpenFileDialog();
 
               open.Title = "請選擇文字"; //開啟的檔案選擇對話方塊上的標題
 
               open.Filter = "文字檔案(*.txt)|*.txt|所有檔案(*.*)|*.*";//設定檔案型別
 
               open.InitialDirectory = @"D:project";//預設開啟目錄
 
               open.FilterIndex = 1;//設定預設檔案型別顯示順序
 
               open.RestoreDirectory = false;//是否記憶上次開啟的目錄
 
               //open.Multiselect = true;//是否允許多選
 
               string content=string.Empty;
 
               if (open.ShowDialog() == DialogResult.OK)//按下確定選擇的按鈕
               {
 
                   string[] filename = open.FileNames;//獲取多個檔案的路徑及檔名並存入陣列
 
                   MessageBox.Show(filename[0]);
 
                  // MessageBox.Show(filename[1]);
 
                  // MessageBox.Show(open.FileName); //獲取路徑及檔名
 
                  // MessageBox.Show(open.SafeFileName);//獲取檔名
 
                   content = ReadFile(filename[0]);
 
               }
            //-----------------------------------讀出檔案內容---------------------------------
           
               SpeechSynthesizer voice = new SpeechSynthesizer();   //建立語音範例
               voice.Rate = -1; //設定語速,[-10,10]
               voice.Volume = 100; //設定音量,[0,100]
               //voice.SpeakAsync("Hellow Word");  //播放指定的字串,這是非同步朗讀
 
               //下面的程式碼為一些SpeechSynthesizer的屬性,看實際情況是否需要使用
 
               voice.SpeakAsyncCancelAll();  //取消朗讀
               voice.Speak(content);  //同步朗讀
               voice.Pause();  //暫停朗讀
               voice.Resume(); //繼續朗讀
 
               voice.Dispose();  //釋放所有語音資源
 
        }
 
        /// <summary>
        /// 讀取檔案,返回相應字串
        /// </summary>
        /// <param name="fileName">檔案路徑</param>
        /// <returns>返回檔案內容</returns>
        private static string ReadFile(string fileName)
        {
            StringBuilder str = new StringBuilder();
            using (FileStream fs = File.OpenRead(fileName))
            {
                long left = fs.Length;
                int maxLength = 100;//每次讀取的最大長度
                int start = 0;//起始位置
                int num = 0;//已讀取長度
                while (left > 0)
                {
                    byte[] buffer = new byte[maxLength];//快取讀取結果
                    char[] cbuffer = new char[maxLength];
                    fs.Position = start;//讀取開始的位置
                    num = 0;
                    if (left < maxLength)
                    {
                        num = fs.Read(buffer, 0, Convert.ToInt32(left));
                    }
                    else
                    {
                        num = fs.Read(buffer, 0, maxLength);
                    }
                    if (num == 0)
                    {
                        break;
                    }
                    start += num;
                    left -= num;
                    str = str.Append(Encoding.UTF8.GetString(buffer));
                }
            }
            return str.ToString();
        }
    }
}

表單程式碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Speech.Synthesis;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace TxtToVoiceForm
{
    public partial class Form2 : Form
    {
        private SpeechSynthesizer speech;
 
        /// <summary>
        /// 音量
        /// </summary>
        private int value = 100;
        /// <summary>
        /// 語速
        /// </summary>
        private int rate;
 
        public Form2()
        {
            InitializeComponent();
            ReadlocalFile();
            comboBox1.SelectedIndex = 0;
        }
 
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            rate = Int32.Parse(comboBox1.Text);
        }
 
        //private void 開啟檔案ToolStripMenuItem_Click(object sender, EventArgs e)
        //{
        //    this.ReadlocalFile();
 
        //}
 
        /// <summary>
        /// 讀取本地文字檔案的方法
        /// </summary>
        private void ReadlocalFile()
        {
            var open = new OpenFileDialog();
 
            open.ShowDialog();
 
            //得到檔案路徑
            string path = open.FileName;
 
            if (path.Trim().Length == 0)
            {
 
                return;
            }
 
            var os = new StreamReader(path, Encoding.UTF8);
            string str = os.ReadToEnd();
            textBox1.Text = str;
        }
        private void 清空內容ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            string text = textBox1.Text;
 
            if (text.Trim().Length == 0)
            {
                MessageBox.Show("不能閱讀空內容!", "錯誤提示");
                return;
            }
 
            if (button1.Text == "語音試聽")
            {
 
                speech = new SpeechSynthesizer();
 
                new Thread(Speak).Start();
 
                button1.Text = "停止試聽";
 
            }
            else if (button1.Text == "停止試聽")
            {
 
                speech.SpeakAsyncCancelAll();//停止閱讀
 
                button1.Text = "語音試聽";
            }
        }
 
        private void Speak()
        {
 
            speech.Rate = rate;
            //speech.SelectVoice("Microsoft Lili");//設定播音員(中文)
            //speech.SelectVoice("Microsoft Anna"); //英文
            speech.Volume = value;
            speech.SpeakAsync(textBox1.Text);//語音閱讀方法
            speech.SpeakCompleted += speech_SpeakCompleted;//繫結事件
        }
 
        /// <summary>
        /// 語音閱讀完成觸發此事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void speech_SpeakCompleted(object sender, SpeakCompletedEventArgs e)
        {
            button1.Text = "語音試聽";
        }
 
        /// <summary>
        /// 拖動進度條事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            //因為trackBar1的值為(0-10)之間而音量值為(0-100)所以要乘10;
            value = trackBar1.Value * 10;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
 
 
 
            string text = textBox1.Text;
 
            if (text.Trim().Length == 0)
            {
                MessageBox.Show("空內容無法生成!", "錯誤提示");
                return;
            }
 
            this.SaveFile(text);
 
        }
 
        /// <summary>
        /// 生成語音檔案的方法
        /// </summary>
        /// <param name="text"></param>
        private void SaveFile(string text)
        {
            speech = new SpeechSynthesizer();
            var dialog = new SaveFileDialog();
            dialog.Filter = "*.wav|*.wav|*.mp3|*.mp3";
            dialog.ShowDialog();
 
            string path = dialog.FileName;
            if (path.Trim().Length == 0)
            {
                return;
            }
            speech.SetOutputToWaveFile(path);
            speech.Volume = value;
            speech.Rate = rate;
            speech.Speak(text);
            speech.SetOutputToNull();
            MessageBox.Show("生成成功!在" + path + "路徑中!", "提示");
 
        }
 
        private void label1_Click(object sender, EventArgs e)
        {
 
        }
 
        private void label3_Click(object sender, EventArgs e)
        {
            this.ReadlocalFile();
        }
 
 
 
    }
}

意外得知C#豐富的功能,還是自己動手,沒有想象的那麼難,希望能幫到有需要的小夥伴們!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com