问题描述
我创建了两个AudioGraph,一个用于计算机语音,另一个用于麦克风。在这两种情况下,一旦启动图表,即使是在句子完成之后,即使在计算机语音图表的情况下,内存也会继续增加。即使在麦克风图表中,当图表开始时,内存仍会继续增加。
这可以在Visual Studio诊断工具中看到。
MainPage.xaml:
<Grid>
<Button x:Name="BtnMicrophone" Content="Start Graph Microphone" Click="BtnMicrophone_Click" Margin="10,47,0" VerticalAlignment="Top"/>
<Button x:Name="BtnComputerVoice" Content="Start Graph Computer" Click="BtnComputerVoice_Click" Margin="10,10,0" VerticalAlignment="Top" Width="169"/>
</Grid>
MainPage.xaml.cs:
MediaSourceAudioInputNode mediaInput;
AudioFrameOutputNode frameOutputNode;
AudioDeviceOutputNode deviceOutput;
MediaSource mediaVoice;
AudioGraph graph;
public MainPage()
{
this.InitializeComponent();
}
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
await InitializeAudioGraph();
}
private async void BtnComputerVoice_Click(object sender,RoutedEventArgs e)
{
graph.Stop();
graph.ResetAllNodes();
//Start AudioGraph Computer
var synth = new Windows.Media.SpeechSynthesis.SpeechSynthesizer();
SpeechSynthesisstream stream = null;
stream = await synth.SynthesizeTextToStreamAsync("Lorem ipsum dolor sit amet,consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
synth.dispose();
mediaVoice = MediaSource.CreateFromStream(stream,stream.ContentType);
CreateMediaSourceAudioInputNodeResult fileInputResult = await graph.CreateMediaSourceAudioInputNodeAsync(mediaVoice);
if (MediaSourceAudioInputNodeCreationStatus.Success != fileInputResult.Status) { return; }
mediaInput = fileInputResult.Node;
mediaInput.AddOutgoingConnection(deviceOutput);
frameOutputNode = graph.CreateFrameOutputNode();
mediaInput.AddOutgoingConnection(frameOutputNode);
frameOutputNode.OutgoingGain = 4;
graph.Start();
}
private async void BtnMicrophone_Click(object sender,RoutedEventArgs e)
{
if (graph != null)
{
graph.Stop();
graph.ResetAllNodes();
}
if (mediaInput != null)
{
mediaInput.Stop();
mediaInput.dispose();
mediaInput = null;
}
//Start AudioGraph Microphone
CreateAudioDeviceInputNodeResult fileInputResult = await graph.CreateDeviceInputNodeAsync(Windows.Media.Capture.MediaCategory.Speech);
if (AudioDeviceNodeCreationStatus.Success != fileInputResult.Status)
{
return;
}
AudioDeviceInputNode deviceInput = fileInputResult.DeviceInputNode;
frameOutputNode = graph.CreateFrameOutputNode();
deviceInput.AddOutgoingConnection(frameOutputNode);
graph.Start();
}
public async Task InitializeAudioGraph()
{
// Create an AudioGraph with default settings
AudioGraphSettings settings = new AudioGraphSettings(AudioRenderCategory.Media);
CreateAudioGraphResult result = await AudioGraph.CreateAsync(settings);
if (result.Status != AudioGraphCreationStatus.Success)
{
return;
}
graph = result.Graph;
// Create a device output node
CreateAudioDeviceOutputNodeResult deviceOutputNodeResult = await graph.CreateDeviceOutputNodeAsync();
if (deviceOutputNodeResult.Status != AudioDeviceNodeCreationStatus.Success)
{
return;
}
deviceOutput = deviceOutputNodeResult.DeviceOutputNode;
}
谢谢!
解决方法
{@ {1}}是内存不断增加的源头,它的目的是使开发人员可以自定义代码以接收和处理从音频图输出的音频数据。
从您当前提供的代码来看,不需要音频数据处理代码,因此无需添加此输出节点。
您可以尝试注释以下代码,内存将停止无限增长:
AudioFrameOutputNode