Я пишу Discord Bot в VS2017, используя оболочку Discord.Net. У меня есть все, чтобы работать (парсинг / отправка текстовых команд, присоединение к голосовым каналам), кроме основной цели: использование выходного аудиопотока TTS в голосовом канале.
По сути, я использую SpeechSynthesizer для создания MemoryStream и записи его боту Discord. Проблема в том, что звука нет. Вообще. Я следил за несколькими другими ответами, а также за документацией на сайте Discord.Net и, похоже, не могу найти способ заставить это работать. Потоковое аудио через url / файл хорошо документировано, но не это.
var ffmpeg = CreateProcess("");
var output = ffmpeg.StandardOutput.BaseStream;
IAudioClient client;
ConnectedChannels.TryGetValue(guild.Id, out client);
var discord = client.CreatePCMStream(AudioApplication.Mixed);
await output.CopyToAsync(discord);
await discord.FlushAsync();
Выше я использовал образец, полученный из файла через ffmpeg. Я вижу, что это просто копирование потока, поэтому я попытался сделать следующее различными методами:
IAudioClient client;
ConnectedChannels.TryGetValue(guild.Id, out client);
var discord = client.CreatePCMStream(AudioApplication.Mixed);
var synth = new SpeechSynthesizer();
var stream = new MemoryStream();
var synthFormat = new SpeechAudioFormatInfo(
EncodingFormat.Pcm,
8000,
16,
1,
16000,
2,
null);
synth.SetOutputToAudioStream(stream, synthFormat);
synth.Speak("this is a test");
await stream.CopyToAsync(discord);
await discord.FlushAsync();
Я пробовал изменить свойства SpeechAudioFormatInfo, изменить вывод SpeechSynthesizer, полностью удалить асинхронные вызовы, почти все, что я мог придумать, без результата.
Я понимаю, что могу просто вывести звук на фиктивное аудиоустройство и заставить другую учетную запись / бот перехватить это, но это не было целью этого упражнения. Я также понимаю, что могу просто записать результат в файл и просто передать его, но это увеличит время обработки. Эти инструкции TTS небольшие, никогда не превышают 5 слов, и должны быть краткими, поскольку они должны быть «выносками».
Наконец, я не мог найти способ заставить эту работу работать с ffmpeg. Все, что я прочитал, похоже, указывает на необходимость физического источника, а не только потока памяти.
Итак, я на грани остроумия. Любая помощь будет оценена.