Pergunta

Atualmente estou trabalhando em um aplicativo que exige a transmissão de voz codificada para um formato de áudio específico.

System.Speech.AudioFormat.SpeechAudioFormatInfo synthFormat = 
                        new System.Speech.AudioFormat.SpeechAudioFormatInfo(System.Speech.AudioFormat.EncodingFormat.Pcm, 
                            8000, 16, 1, 16000, 2, null); 

Isto indica que o áudio está no formato PCM, 8000 amostras por segundo, 16 bits por amostra, mono, 16000 bytes médios por segundo, o alinhamento do bloco 2.

Quando tento executar o código a seguir não há nada escrito ao meu exemplo MemoryStream; no entanto, quando eu mudar a partir de 8000 amostras por segundo até 11.025 os dados de áudio é gravado com êxito.

SpeechSynthesizer synthesizer = new SpeechSynthesizer(); 
waveStream = new MemoryStream(); 

PromptBuilder pbuilder = new PromptBuilder(); 
PromptStyle pStyle = new PromptStyle(); 

pStyle.Emphasis = PromptEmphasis.None; 
pStyle.Rate = PromptRate.Fast; 
pStyle.Volume = PromptVolume.ExtraLoud; 

pbuilder.StartStyle(pStyle); 
pbuilder.StartParagraph(); 
pbuilder.StartVoice(VoiceGender.Male, VoiceAge.Teen, 2); 
pbuilder.StartSentence(); 
pbuilder.AppendText("This is some text."); 
pbuilder.EndSentence(); 
pbuilder.EndVoice(); 
pbuilder.EndParagraph(); 
pbuilder.EndStyle(); 

synthesizer.SetOutputToAudioStream(waveStream, synthFormat);  
synthesizer.Speak(pbuilder); 
synthesizer.SetOutputToNull(); 

Não há exceções ou erros registrados ao usar uma taxa de amostragem de 8000 e eu não poderia encontrar qualquer coisa útil na documentação relativa SetOutputToAudioStream e por que ele é bem sucedido em 11025 amostras por segundo e não 8000. Eu tenho uma solução que envolve um wav arquivo que eu gerado e convertido para a taxa de amostragem correta usando algum som ferramentas de edição, mas eu gostaria de gerar o áudio de dentro do aplicativo se eu puder.

Um ponto de interesse particular foi que a SpeechRecognitionEngine aceita que o formato de áudio e reconhecido com sucesso o discurso no meu arquivo de onda sintetizada ...

Update: Recentemente descoberto que este formato de áudio sucede em certas vozes instalado, mas não para os outros. Ele falha especificamente para LH Michael e LH Michelle, e insuficiência varia para certas configurações de voz definidos no PromptBuilder.

Foi útil?

Solução

É inteiramente possível que o LH Michael e LH Michelle vozes simplesmente não suportam 8000 taxas de amostragem Hz (porque inerentemente gerar amostras> 8000 Hz). SAPI permite que os motores de rejeitar as taxas não suportados.

Outras dicas

Eu criei algumas aulas na minha NAudio biblioteca para que você possa converter seus dados de áudio para um taxa de amostragem diferente, se você está preso com 11025 do sintetizador. Ter um olhar para WaveFormatConversionStream (que usa ACM) ou ResamplerDMO (usa um objeto DirectX Media)

Eu estava tendo um problema semelhante e queria postar uma resposta no caso de ajuda ninguém. Esta discussão me pegou no sentido de encontrar a resposta. Meu problema era que eu estava tendo a saída SpeechSynthesizer para um arquivo WAV, e depois jogar esse arquivo WAV com NAudio. Quando emitido para um arquivo, ele trabalhou sem modificação. No entanto, ao tentar usar um MemoryStream, ele iria jogar para trás, mas tão rápido tudo o que ouvi foi um guincho.

Este código para a saída do SpeechSynthesizer corrigido o problema, e nenhuma modificação é necessária no lado NAudio:

SpeechAudioFormatInfo synthFormat = new SpeechAudioFormatInfo(EncodingFormat.Pcm, 88200, 16, 1, 16000, 2, null);
synth.SetOutputToAudioStream(streamAudio, synthFormat);

O 88200 é a chave. Por padrão, este é 11025. Criando o SpeechAudioFormatInfo e defini-la para 88200 é tudo que é necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top