Skip to content

Commit 3ec924e

Browse files
authored
Merge pull request #1 from TensorStack-AI/TextToSpeech
Add TextToSpeech support
2 parents adfd303 + e57bed8 commit 3ec924e

21 files changed

+1207
-137
lines changed

DemoApp/App.xaml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,23 @@
8383
</Style>
8484

8585

86-
86+
<Style x:Key="AudioDropZoneStyle" TargetType="{x:Type Border}">
87+
<Setter Property="AllowDrop" Value="False"/>
88+
<Setter Property="BorderBrush" Value="Transparent"/>
89+
<Setter Property="BorderThickness" Value="1"/>
90+
<Style.Triggers>
91+
<MultiDataTrigger>
92+
<MultiDataTrigger.Conditions>
93+
<Condition Binding="{Binding IsDragDrop, RelativeSource={RelativeSource AncestorType=CommonControls:ViewControl}}" Value="True" />
94+
<Condition Binding="{Binding DragDropType, RelativeSource={RelativeSource AncestorType=CommonControls:ViewControl}}" Value="Audio" />
95+
</MultiDataTrigger.Conditions>
96+
<MultiDataTrigger.Setters>
97+
<Setter Property="AllowDrop" Value="True"/>
98+
<Setter Property="BorderBrush" Value="{StaticResource AccentColour2}"/>
99+
</MultiDataTrigger.Setters>
100+
</MultiDataTrigger>
101+
</Style.Triggers>
102+
</Style>
87103

88104

89105
<Style x:Key="ToggleButtonBasic" TargetType="{x:Type ToggleButton}">

DemoApp/App.xaml.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public App()
3838
builder.Services.AddSingleton<ITextService, TextService>();
3939
builder.Services.AddSingleton<IInterpolationService, InterpolationService>();
4040
builder.Services.AddSingleton<ITranscribeService, TranscribeService>();
41+
builder.Services.AddSingleton<INarrateService, NarrateService>();
4142

4243
_appHost = builder.Build();
4344

DemoApp/Common/MediaType.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
public enum MediaType
44
{
55
Image = 0,
6-
Video = 1
6+
Video = 1,
7+
Audio = 2
78
}
89
}

DemoApp/Common/NarrateItem.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
3+
namespace DemoApp.Common
4+
{
5+
public class NarrateItem : HistoryItem
6+
{
7+
public string Model { get; init; }
8+
public string Voice { get; init; }
9+
public int Seed { get; init; }
10+
public float Speed { get; init; }
11+
public int Steps { get; init; }
12+
public int Channels { get; init; }
13+
public int SampleRate { get; init; }
14+
public TimeSpan Duration { get; init; }
15+
public string InputText { get; init; }
16+
}
17+
}

DemoApp/Common/NarrateModel.cs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System.IO;
2+
using System.Linq;
3+
using System.Text.Json.Serialization;
4+
using System.Threading.Tasks;
5+
using TensorStack.Common;
6+
using TensorStack.Common.Common;
7+
using TensorStack.WPF;
8+
using TensorStack.WPF.Services;
9+
10+
namespace DemoApp.Common
11+
{
12+
public class NarrateModel : BaseModel, IModelDownload
13+
{
14+
private bool _isValid;
15+
16+
public int Id { get; init; }
17+
public string Name { get; init; }
18+
public bool IsDefault { get; set; }
19+
public DeviceType[] SupportedDevices { get; init; }
20+
public string Version { get; set; }
21+
public int MinLength { get; init; }
22+
public int MaxLength { get; init; }
23+
public string[] Voices { get; init; }
24+
public string[] UrlPaths { get; init; }
25+
26+
27+
[JsonIgnore]
28+
public string Path { get; set; }
29+
30+
[JsonIgnore]
31+
public bool IsValid
32+
{
33+
get { return _isValid; }
34+
private set { SetProperty(ref _isValid, value); }
35+
}
36+
37+
public void Initialize(string modelDirectory)
38+
{
39+
var directory = System.IO.Path.Combine(modelDirectory, Name);
40+
var modelFiles = FileHelper.GetUrlFileMapping(UrlPaths, directory);
41+
if (modelFiles.Values.All(File.Exists))
42+
{
43+
IsValid = true;
44+
Path = directory;
45+
}
46+
}
47+
48+
49+
public async Task<bool> DownloadAsync(string modelDirectory)
50+
{
51+
var directory = System.IO.Path.Combine(modelDirectory, Name);
52+
if (await DialogService.DownloadAsync($"Download '{Name}' model?", UrlPaths, directory))
53+
Initialize(modelDirectory);
54+
55+
return IsValid;
56+
}
57+
}
58+
59+
60+
}

DemoApp/Common/PipelineModel.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class PipelineModel : BaseModel
1212
public UpscaleModel UpscaleModel { get; init; }
1313
public DetectModel DetectModel { get; init; }
1414
public TextModel TextModel { get; init; }
15-
public TranscribeModel TranscribeModel { get; set; }
15+
public TranscribeModel TranscribeModel { get; init; }
16+
public NarrateModel NarrateModel { get; init; }
1617
}
1718
}

