• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C# syntezator mowy z głosem Paulina

VPS Starter Arubacloud
+1 głos
329 wizyt
pytanie zadane 9 marca 2023 w C# przez Mariusz M Obywatel (1,640 p.)
using System;
using System.Speech.Synthesis;
using System.IO;
using System.Threading;
namespace NamespaceName
{
    public class ClassName
    {
        public static void Main(string[] args)
        {
            SpeechSynthesizer synth = new SpeechSynthesizer();
            synth.SetOutputToDefaultAudioDevice();
            synth.SelectVoice("Microsoft Paulina Desktop");
            try
            {
                using(StreamReader sr = new StreamReader(args[0])){
                    string line;
                    if(args.Length > 1)
						synth.SetOutputToWaveFile(args[1]);
                    while((line = sr.ReadLine()) != null){
                        synth.Speak(line);
                    }
                    if(args.Length > 1)
						synth.SetOutputToDefaultAudioDevice(); 
                }
            }
            catch(Exception e)
            {
                Console.WriteLine("The file could not be read");
                Console.WriteLine(e.Message);
            }
        }
    }
}

Tutaj mam odczyt pliku i zapis do pliku z rozszerzeniem wav

Z konwersją do innego formatu nie ma problemu bo można użyć zewnętrznego programu np ffmpeg

Jeżeli już zacznie czytać to czyta cały plik a przydałaby się możliwość zatrzymania odczytu

i wznowienia go w miejscu ostatniego zatrzymania

Dodatkowo przydałaby się możliwość zmiany siły głosu i szybkości odczytu

 

1 odpowiedź

0 głosów
odpowiedź 11 marca 2023 przez VBService Ekspert (251,210 p.)
edycja 11 marca 2023 przez VBService

Z konwersją do innego formatu nie ma problemu bo można użyć zewnętrznego programu np ffmpeg

możesz spróbować z NAudio [ C# Save text to speech to MP3 file ]

 

Jeżeli już zacznie czytać to czyta cały plik a przydałaby się możliwość zatrzymania odczytu

i wznowienia go w miejscu ostatniego zatrzymania

możesz użyć np. Console.KeyAvailable 

Boolean canSpeak = true;

...

if (Console.KeyAvailable)
{
    ConsoleKeyInfo keyInfo = Console.ReadKey(true);
    if (keyInfo.Key == ConsoleKey.UpArrow)
        synth.Volume += (synth.Volume < 100) ? 5 : 0;

    if (keyInfo.Key == ConsoleKey.DownArrow)
        synth.Volume += (synth.Volume > 0) ? -5 : 0;

    if (keyInfo.Key == ConsoleKey.Spacebar)
    {
        canSpeak = !canSpeak;
        if (canSpeak)
            synth.Resume();
        else
            synth.Pause();
    }
}

if (canSpeak)
    synth.SpeakAsync(sentence);
else
    Thread.Sleep(10);

...

 

proponuje zamiast

...

try
{
    using(StreamReader sr = new StreamReader(args[0]))
    {
        string line;
        if (args.Length > 1)
            synth.SetOutputToWaveFile(args[1]);

        while ((line = sr.ReadLine()) != null)
            synth.Speak(line);

        if (args.Length > 1)
            synth.SetOutputToDefaultAudioDevice(); 
    }
}

...

 

np. "na początku" umieścić kod

        public static void Main(string[] args)
        {
            if (args.Length < 2)
            {
                Console.WriteLine("Usage: program.exe inputfile.txt outputfile.wav");
                Console.ReadKey();
                return;
            }

            ...
        }

 

komentarz 11 marca 2023 przez Mariusz M Obywatel (1,640 p.)
Ja chciałem aby po podaniu jednego argumentu czytał plik

a po podaniu dwóch zapisywał do pliku z rozszerzeniem wav

i dlatego są te instrukcje if
komentarz 11 marca 2023 przez VBService Ekspert (251,210 p.)
edycja 15 marca 2023 przez VBService

To może np. tak

public static void Main(string[] args)
{
    if (args.Length == 0)
    {
        Console.WriteLine("Usage: program.exe inputfile.txt [outputfile.wav]");
        Console.ReadKey();
        return;
    }

    if (! File.Exists(args[0]))
    {
        Console.WriteLine("Usage: program.exe inputfile.txt [outputfile.wav]");
        Console.WriteLine("Podany plik: {0} - nie istnieje", args[0]);
        Console.ReadKey();
        return;
    }

...

try
{
    SpeechSynthesizer synth = new SpeechSynthesizer();

    using (StreamReader sr = new StreamReader(args[0]))
    {
        String text = sr.ReadToEnd(); 
        synth.SelectVoice("Microsoft Paulina Desktop");
        synth.Volume = 100;

        if (args.Length == 2)
        {
            synth.SetOutputToWaveFile(args[1]);
            synth.Speak(text);
        }

        synth.SetOutputToDefaultAudioDevice();

    ...

 


przykład

using System;
using System.IO;
using System.Speech.Synthesis;
using System.Threading;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        static Boolean isSpeakCompleted = false;
        static int sentencesLength = 0;

        [DllImport("kernel32.dll")]
        private static extern bool SetConsoleTitle(string title);

        public static void Main(string[] args)
        {
            InfoOnTitle();
            
            if (args.Length == 0)
            {
                Console.WriteLine("Usage: program.exe inputfile.txt [outputfile.wav]");
                Console.ReadKey();
                return;
            }

            if (!File.Exists(args[0]))
            {
                Console.WriteLine("Usage: program.exe inputfile.txt [outputfile.wav]");
                Console.WriteLine("Podany plik: {0} - nie istnieje", args[0]);
                Console.ReadKey();
                return;
            }

            try
            {
                SpeechSynthesizer synth = new SpeechSynthesizer();
                synth.SpeakCompleted += synth_SpeakCompleted;

                using (StreamReader sr = new StreamReader(args[0]))
                {
                    String text = sr.ReadToEnd(); 
                    synth.SelectVoice("Microsoft Paulina Desktop");
                    synth.Volume = 100;

                    if (args.Length == 2)
                    {
                        synth.SetOutputToWaveFile(args[1]);
                        synth.Speak(text);
                    }

                    synth.SetOutputToDefaultAudioDevice();

                    Boolean canSpeak = true;
                    string[] sentences = text.Split(new char[] { ',', '.', '\n' }, StringSplitOptions.RemoveEmptyEntries);
                    sentencesLength = sentences.Length;
                    int sentencesIndex = 0;

                    while (true)
                    {
                        if (isSpeakCompleted)
                            break;

                        if (Console.KeyAvailable)
                        {
                            ConsoleKeyInfo keyInfo = Console.ReadKey(true);
                            if (keyInfo.Key == ConsoleKey.UpArrow)
                            {
                                synth.Volume += (synth.Volume < 100) ? 5 : 0;
                                InfoOnTitle("Volume: " + synth.Volume);
                            }

                            if (keyInfo.Key == ConsoleKey.DownArrow)
                            {
                                synth.Volume += (synth.Volume > 0) ? -5 : 0;
                                InfoOnTitle("Volume: " + synth.Volume);
                            }

                            if (keyInfo.Key == ConsoleKey.Spacebar)
                            {
                                canSpeak = !canSpeak;
                                if (canSpeak)
                                {
                                    synth.Resume();
                                    InfoOnTitle();
                                }
                                else
                                {
                                    synth.Pause();
                                    InfoOnTitle("Paused");
                                }
                            }
                        }

                        if (canSpeak && sentencesIndex < sentences.Length)
                            synth.SpeakAsync(sentences[sentencesIndex++]);
                        else
                            Thread.Sleep(10);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("The file could not be read");
                Console.WriteLine(e.Message);
            }

            Console.WriteLine("Press Enter to exit");
            Console.ReadKey();
        }

        static void InfoOnTitle(string title = "")
        {
            SetConsoleTitle(title);
        }

        private static void synth_SpeakCompleted(object sender, SpeakCompletedEventArgs e)
        {
            if (--sentencesLength <= 0)
                isSpeakCompleted = true;
        }
    }
}

 

komentarz 16 marca 2023 przez Mariusz M Obywatel (1,640 p.)
edycja 22 marca 2023 przez Mariusz M

Mam ochotę zamienić

 

 while (true)
 {
    if (isSpeakCompleted)
      break;

 

na

 


while(!isSpeakCompleted)

 

Co do szybkości odczytu to chyba jest od tego właściwość Rate

 

 

komentarz 17 kwietnia 2023 przez Mariusz M Obywatel (1,640 p.)
edycja 17 kwietnia 2023 przez Mariusz M

@VBService,  a gdybym chciał aby syntezator czytał także teksty ze stron internetowych ?

 

Oto co udało mi się znaleźć

 

using System;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
namespace NamespaceName
{
	public class ClassName
	{
		static Regex htmlRegex = new Regex("<.*?>", RegexOptions.Compiled);
		public static void Main(string[] args)
		{
			    var url = "https://literat.ug.edu.pl/dyzma/0001.htm";//Paste ur url here 
			   // Console.WriteLine("Podaj url");
			    //url = Console.ReadLine(); 
				WebRequest request = HttpWebRequest.Create(url);  
				WebResponse response = request.GetResponse();  
				using(StreamReader reader = new StreamReader(response.GetResponseStream()))
				{
					Console.OutputEncoding = System.Text.Encoding.GetEncoding("iso-8859-2");
					string responseText = reader.ReadToEnd();  
					//if your response is in json format just uncomment below line  
					//Response.AddHeader("Content-type", "text/json");  
					//Response.Write(responseText); 
					responseText = RemoveHTMLTagsCompiled(responseText); 
					Console.WriteLine(responseText);
				}
		}
		public static string RemoveHTMLTagsCompiled(string html)
		{
			return htmlRegex.Replace(html, string.Empty);
		}
	}
}

 

Jednak wystąpił tutaj problem z kodowaniem polskich znaków

Znalazłem takie coś


System.Text.Encoding enc = System.Text.Encoding.GetEncoding ("iso-8859-2");
using(StreamReader reader = new StreamReader(response.GetResponseStream(),enc))

 

 

 

komentarz 17 kwietnia 2023 przez VBService Ekspert (251,210 p.)

Spróbuj z utf-8

System.Text.Encoding enc = System.Text.Encoding.GetEncoding("utf-8");
using(StreamReader reader = new StreamReader(response.GetResponseStream(),enc))

tak jak to obecnie jest stosowane w html-u

<meta charset="utf-8">

 

komentarz 17 kwietnia 2023 przez Mariusz M Obywatel (1,640 p.)

Uruchomiłem znaleziony programik i pokazało mi

źródło strony w którym było napisane

<meta charset = "iso-8859-2">

Ale to może była stara strona
Skoro ten kod pobiera źródło strony to może i kodowanie
brać z tego źródła strony

Strony z samym tekstem można stosunkowo łatwo czytać
ale co gdy na stronie oprócz tekstu będą np obrazki ?
Pominie je czy trzeba by napisać funkcję pobierającą źródło strony
i zwracającą tekst gotowy do przeczytania

komentarz 17 kwietnia 2023 przez VBService Ekspert (251,210 p.)

co gdy na stronie oprócz tekstu będą np obrazki ?

masz zapis, który usuwa wszystkie znaczniki html


...
static Regex htmlRegex = new Regex("<.*?>", RegexOptions.Compiled);

...

public static string RemoveHTMLTagsCompiled(string html)
{
    return htmlRegex.Replace(html, string.Empty);
}

 

skoro

<img src="...">

też powinien być usunięty, bo spełnia <.*?>

Podobne pytania

0 głosów
1 odpowiedź 2,068 wizyt
pytanie zadane 8 stycznia 2017 w Java przez Eliro Stary wyjadacz (12,160 p.)
0 głosów
0 odpowiedzi 670 wizyt
pytanie zadane 2 stycznia 2017 w Java przez xydden Gaduła (4,480 p.)
0 głosów
2 odpowiedzi 1,391 wizyt
pytanie zadane 30 marca 2016 w Offtop przez Ciri Gaduła (3,380 p.)

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...