zmień format z wav na mp3 w strumieniu pamięci w NAudio
Cześć, próbuję przekonwertować tekst na mowę (wav) w memorystream przekonwertować go na mp3, a następnie odtworzyć na użytkownikach page.so co dalej?
Oto Mój kod asmx:
[WebMethod]
public byte[] StartSpeak(string Word)
{
MemoryStream ms = new MemoryStream();
using (System.Speech.Synthesis.SpeechSynthesizer synhesizer = new System.Speech.Synthesis.SpeechSynthesizer())
{
synhesizer.SelectVoiceByHints(System.Speech.Synthesis.VoiceGender.NotSet, System.Speech.Synthesis.VoiceAge.NotSet, 0, new System.Globalization.CultureInfo("en-US"));
synhesizer.SetOutputToWaveStream(ms);
synhesizer.Speak(Word);
}
return ms.ToArray();
}
Dzięki. 5 answers
Potrzebujesz biblioteki kompresorów MP3. Używam Lame przez Yeti Lame wrapper. Kod i przykładowy projekt znajdziesz tutaj .
Kroki, aby to zadziałało:
-
Skopiuj następujące pliki z
MP3Compressor
do swojego projektu:AudioWriters.cs
Lame.cs
Lame_enc.dll
Mp3Writer.cs
Mp3WriterConfig.cs
WaveNative.cs
WriterConfig.cs
-
We właściwościach projektu dla
Lame_enc.dll
ustaw właściwośćCopy to Output
naCopy if newer
lubCopy always
. -
Edytuj
Lame.cs
i zamień wszystkie instancje:[DllImport("Lame_enc.dll")]
Z:
[DllImport("Lame_enc.dll", CallingConvention = CallingConvention.Cdecl)]
-
Dodaj następujący kod do swojego projektu:
public static Byte[] WavToMP3(byte[] wavFile) { using (MemoryStream source = new MemoryStream(wavFile)) using (NAudio.Wave.WaveFileReader rdr = new NAudio.Wave.WaveFileReader(source)) { WaveLib.WaveFormat fmt = new WaveLib.WaveFormat(rdr.WaveFormat.SampleRate, rdr.WaveFormat.BitsPerSample, rdr.WaveFormat.Channels); // convert to MP3 at 96kbit/sec... Yeti.Lame.BE_CONFIG conf = new Yeti.Lame.BE_CONFIG(fmt, 96); // Allocate a 1-second buffer int blen = rdr.WaveFormat.AverageBytesPerSecond; byte[] buffer = new byte[blen]; // Do conversion using (MemoryStream output = new MemoryStream()) { Yeti.MMedia.Mp3.Mp3Writer mp3 = new Yeti.MMedia.Mp3.Mp3Writer(output, fmt, conf); int readCount; while ((readCount = rdr.Read(buffer, 0, blen)) > 0) mp3.Write(buffer, 0, readCount); mp3.Close(); return output.ToArray(); } } }
-
Albo Dodaj odniesienie do
System.Windows.Forms
do swojego projektu (jeśli jeszcze go nie ma), albo edytujAudioWriter.cs
iWriterConfig.cs
, aby usunąć odniesienia. Obie mająusing System.Windows.Forms;
, które można usunąć, aWriterConfig.cs
maConfigControl
deklarację, którą należy usunąć/skomentować Wynocha.
Gdy to wszystko się skończy, powinieneś mieć funkcjonalny w pamięci konwerter plików WAVE na MP3, którego możesz użyć do konwersji pliku WAV, który otrzymujesz z SpeechSynthesizer
NA MP3.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-07 14:04:02
Po prostu chciałem umieścić mój przykład za pomocą NAudio.Lame:
NuGet:
Install-Package NAudio.Lame
Code Snip: Mine oczywiście zwraca bajt [] - mam osobną metodę save to disk b / c myślę, że ułatwia to testowanie jednostkowe.
public static byte[] ConvertWavToMp3(byte[] wavFile)
{
using(var retMs = new MemoryStream())
using (var ms = new MemoryStream(wavFile))
using(var rdr = new WaveFileReader(ms))
using (var wtr = new LameMP3FileWriter(retMs, rdr.WaveFormat, 128))
{
rdr.CopyTo(wtr);
return retMs.ToArray();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-26 17:22:35
To już trochę stare, ale ponieważ nie zaakceptowałeś odpowiedzi, którą wcześniej podałem...
Niedawno zbudowałem rozszerzenie dla NAudio, które enkapsuluje bibliotekę LAME, aby zapewnić uproszczone kodowanie MP3.
Użyj Menedżera pakietów NuGet, aby znaleźć NAudio.Lame
. Podstawowy przykład korzystania z niego dostępny here
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-04 06:16:14
Zakładając, że próbujesz przekonwertować wyjście na MP3, potrzebujesz czegoś, co poradzi sobie z transkodowaniem dźwięku. Istnieje wiele dostępnych narzędzi, ale moje osobiste preferencje to FFmpeg . Jest to narzędzie wiersza poleceń, więc musisz wziąć to pod uwagę, ale poza tym jest bardzo łatwy w użyciu.
Jest wiele informacji w Internecie, ale możesz zacząć od zapoznania się z ich dokumentacją tutaj .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-27 19:49:18
Miałem podobny wymóg w .net4.0 do konwersji 8Bit 8kHz mono wav i użyłem następującego kodu
public void WavToMp3(string wavPath, string fileId)
{
var tempMp3Path = TempPath + "tempFiles\\" + fileId + ".mp3";
var mp3strm = new FileStream(tempMp3Path, FileMode.Create);
try
{
using (var reader = new WaveFileReader(wavPath))
{
var blen = 65536;
var buffer = new byte[blen];
int rc;
var bit16WaveFormat = new WaveFormat(16000, 16, 1);
using (var conversionStream = new WaveFormatConversionStream(bit16WaveFormat, reader))
{
var targetMp3Format = new WaveLib.WaveFormat(16000, 16, 1);
using (var mp3Wri = new Mp3Writer(mp3strm, new Mp3WriterConfig(targetMp3Format, new BE_CONFIG(targetMp3Format,64))))
{
while ((rc = conversionStream.Read(buffer, 0, blen)) > 0) mp3Wri.Write(buffer, 0, rc);
mp3strm.Flush();
conversionStream.Close();
}
}
reader.Close();
}
File.Move(tempMp3Path, TempPath + fileId + ".mp3");
}
finally
{
mp3strm.Close();
}
}
:
- . Net 4 skompilował bibliotekę yeti (aby ją uzyskać pobierz tą starszą ( http://www.codeproject.com/KB/audio-video/MP3Compressor/MP3Compressor.zip) i przekonwertować go do .net4. 0, a następnie zbudować rozwiązanie, aby uzyskać nową wersję bibliotek DLL)
- Pobierz biblioteki NAudio (jako Lame wsparcie 16bit wav sample tylko musiałem najpierw przekonwertować go z 8Bit do 16bit wav)
Użyłem bufora o rozmiarze 64kpbs (moje niestandardowe wymagania)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 10:31:14