Я называю этот скомпилированный exe из другой программы Go - для синтеза звука в Windows.SpVoice()
но не проще SpeechSynthesizer API
из-за потрескивания в звуке .Все работает нормально, но когда у меня параллельно не десять, а несколько десятков копий этой программы (каждая вызывается из программы), иногда я получаю 3221225477. Мой код C #:
using System;
using System.Runtime.Serialization;
using SpeechLib;
class Program {
static SpVoice synth = new SpVoice();
static SpMemoryStream wave = new SpMemoryStream();
static void Main(string[] args) {
synth.AudioOutputStream = wave;
// https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms720595(v%3Dvs.85)
wave.Format.Type = SpeechAudioFormatType.SAFT44kHz16BitMono;
using (var stdin = Console.OpenStandardInput()) {
using (var stdout = Console.OpenStandardOutput()) {
var m = (Message)new System
.Runtime
.Serialization
.Json
.DataContractJsonSerializer(typeof(Message)).ReadObject(stdin);
// https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms722610(v%3dvs.85)
foreach(SpObjectToken voice in synth.GetVoices()) {
if (voice.GetDescription().Contains(m.Voice)) {
synth.Voice = voice;
}
}
synth.Speak(m.Text);
var wavBytes = (byte[])wave.GetData();
stdout.Write(wavBytes, 0, wavBytes.Length);
}
}
wave = new SpMemoryStream(); // Withoit reinit will concatenate
synth.AudioOutputStream = wave;
}
}
[DataContract]
class Message {
[DataMember]
public string Voice { get; set; }
[DataMember]
public string Text { get; set; }
}
I найдено , что 3221225477
означает STATUS_ACCESS_VIOLATION
.Я пытался попробовать / поймать все и записать в журналы, но при таком выходе я не нашел записей в Event Viewer.Я запускаю это на Windows Server 2019 в Google Cloud.
Обновление: я обнаружил, что Wav вернулся из stdout даже при этой ошибке.