DemoApp/Controls/HistoryControl.xaml

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,89 @@
339339
</Grid>
340340
</DataTemplate>
341341

342+
343+
344+
<!--NarrateItem-->
345+
<DataTemplate DataType="{x:Type Common:NarrateItem}">
346+
<Grid x:Name="Root" Background="Transparent" >
347+
<DockPanel Height="150" Width="110" >
348+
<Grid DockPanel.Dock="Top">
349+
350+
<Grid Width="110" Height="110">
351+
<CommonControls:FontAwesome Icon="f001" IconStyle="Solid" Size="70" Color="{StaticResource DefaultForeground}" Opacity=".2" />
352+
</Grid>
353+
354+
<Button Width="30" Height="30"
355+
Style="{StaticResource TransparentButton}"
356+
HorizontalAlignment="Right"
357+
VerticalAlignment="Bottom"
358+
Visibility="{Binding IsMouseOver, ElementName=Root, Converter={StaticResource BooleanToHiddenConverter}}"
359+
Command="{Binding RemoveItemCommand, RelativeSource={RelativeSource AncestorType=Controls:HistoryControl}}"
360+
CommandParameter="{Binding}">
361+
<CommonControls:FontAwesome Icon="&#xe2b4;" IconStyle="Solid" Size="20" Color="{StaticResource DangerColour}" />
362+
</Button>
363+
</Grid>
364+
<StackPanel>
365+
<TextBlock TextAlignment="Center">
366+
<Run Text="{Binding Duration}" />
367+
</TextBlock>
368+
<TextBlock Text="{Binding Source}" TextAlignment="Center" />
369+
</StackPanel>
370+
</DockPanel>
371+
372+
373+
<!-- Popup card -->
374+
<Popup x:Name="CardPopup"
375+
Height="120"
376+
Width="242"
377+
VerticalOffset="16"
378+
HorizontalOffset="-5"
379+
Placement="Top"
380+
StaysOpen="True"
381+
PopupAnimation="Slide"
382+
AllowsTransparency="True" >
383+
<Border Background="#01000000" Margin="0,0,0,0">
384+
<Border Margin="0,0,0,18" Background="#80000000" BorderBrush="{StaticResource ContainerBorder}" BorderThickness="1,1,1,0" CornerRadius="6,6,0,0">
385+
<StackPanel Margin="6,4,6,6">
386+
<TextBlock Text="{Binding Source}" />
387+
<TextBlock Text="{Binding Model, StringFormat={}Model: {0}}" />
388+
<TextBlock Text="{Binding Voice, StringFormat={}Voice: {0}}" />
389+
<TextBlock Text="{Binding Seed, StringFormat={}Seed: {0}}" />
390+
<TextBlock Text="{Binding Speed, StringFormat={}Speed: {0}}" />
391+
<TextBlock Text="{Binding Steps, StringFormat={}Steps: {0}}" />
392+
<TextBlock Text="{Binding Channels, StringFormat={}Channels: {0}}" />
393+
<TextBlock Text="{Binding SampleRate, StringFormat={}SampleRate: {0}}" />
394+
<TextBlock Text="{Binding Duration, StringFormat={}Duration: {0}}" />
395+
<TextBlock Text="{Binding MediaPath}" />
396+
</StackPanel>
397+
</Border>
398+
</Border>
399+
</Popup>
400+
401+
<!-- Hover triggers -->
402+
<Grid.Triggers>
403+
<EventTrigger RoutedEvent="MouseEnter">
404+
<BeginStoryboard>
405+
<Storyboard>
406+
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="CardPopup" Storyboard.TargetProperty="IsOpen">
407+
<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
408+
</BooleanAnimationUsingKeyFrames>
409+
</Storyboard>
410+
</BeginStoryboard>
411+
</EventTrigger>
412+
<EventTrigger RoutedEvent="MouseLeave">
413+
<BeginStoryboard>
414+
<Storyboard>
415+
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="CardPopup" Storyboard.TargetProperty="IsOpen">
416+
<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="False"/>
417+
</BooleanAnimationUsingKeyFrames>
418+
</Storyboard>
419+
</BeginStoryboard>
420+
</EventTrigger>
421+
</Grid.Triggers>
422+
</Grid>
423+
</DataTemplate>
424+
342425
</CommonControls:BaseControl.Resources>
343426

344427
<Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:HistoryControl}}}">

