Заметное свойство набора, измененное на объекте в наборе

Нет такого программного обеспечения. Разбиение произвольной речи на составляющие ее фонемы является лишь частично решаемой проблемой: программное обеспечение преобразования текста в текст все еще несовершенно, как и преобразование текста в речь .

Идея состоит в том, чтобы воспроизвести тембр голоса цели. Даже если бы вы смогли идеально сегментировать звук, переупорядочивание фонем произвело бы звук с неестественной частотой и интонацией, не говоря уже о артефактах сплайсинга. В этот момент вы переходите к сглаживанию, масштабированию по времени и коррекции высоты тона, которые все возможны и понятны в теории, но плохо работают с данными реального мира, особенно когда рассматриваемый аудиосэмпл такой короткий, как одна фонема и далее, когда тембр необходимо сохранить.

Эти проблемы усугубляются на фонетической стороне аллофоническим изменением звуков на основе акцента и окружающих фонем; чтобы достоверно воспроизводить даже низкокачественное приближение звука, вам необходимо детальное понимание языка, акцента и речевых шаблонов цели.

Кроме того, вашей конечной проблемой является социальная инженерия , и людей нелегко обмануть, когда речь заходит о голосах людей, которых они знают. Даже при большом объеме входных данных в лучшем случае можно получить короткую некачественную выборку, которой вряд ли хватит для разговора.

Итак, хотя это, конечно, возможно, это сложно; даже если бы он существовал, он не всегда был бы достаточно хорош.

11
задан Naser Asadi 27 July 2013 в 08:38
поделиться

2 ответа

Грубая сила:

  1. Присоединить обработчик к каждому событию PropertyChanged для каждого дочернего элемента
  2. Grab ListCollectionView из вашего CollectionViewSource
  3. Call Refresh.

EDIT: Однако в этом случае я бы настоятельно рекомендовал вам также проверить ListCollectionView.NeedsRefresh и обновлять только если он установлен. Нет причин для повторной сортировки, если ваши свойства изменились, не влияя на сортировку.

12
ответ дан 3 December 2019 в 09:20
поделиться

Это работает. Каждый раз, когда коллекция изменяется, она повторно сортирует коллекцию. Возможно, это можно сделать более эффективным способом, но в этом суть.


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>
0
ответ дан 3 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: