Нет такого программного обеспечения. Разбиение произвольной речи на составляющие ее фонемы является лишь частично решаемой проблемой: программное обеспечение преобразования текста в текст все еще несовершенно, как и преобразование текста в речь .
Идея состоит в том, чтобы воспроизвести тембр голоса цели. Даже если бы вы смогли идеально сегментировать звук, переупорядочивание фонем произвело бы звук с неестественной частотой и интонацией, не говоря уже о артефактах сплайсинга. В этот момент вы переходите к сглаживанию, масштабированию по времени и коррекции высоты тона, которые все возможны и понятны в теории, но плохо работают с данными реального мира, особенно когда рассматриваемый аудиосэмпл такой короткий, как одна фонема и далее, когда тембр необходимо сохранить.
Эти проблемы усугубляются на фонетической стороне аллофоническим изменением звуков на основе акцента и окружающих фонем; чтобы достоверно воспроизводить даже низкокачественное приближение звука, вам необходимо детальное понимание языка, акцента и речевых шаблонов цели.
Кроме того, вашей конечной проблемой является социальная инженерия , и людей нелегко обмануть, когда речь заходит о голосах людей, которых они знают. Даже при большом объеме входных данных в лучшем случае можно получить короткую некачественную выборку, которой вряд ли хватит для разговора.
Итак, хотя это, конечно, возможно, это сложно; даже если бы он существовал, он не всегда был бы достаточно хорош.
Грубая сила:
EDIT: Однако в этом случае я бы настоятельно рекомендовал вам также проверить ListCollectionView.NeedsRefresh и обновлять только если он установлен. Нет причин для повторной сортировки, если ваши свойства изменились, не влияя на сортировку.
Это работает. Каждый раз, когда коллекция изменяется, она повторно сортирует коллекцию. Возможно, это можно сделать более эффективным способом, но в этом суть.
public partial class TestWindow : Window {
ObservableCollection<TestClass> oc;
public TestWindow() {
InitializeComponent();
// Fill in the OC for testing
oc = new ObservableCollection<TestClass>();
foreach( char c in "abcdefghieeddjko" ) {
oc.Add( new TestClass( c.ToString(), c.ToString(), c.GetHashCode() ) );
}
lstbox.ItemsSource = oc;
// Set up the sorting (this is how you did it.. doesn't work)
lstbox.Items.SortDescriptions.Add( new SortDescription("A", ListSortDirection.Ascending) );
// This is how we're going to do it
oc.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler( oc_Sort );
}
void oc_Sort( object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e ) {
// This sorts the oc and returns IEnumerable
var items = oc.OrderBy<TestClass, int>( ( x ) => ( x.C ) );
// Rest converst IEnumerable back to OC and assigns it
ObservableCollection<TestClass> temp = new ObservableCollection<TestClass>();
foreach( var item in items ) {
temp.Add( item );
}
oc = temp;
}
private void Button_Click( object sender, RoutedEventArgs e ) {
string a = "grrrr";
string b = "ddddd";
int c = 383857;
oc.Add( new TestClass( a, b, c ) );
}
}
public class TestClass : INotifyPropertyChanged {
private string a;
private string b;
private int c;
public TestClass( string f, string g, int i ) {
a = f;
b = g;
c = i;
}
public string A {
get { return a; }
set { a = value; OnPropertyChanged( "A" ); }
}
public string B {
get { return b; }
set { b = value; OnPropertyChanged( "B" ); }
}
public int C {
get { return c; }
set { c = value; OnPropertyChanged( "C" ); }
}
#region onpropertychanged
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged( string propertyName ) {
if( this.PropertyChanged != null ) {
PropertyChanged( this, new PropertyChangedEventArgs( propertyName ) );
}
}
#endregion
}
XAML:
<Window x:Class="ServiceManager.TestWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TestWindow" Height="500" Width="500"> <DockPanel> <ListBox ItemsSource="{Binding}" x:Name="lstbox"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <Label Content="{Binding Path=A}"/> <Label Content="{Binding Path=B}"/> <Label Content="{Binding Path=C}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <Button Click="Button_Click" Content="Click" /> </DockPanel> </Window>