DemoApp/Controls/HistoryControl.xaml.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ protected void ListBoxPreviewMouseMove(object sender, MouseEventArgs e)
180180
{
181181
MediaType.Image => DragDropType.Image,
182182
MediaType.Video => DragDropType.Video,
183+
MediaType.Audio => DragDropType.Audio,
183184
_ => throw new NotSupportedException()
184185
};
185186

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<CommonControls:BaseControl x:Class="DemoApp.Controls.NarrateModelControl"
2+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6+
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
7+
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
8+
xmlns:base="clr-namespace:DemoApp"
9+
xmlns:local="clr-namespace:DemoApp.Controls"
10+
xmlns:Behaviors="clr-namespace:TensorStack.WPF.Behaviors;assembly=TensorStack.WPF"
11+
xmlns:CommonControls="clr-namespace:TensorStack.WPF.Controls;assembly=TensorStack.WPF"
12+
xmlns:CommonConverters="clr-namespace:TensorStack.WPF.Converters;assembly=TensorStack.WPF"
13+
xmlns:Controls="clr-namespace:DemoApp.Controls"
14+
xmlns:Common="clr-namespace:DemoApp.Common"
15+
xmlns:Views="clr-namespace:DemoApp.Views">
16+
<Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:NarrateModelControl}}}">
17+
<UniformGrid Columns="1">
18+
19+
<DockPanel>
20+
<TextBox DockPanel.Dock="Left" Text="Device" IsReadOnly="True" IsHitTestVisible="False" Width="60" FontStyle="Italic" FontSize="11" Opacity="0.7" Padding="4,2,0,0"/>
21+
<ComboBox DisplayMemberPath="Name" SelectedItem="{Binding SelectedDevice, Mode=TwoWay}" ItemsSource="{Binding Settings.Devices}" SelectionChanged="Device_SelectionChanged"/>
22+
</DockPanel>
23+
24+
<DockPanel>
25+
<DockPanel DockPanel.Dock="Right" Width="80" Height="22" >
26+
<Button x:Name="UnloadButton" DockPanel.Dock="Right" Command="{Binding UnloadCommand}" Width="22">
27+
<CommonControls:FontAwesome Icon="f00d" IconStyle="Solid" >
28+
<CommonControls:FontAwesome.Style>
29+
<Style TargetType="{x:Type CommonControls:FontAwesome}" BasedOn="{StaticResource {x:Type CommonControls:FontAwesome}}">
30+
<Setter Property="Opacity" Value="0.5" />
31+
<Style.Triggers>
32+
<DataTrigger Binding="{Binding IsEnabled, ElementName=UnloadButton}" Value="True">
33+
<Setter Property="Opacity" Value="0.7" />
34+
<Setter Property="Color" Value="{StaticResource DangerColour}" />
35+
</DataTrigger>
36+
</Style.Triggers>
37+
</Style>
38+
</CommonControls:FontAwesome.Style>
39+
</CommonControls:FontAwesome>
40+
</Button>
41+
<Button x:Name="LoadButton" Command="{Binding LoadCommand}" >
42+
<Button.Style>
43+
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
44+
<Setter Property="Content" Value="Load" />
45+
<Style.Triggers>
46+
<DataTrigger Binding="{Binding IsEnabled, ElementName=LoadButton}" Value="False">
47+
<Setter Property="Content" Value="Ready" />
48+
</DataTrigger>
49+
</Style.Triggers>
50+
</Style>
51+
</Button.Style>
52+
</Button>
53+
</DockPanel>
54+
55+
<DockPanel>
56+
<TextBox DockPanel.Dock="Left" Text="Model" IsReadOnly="True" IsHitTestVisible="False" Width="60" FontStyle="Italic" FontSize="11" Opacity="0.7" Padding="4,2,0,0"/>
57+
<ComboBox SelectedItem="{Binding SelectedModel, Mode=TwoWay}" ItemsSource="{Binding ModelCollectionView}" IsSynchronizedWithCurrentItem="True" HorizontalContentAlignment="Stretch">
58+
<ComboBox.ItemTemplate>
59+
<DataTemplate>
60+
<DockPanel>
61+
<CommonControls:FontAwesome DockPanel.Dock="Right" Icon="f111" Size="12" IconStyle="Solid" >
62+
<CommonControls:FontAwesome.Style>
63+
<Style TargetType="{x:Type CommonControls:FontAwesome}" BasedOn="{StaticResource {x:Type CommonControls:FontAwesome}}">
64+
<Setter Property="Color" Value="#10FFFFFF"/>
65+
<Style.Triggers>
66+
<DataTrigger Binding="{Binding IsValid}" Value="True">
67+
<Setter Property="Color" Value="{StaticResource AccentColour1}"/>
68+
</DataTrigger>
69+
</Style.Triggers>
70+
</Style>
71+
</CommonControls:FontAwesome.Style>
72+
</CommonControls:FontAwesome>
73+
<TextBlock Text="{Binding Name}" />
74+
</DockPanel>
75+
</DataTemplate>
76+
</ComboBox.ItemTemplate>
77+
</ComboBox>
78+
</DockPanel>
79+
</DockPanel>
80+
81+
</UniformGrid>
82+
</Grid>
83+
</CommonControls:BaseControl>

0 commit comments

Comments
 (0)