Spaces:
Sleeping
Sleeping
| --[[ | |
| ReaSpeechControlsUI.lua - UI elements for configuring ASR services | |
| ]]-- | |
| ReaSpeechControlsUI = Polo { | |
| DEFAULT_TAB = 'simple', | |
| DEFAULT_LANGUAGE = '', | |
| DEFAULT_MODEL_NAME = 'small', | |
| SIMPLE_MODEL_SIZES = { | |
| {'Small', 'small'}, | |
| {'Medium', 'medium'}, | |
| {'Large', 'distil-large-v3'}, | |
| }, | |
| COLUMN_PADDING = 15, | |
| MARGIN_BOTTOM = 5, | |
| MARGIN_LEFT = 115, | |
| MARGIN_RIGHT = 0, | |
| NARROW_COLUMN_WIDTH = 150, | |
| } | |
| function ReaSpeechControlsUI:init() | |
| self.tabs = ReaSpeechTabBar.new { | |
| default = self.DEFAULT_TAB, | |
| tabs = { | |
| ReaSpeechTabBar.tab('simple', 'Simple'), | |
| ReaSpeechTabBar.tab('advanced', 'Advanced'), | |
| } | |
| } | |
| self.log_enable = ReaSpeechCheckbox.simple(false, 'Enable') | |
| self.log_debug = ReaSpeechCheckbox.simple(false, 'Debug') | |
| self.language = ReaSpeechCombo.new { | |
| default = self.DEFAULT_LANGUAGE, | |
| label = 'Language', | |
| items = WhisperLanguages.LANGUAGE_CODES, | |
| item_labels = WhisperLanguages.LANGUAGES | |
| } | |
| self.translate = ReaSpeechCheckbox.new { | |
| default = false, | |
| label_long = 'Translate to English', | |
| label_short = 'Translate', | |
| width_threshold = self.NARROW_COLUMN_WIDTH | |
| } | |
| self.hotwords = ReaSpeechTextInput.simple('', 'Hot Words') | |
| self.initial_prompt = ReaSpeechTextInput.simple('', 'Initial Prompt') | |
| self.model_name = ReaSpeechTextInput.simple(self.DEFAULT_MODEL_NAME, 'Model Name') | |
| self.vad_filter = ReaSpeechCheckbox.new { | |
| default = true, | |
| label_long = 'Voice Activity Detection', | |
| label_short = 'VAD', | |
| width_threshold = self.NARROW_COLUMN_WIDTH | |
| } | |
| self.model_name_buttons = ReaSpeechButtonBar.new { | |
| default = self.DEFAULT_MODEL_NAME, | |
| label = 'Model Name', | |
| buttons = self.SIMPLE_MODEL_SIZES, | |
| column_padding = self.COLUMN_PADDING, | |
| margin_bottom = self.MARGIN_BOTTOM, | |
| margin_left = self.MARGIN_LEFT, | |
| margin_right = self.MARGIN_RIGHT, | |
| } | |
| self.model_name_buttons.on_set = function() | |
| self.model_name:set(self.model_name_buttons:value()) | |
| end | |
| self:init_layouts() | |
| end | |
| function ReaSpeechControlsUI:get_request_data() | |
| return { | |
| language = self.language:value(), | |
| translate = self.translate:value(), | |
| hotwords = self.hotwords:value(), | |
| initial_prompt = self.initial_prompt:value(), | |
| model_name = self.model_name:value(), | |
| vad_filter = self.vad_filter:value(), | |
| } | |
| end | |
| function ReaSpeechControlsUI:init_layouts() | |
| self:init_advanced_layouts() | |
| end | |
| function ReaSpeechControlsUI:init_advanced_layouts() | |
| local renderers = { | |
| {self.render_model_name, self.render_hotwords, self.render_language}, | |
| {self.render_options, self.render_initial_prompt, self.render_logging}, | |
| } | |
| self.advanced_layouts = {} | |
| for row = 1, #renderers do | |
| self.advanced_layouts[row] = ColumnLayout.new { | |
| column_padding = self.COLUMN_PADDING, | |
| margin_bottom = self.MARGIN_BOTTOM, | |
| margin_left = self.MARGIN_LEFT, | |
| margin_right = self.MARGIN_RIGHT, | |
| num_columns = #renderers[row], | |
| render_column = function (column) | |
| ImGui.PushItemWidth(ctx, column.width) | |
| app:trap(function () renderers[row][column.num](self, column) end) | |
| ImGui.PopItemWidth(ctx) | |
| end | |
| } | |
| end | |
| end | |
| function ReaSpeechControlsUI:render() | |
| self:render_heading() | |
| if self.tabs:value() == 'advanced' then | |
| self:render_advanced() | |
| else | |
| self:render_simple() | |
| end | |
| ImGui.Separator(ctx) | |
| ImGui.Dummy(ctx, 0, 5) | |
| end | |
| function ReaSpeechControlsUI:render_heading() | |
| local init_x, init_y = ImGui.GetCursorPos(ctx) | |
| ImGui.SetCursorPosX(ctx, init_x - 20) | |
| app.png_from_bytes('reaspeech-logo-small') | |
| ImGui.SetCursorPos(ctx, init_x + self.MARGIN_LEFT + 2, init_y) | |
| self.tabs:render() | |
| ImGui.SetCursorPos(ctx, ImGui.GetWindowWidth(ctx) - 55, init_y) | |
| app.png_from_bytes('heading-logo-tech-audio') | |
| ImGui.SetCursorPos(ctx, init_x, init_y + 40) | |
| end | |
| function ReaSpeechControlsUI:render_simple() | |
| self.model_name_buttons:render() | |
| end | |
| function ReaSpeechControlsUI:render_advanced() | |
| for row = 1, #self.advanced_layouts do | |
| self.advanced_layouts[row]:render() | |
| end | |
| end | |
| function ReaSpeechControlsUI:render_input_label(text) | |
| ImGui.Text(ctx, text) | |
| ImGui.Dummy(ctx, 0, 0) | |
| end | |
| function ReaSpeechControlsUI:render_language(column) | |
| self.language:render() | |
| self.translate:render(column) | |
| end | |
| function ReaSpeechControlsUI:render_model_name() | |
| self.model_name:render() | |
| end | |
| function ReaSpeechControlsUI:render_model_sizes() | |
| self.model_sizes_layout:render() | |
| end | |
| function ReaSpeechControlsUI:render_hotwords() | |
| self.hotwords:render() | |
| end | |
| function ReaSpeechControlsUI:render_options(column) | |
| self:render_input_label('Options') | |
| self.vad_filter:render(column) | |
| end | |
| function ReaSpeechControlsUI:render_logging() | |
| self:render_input_label('Logging') | |
| self.log_enable:render() | |
| if self.log_enable:value() then | |
| ImGui.SameLine(ctx) | |
| self.log_debug:render() | |
| end | |
| end | |
| function ReaSpeechControlsUI:render_initial_prompt() | |
| self.initial_prompt:render() | |
| end | |