1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-21 14:50:06 +02:00

Keep EXPERIMENTAL_VOICE_DETECTION compilable

This commit is contained in:
Paul Licameli 2020-05-04 13:56:43 -04:00
parent 3501a27aaf
commit 93bcff99df

View File

@ -50,6 +50,7 @@
#ifdef EXPERIMENTAL_VOICE_DETECTION #ifdef EXPERIMENTAL_VOICE_DETECTION
#include "../VoiceKey.h" #include "../VoiceKey.h"
#include "../ProjectWindow.h"
#endif #endif
IMPLEMENT_CLASS(TranscriptionToolBar, ToolBar); IMPLEMENT_CLASS(TranscriptionToolBar, ToolBar);
@ -237,52 +238,52 @@ void TranscriptionToolBar::Populate()
#ifdef EXPERIMENTAL_VOICE_DETECTION #ifdef EXPERIMENTAL_VOICE_DETECTION
// If we need these strings translated, then search and replace // If we need these strings translated, then search and replace
// TRANSLATBLE by _ and remove this #define. // YO by XO and remove this #define.
#define TRANSLATABLE( x ) Verbatim( x ) #define YO( x ) Verbatim( x )
AddButton(this, bmpTnStartOn, bmpTnStartOnDisabled, TTB_StartOn, AddButton(this, bmpTnStartOn, bmpTnStartOnDisabled, TTB_StartOn,
TRANSLATABLE("Adjust left selection to next onset")); YO("Adjust left selection to next onset"));
AddButton(this, bmpTnEndOn, bmpTnEndOnDisabled, TTB_EndOn, AddButton(this, bmpTnEndOn, bmpTnEndOnDisabled, TTB_EndOn,
TRANSLATABLE("Adjust right selection to previous offset")); YO("Adjust right selection to previous offset"));
AddButton(this, bmpTnStartOff, bmpTnStartOffDisabled, TTB_StartOff, AddButton(this, bmpTnStartOff, bmpTnStartOffDisabled, TTB_StartOff,
TRANSLATABLE("Adjust left selection to next offset")); YO("Adjust left selection to next offset"));
AddButton(this, bmpTnEndOff, bmpTnEndOffDisabled, TTB_EndOff, AddButton(this, bmpTnEndOff, bmpTnEndOffDisabled, TTB_EndOff,
TRANSLATABLE("Adjust right selection to previous onset")); YO("Adjust right selection to previous onset"));
AddButton(this, bmpTnSelectSound, bmpTnSelectSoundDisabled, TTB_SelectSound, AddButton(this, bmpTnSelectSound, bmpTnSelectSoundDisabled, TTB_SelectSound,
TRANSLATABLE("Select region of sound around cursor")); YO("Select region of sound around cursor"));
AddButton(this, bmpTnSelectSilence, bmpTnSelectSilenceDisabled, TTB_SelectSilence, AddButton(this, bmpTnSelectSilence, bmpTnSelectSilenceDisabled, TTB_SelectSilence,
TRANSLATABLE("Select region of silence around cursor")); YO("Select region of silence around cursor"));
AddButton(this, bmpTnAutomateSelection, bmpTnAutomateSelectionDisabled, TTB_AutomateSelection, AddButton(this, bmpTnAutomateSelection, bmpTnAutomateSelectionDisabled, TTB_AutomateSelection,
TRANSLATABLE("Automatically make labels from words")); YO("Automatically make labels from words"));
AddButton(this, bmpTnMakeTag, bmpTnMakeTagDisabled, TTB_MakeLabel, AddButton(this, bmpTnMakeTag, bmpTnMakeTagDisabled, TTB_MakeLabel,
TRANSLATABLE("Add label at selection")); YO("Add label at selection"));
AddButton(this, bmpTnCalibrate, bmpTnCalibrateDisabled, TTB_Calibrate, AddButton(this, bmpTnCalibrate, bmpTnCalibrateDisabled, TTB_Calibrate,
TRANSLATABLE("Calibrate voicekey")); YO("Calibrate voicekey"));
mSensitivitySlider = safenew ASlider(this, mSensitivitySlider = safenew ASlider(this,
TTB_SensitivitySlider, TTB_SensitivitySlider,
TRANSLATABLE("Adjust Sensitivity"), YO("Adjust Sensitivity"),
wxDefaultPosition, wxDefaultPosition,
wxSize(SliderWidth,25), wxSize(SliderWidth,25),
SPEED_SLIDER); ASlider::Options{}
.Style( SPEED_SLIDER ));
mSensitivitySlider->Set(.5); mSensitivitySlider->Set(.5);
mSensitivitySlider->SetLabel(TRANSLATABLE("Sensitivity")); mSensitivitySlider->SetLabel(YO("Sensitivity").Translation());
Add( mSensitivitySlider, 0, wxALIGN_CENTER ); Add( mSensitivitySlider, 0, wxALIGN_CENTER );
wxString choices[] = TranslatableStrings choices {
{ YO("Energy"),
TRANSLATABLE("Energy"), YO("Sign Changes (Low Threshold)"),
TRANSLATABLE("Sign Changes (Low Threshold)"), YO("Sign Changes (High Threshold)"),
TRANSLATABLE("Sign Changes (High Threshold)"), YO("Direction Changes (Low Threshold)"),
TRANSLATABLE("Direction Changes (Low Threshold)"), YO("Direction Changes (High Threshold)")
TRANSLATABLE("Direction Changes (High Threshold)")
}; };
mKeyTypeChoice = safenew wxChoice(this, TTB_KeyType, mKeyTypeChoice = safenew wxChoice(this, TTB_KeyType,
wxDefaultPosition, wxDefaultPosition,
wxDefaultSize, wxDefaultSize,
5, transform_container<wxArrayStringEx>( choices,
choices ); std::mem_fn( &TranslatableString::Translation ) ) );
mKeyTypeChoice->SetName(TRANSLATABLE("Key type")); mKeyTypeChoice->SetName(YO("Key type").Translation());
mKeyTypeChoice->SetSelection(0); mKeyTypeChoice->SetSelection(0);
Add( mKeyTypeChoice, 0, wxALIGN_CENTER ); Add( mKeyTypeChoice, 0, wxALIGN_CENTER );
#endif #endif
@ -308,10 +309,12 @@ void TranscriptionToolBar::EnableDisableButtons()
SetEnabled( canStopAudioStream && tracks && !recording ); SetEnabled( canStopAudioStream && tracks && !recording );
#ifdef EXPERIMENTAL_VOICE_DETECTION #ifdef EXPERIMENTAL_VOICE_DETECTION
AudacityProject *p = &mProject; if (!p)
if (!p) return; return;
// Is anything selected? // Is anything selected?
auto selection = p->GetSel0() < p->GetSel1() && p->GetTracks()->Selected(); const auto &selectedRegion = ViewInfo::Get( *p ).selectedRegion;
auto selection = !selectedRegion.isPoint() &&
!TrackList::Get( *p ).Selected().empty();
mButtons[TTB_Calibrate]->SetEnabled(selection); mButtons[TTB_Calibrate]->SetEnabled(selection);
#endif #endif
@ -355,18 +358,18 @@ void TranscriptionToolBar::RegenerateTooltips()
} }
#ifdef EXPERIMENTAL_VOICE_DETECTION #ifdef EXPERIMENTAL_VOICE_DETECTION
mButtons[TTB_StartOn]->SetToolTip(TRANSLATABLE("Left-to-On")); mButtons[TTB_StartOn]->SetToolTip(YO("Left-to-On"));
mButtons[TTB_EndOn]->SetToolTip( TRANSLATABLE("Right-to-Off")); mButtons[TTB_EndOn]->SetToolTip( YO("Right-to-Off"));
mButtons[TTB_StartOff]->SetToolTip( TRANSLATABLE("Left-to-Off")); mButtons[TTB_StartOff]->SetToolTip( YO("Left-to-Off"));
mButtons[TTB_EndOff]->SetToolTip( TRANSLATABLE("Right-to-On")); mButtons[TTB_EndOff]->SetToolTip( YO("Right-to-On"));
mButtons[TTB_SelectSound]->SetToolTip( TRANSLATABLE("Select-Sound")); mButtons[TTB_SelectSound]->SetToolTip( YO("Select-Sound"));
mButtons[TTB_SelectSilence]->SetToolTip( TRANSLATABLE("Select-Silence")); mButtons[TTB_SelectSilence]->SetToolTip( YO("Select-Silence"));
mButtons[TTB_AutomateSelection]->SetToolTip( TRANSLATABLE("Make Labels")); mButtons[TTB_AutomateSelection]->SetToolTip( YO("Make Labels"));
mButtons[TTB_MakeLabel]->SetToolTip( TRANSLATABLE("Add Label")); mButtons[TTB_MakeLabel]->SetToolTip( YO("Add Label"));
mButtons[TTB_Calibrate]->SetToolTip( TRANSLATABLE("Calibrate")); mButtons[TTB_Calibrate]->SetToolTip( YO("Calibrate"));
mSensitivitySlider->SetToolTip(TRANSLATABLE("Sensitivity")); mSensitivitySlider->SetToolTip(YO("Sensitivity").Translation());
mKeyTypeChoice->SetToolTip(TRANSLATABLE("Key type")); mKeyTypeChoice->SetToolTip(YO("Key type").Translation());
#endif #endif
} }
@ -582,9 +585,8 @@ void TranscriptionToolBar::OnStartOn(wxCommandEvent & WXUNUSED(event))
} }
mVk->AdjustThreshold(GetSensitivity()); mVk->AdjustThreshold(GetSensitivity());
AudacityProject *p = &mProject;
auto t = *p->GetTracks()->Any< const WaveTrack >().begin(); auto t = *TrackList::Get( mProject ).Any< const WaveTrack >().begin();
if(t ) { if(t ) {
auto wt = static_cast<const WaveTrack*>(t); auto wt = static_cast<const WaveTrack*>(t);
sampleCount start, len; sampleCount start, len;
@ -597,9 +599,9 @@ void TranscriptionToolBar::OnStartOn(wxCommandEvent & WXUNUSED(event))
auto newstart = mVk->OnForward(*wt, start, len); auto newstart = mVk->OnForward(*wt, start, len);
double newpos = newstart.as_double() / wt->GetRate(); double newpos = newstart.as_double() / wt->GetRate();
auto &selectedRegion = p->GetViewInfo().selectedRegion; auto &selectedRegion = ViewInfo::Get( mProject ).selectedRegion;
selectedRegion.setT0( newpos ); selectedRegion.setT0( newpos );
p->RedrawProject(); ProjectWindow::Get( mProject ).RedrawProject();
SetButton(false, mButtons[TTB_StartOn]); SetButton(false, mButtons[TTB_StartOn]);
} }
@ -617,7 +619,7 @@ void TranscriptionToolBar::OnStartOff(wxCommandEvent & WXUNUSED(event))
AudacityProject *p = &mProject; AudacityProject *p = &mProject;
SetButton(false, mButtons[TTB_StartOff]); SetButton(false, mButtons[TTB_StartOff]);
auto t = *p->GetTracks()->Any< const WaveTrack >().begin(); auto t = *TrackList::Get( mProject ).Any< const WaveTrack >().begin();
if(t) { if(t) {
auto wt = static_cast<const WaveTrack*>(t); auto wt = static_cast<const WaveTrack*>(t);
sampleCount start, len; sampleCount start, len;
@ -630,9 +632,9 @@ void TranscriptionToolBar::OnStartOff(wxCommandEvent & WXUNUSED(event))
auto newstart = mVk->OffForward(*wt, start, len); auto newstart = mVk->OffForward(*wt, start, len);
double newpos = newstart.as_double() / wt->GetRate(); double newpos = newstart.as_double() / wt->GetRate();
auto &selectedRegion = p->GetViewInfo().selectedRegion; auto &selectedRegion = ViewInfo::Get( mProject ).selectedRegion;
selectedRegion.setT0( newpos ); selectedRegion.setT0( newpos );
p->RedrawProject(); ProjectWindow::Get( mProject ).RedrawProject();
SetButton(false, mButtons[TTB_StartOn]); SetButton(false, mButtons[TTB_StartOn]);
} }
@ -650,7 +652,7 @@ void TranscriptionToolBar::OnEndOn(wxCommandEvent & WXUNUSED(event))
mVk->AdjustThreshold(GetSensitivity()); mVk->AdjustThreshold(GetSensitivity());
AudacityProject *p = &mProject; AudacityProject *p = &mProject;
auto t = *p->GetTracks()->Any< const WaveTrack >().begin(); auto t = *TrackList::Get( mProject ).Any< const WaveTrack >().begin();
if(t) { if(t) {
auto wt = static_cast<const WaveTrack*>(t); auto wt = static_cast<const WaveTrack*>(t);
sampleCount start, len; sampleCount start, len;
@ -665,8 +667,9 @@ void TranscriptionToolBar::OnEndOn(wxCommandEvent & WXUNUSED(event))
auto newEnd = mVk->OnBackward(*wt, start + len, len); auto newEnd = mVk->OnBackward(*wt, start + len, len);
double newpos = newEnd.as_double() / wt->GetRate(); double newpos = newEnd.as_double() / wt->GetRate();
p->SetSel1(newpos); auto &selectedRegion = ViewInfo::Get( mProject ).selectedRegion;
p->RedrawProject(); selectedRegion.setT1( newpos );
ProjectWindow::Get( mProject ).RedrawProject();
SetButton(false, mButtons[TTB_EndOn]); SetButton(false, mButtons[TTB_EndOn]);
} }
@ -686,7 +689,7 @@ void TranscriptionToolBar::OnEndOff(wxCommandEvent & WXUNUSED(event))
mVk->AdjustThreshold(GetSensitivity()); mVk->AdjustThreshold(GetSensitivity());
AudacityProject *p = &mProject; AudacityProject *p = &mProject;
auto t = *p->GetTracks()->Any< const WaveTrack >().begin(); auto t = *TrackList::Get( mProject ).Any< const WaveTrack >().begin();
if(t) { if(t) {
auto wt = static_cast<const WaveTrack*>(t); auto wt = static_cast<const WaveTrack*>(t);
sampleCount start, len; sampleCount start, len;
@ -700,8 +703,9 @@ void TranscriptionToolBar::OnEndOff(wxCommandEvent & WXUNUSED(event))
auto newEnd = mVk->OffBackward(*wt, start + len, len); auto newEnd = mVk->OffBackward(*wt, start + len, len);
double newpos = newEnd.as_double() / wt->GetRate(); double newpos = newEnd.as_double() / wt->GetRate();
p->SetSel1(newpos); auto &selectedRegion = ViewInfo::Get( mProject ).selectedRegion;
p->RedrawProject(); selectedRegion.setT1( newpos );
ProjectWindow::Get( mProject ).RedrawProject();
SetButton(false, mButtons[TTB_EndOff]); SetButton(false, mButtons[TTB_EndOff]);
} }
@ -721,10 +725,9 @@ void TranscriptionToolBar::OnSelectSound(wxCommandEvent & WXUNUSED(event))
mVk->AdjustThreshold(GetSensitivity()); mVk->AdjustThreshold(GetSensitivity());
AudacityProject *p = &mProject;
TrackList *tl = p->GetTracks(); TrackList *tl = &TrackList::Get( mProject );
if(auto wt = *tl->Any<const WaveTrack>().begin()) { if(auto wt = *tl->Any<const WaveTrack>().begin()) {
sampleCount start, len; sampleCount start, len;
GetSamples(wt, &start, &len); GetSamples(wt, &start, &len);
@ -739,10 +742,10 @@ void TranscriptionToolBar::OnSelectSound(wxCommandEvent & WXUNUSED(event))
mVk->OffForward(*wt, start + len, (int)(tl->GetEndTime() * rate)); mVk->OffForward(*wt, start + len, (int)(tl->GetEndTime() * rate));
//reset the selection bounds. //reset the selection bounds.
auto &selectedRegion = p->GetViewInfo().selectedRegion; auto &selectedRegion = ViewInfo::Get( mProject ).selectedRegion;
selectedRegion.setTimes( selectedRegion.setTimes(
newstart.as_double() / rate, newend.as_double() / rate ); newstart.as_double() / rate, newend.as_double() / rate );
p->RedrawProject(); ProjectWindow::Get( mProject ).RedrawProject();
} }
@ -760,10 +763,9 @@ void TranscriptionToolBar::OnSelectSilence(wxCommandEvent & WXUNUSED(event))
} }
mVk->AdjustThreshold(GetSensitivity()); mVk->AdjustThreshold(GetSensitivity());
AudacityProject *p = &mProject;
TrackList *tl = p->GetTracks(); TrackList *tl = &TrackList::Get( mProject );
if(auto wt = *tl->Any<const WaveTrack>().begin()) { if(auto wt = *tl->Any<const WaveTrack>().begin()) {
sampleCount start, len; sampleCount start, len;
GetSamples(wt, &start, &len); GetSamples(wt, &start, &len);
@ -777,9 +779,10 @@ void TranscriptionToolBar::OnSelectSilence(wxCommandEvent & WXUNUSED(event))
mVk->OnForward(*wt, start + len, (int)(tl->GetEndTime() * rate)); mVk->OnForward(*wt, start + len, (int)(tl->GetEndTime() * rate));
//reset the selection bounds. //reset the selection bounds.
p->SetSel0(newstart.as_double() / rate); auto &selectedRegion = ViewInfo::Get( mProject ).selectedRegion;
p->SetSel1(newend.as_double() / rate); selectedRegion.setTimes(
p->RedrawProject(); newstart.as_double() / rate, newend.as_double() / rate);
ProjectWindow::Get( mProject ).RedrawProject();
} }
@ -799,9 +802,7 @@ void TranscriptionToolBar::OnCalibrate(wxCommandEvent & WXUNUSED(event))
} }
AudacityProject *p = &mProject; TrackList *tl = &TrackList::Get( mProject );
TrackList *tl = p->GetTracks();
if(auto wt = *tl->Any<const WaveTrack>().begin()) { if(auto wt = *tl->Any<const WaveTrack>().begin()) {
sampleCount start, len; sampleCount start, len;
GetSamples(wt, &start, &len); GetSamples(wt, &start, &len);
@ -832,6 +833,61 @@ void TranscriptionToolBar::OnCalibrate(wxCommandEvent & WXUNUSED(event))
} }
#include "../LabelTrack.h"
#include "../ProjectHistory.h"
#include "../TrackPanel.h"
#include "../TrackPanelAx.h"
#include "../tracks/labeltrack/ui/LabelTrackView.h"
namespace {
int DoAddLabel(
AudacityProject &project, const SelectedRegion &region )
{
auto &tracks = TrackList::Get( project );
auto &trackFocus = TrackFocus::Get( project );
auto &trackPanel = TrackPanel::Get( project );
auto &trackFactory = TrackFactory::Get( project );
auto &window = ProjectWindow::Get( project );
wxString title; // of label
// If the focused track is a label track, use that
const auto pFocusedTrack = trackFocus.Get();
// Look for a label track at or after the focused track
auto iter = pFocusedTrack
? tracks.Find(pFocusedTrack)
: tracks.Any().begin();
auto lt = * iter.Filter< LabelTrack >();
// If none found, start a NEW label track and use it
if (!lt)
lt = tracks.Add( trackFactory.NewLabelTrack() );
// LLL: Commented as it seemed a little forceful to remove users
// selection when adding the label. This does not happen if
// you select several tracks and the last one of those is a
// label track...typing a label will not clear the selections.
//
// SelectNone();
lt->SetSelected(true);
int index;
int focusTrackNumber = -1;
index =
LabelTrackView::Get( *lt ).AddLabel(region, title, focusTrackNumber);
ProjectHistory::Get( project )
.PushState(XO("Added label"), XO("Label"));
TrackFocus::Get(project).Set(lt);
lt->EnsureVisible();
trackPanel.SetFocus();
return index;
}
}
//This automates selection through a selected region, //This automates selection through a selected region,
//selecting its best guess for words and creating labels at those points. //selecting its best guess for words and creating labels at those points.
@ -850,8 +906,7 @@ void TranscriptionToolBar::OnAutomateSelection(wxCommandEvent & WXUNUSED(event))
wxBusyCursor busy; wxBusyCursor busy;
mVk->AdjustThreshold(GetSensitivity()); mVk->AdjustThreshold(GetSensitivity());
AudacityProject *p = &mProject; TrackList *tl = &TrackList::Get( mProject );
TrackList *tl = p->GetTracks();
if(auto wt = *tl->Any<const WaveTrack>().begin()) { if(auto wt = *tl->Any<const WaveTrack>().begin()) {
sampleCount start, len; sampleCount start, len;
GetSamples(wt, &start, &len); GetSamples(wt, &start, &len);
@ -912,8 +967,8 @@ void TranscriptionToolBar::OnAutomateSelection(wxCommandEvent & WXUNUSED(event))
//Increment //Increment
start = newEnd; start = newEnd;
p->DoAddLabel(SelectedRegion(newStartPos, newEndPos)); DoAddLabel(mProject, SelectedRegion(newStartPos, newEndPos));
p->RedrawProject(); ProjectWindow::Get( mProject ).RedrawProject();
} }
SetButton(false, mButtons[TTB_AutomateSelection]); SetButton(false, mButtons[TTB_AutomateSelection]);
} }
@ -921,9 +976,8 @@ void TranscriptionToolBar::OnAutomateSelection(wxCommandEvent & WXUNUSED(event))
void TranscriptionToolBar::OnMakeLabel(wxCommandEvent & WXUNUSED(event)) void TranscriptionToolBar::OnMakeLabel(wxCommandEvent & WXUNUSED(event))
{ {
AudacityProject *p = &mProject;
SetButton(false, mButtons[TTB_MakeLabel]); SetButton(false, mButtons[TTB_MakeLabel]);
p->DoAddLabel(SelectedRegion(p->GetSel0(), p->GetSel1())); DoAddLabel( mProject, ViewInfo::Get( mProject ).selectedRegion );
} }
//This returns a double z-score between 0 and 10. //This returns a double z-score between 0 and 10.