[DEV] add parameters to heve a good recorder application
This commit is contained in:
parent
008eac96d9
commit
6bbe793e3f
@ -8,6 +8,6 @@
|
|||||||
|
|
||||||
|
|
||||||
int32_t appl::getLogId() {
|
int32_t appl::getLogId() {
|
||||||
static int32_t g_val = elog::registerInstance("RecoWord");
|
static int32_t g_val = elog::registerInstance("audio-reco-analyser");
|
||||||
return g_val;
|
return g_val;
|
||||||
}
|
}
|
38
readme.md
38
readme.md
@ -0,0 +1,38 @@
|
|||||||
|
audio-reco
|
||||||
|
==========
|
||||||
|
|
||||||
|
`audio-reco` is simple audio recognition engine build from scratch
|
||||||
|
|
||||||
|
Instructions
|
||||||
|
============
|
||||||
|
|
||||||
|
Note:
|
||||||
|
|
||||||
|
depend on etk library (MPL v2.0)
|
||||||
|
|
||||||
|
To create a corpus:
|
||||||
|
|
||||||
|
lutin.py audio-reco-wordRecorder?build?run
|
||||||
|
|
||||||
|
Analyse the corpus and create the "model":
|
||||||
|
|
||||||
|
lutin.py audio-reco-analyser?build?run:--corpus=~/.local/shared/audio-reco-wordRecorder/corpus
|
||||||
|
lutin.py audio-reco-analyser?build?run:--corpus=~/.local/shared/audio-reco-wordRecorder/corpus:--help
|
||||||
|
lutin -cclang -mrelease audio-reco-wordRecorder?build?run:--elog-level=3:--user_name=Edouard_DUPIN:--user_birth_year=1983:--source_type=ORDERED_WORD
|
||||||
|
|
||||||
|
|
||||||
|
License (MPL v2.0)
|
||||||
|
=====================
|
||||||
|
Copyright audio Edouard DUPIN
|
||||||
|
|
||||||
|
Licensed under the Mozilla Public License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.mozilla.org/MPL/2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
@ -13,14 +13,51 @@
|
|||||||
#include <etk/tool.hpp>
|
#include <etk/tool.hpp>
|
||||||
#include <appl/wordList_FR.hpp>
|
#include <appl/wordList_FR.hpp>
|
||||||
#include <appl/wordList_FR_ordered.hpp>
|
#include <appl/wordList_FR_ordered.hpp>
|
||||||
|
#include <appl/wordList_FR_selected.hpp>
|
||||||
|
#include <appl/wordList_number.hpp>
|
||||||
|
|
||||||
|
#include <etk/typeInfo.hpp>
|
||||||
|
ETK_DECLARE_TYPE(appl::Windows);
|
||||||
|
ETK_DECLARE_TYPE(appl::wordMode);
|
||||||
|
|
||||||
appl::Windows::Windows() :
|
appl::Windows::Windows() :
|
||||||
propertyCount(this, "count",
|
propertyCount(this, "count",
|
||||||
5,
|
5,
|
||||||
"Number of time we restart a record"),
|
"Number of time we restart a record"),
|
||||||
|
propertyInput(this, "input",
|
||||||
|
"microphone",
|
||||||
|
"play microphone stream",
|
||||||
|
&appl::Windows::inputChangeValue),
|
||||||
|
propertyRandom(this, "random",
|
||||||
|
false,
|
||||||
|
"play in random mode"),
|
||||||
|
propertyCorpusPath(this, "corpus-path",
|
||||||
|
"USER_DATA:///corpus/" + etk::toString(echrono::Clock::now()),
|
||||||
|
"corpus root path"),
|
||||||
|
propertyUserName(this, "user-name",
|
||||||
|
"Unknow",
|
||||||
|
"User name to identify the corpus source"),
|
||||||
|
propertyUserBirthYear(this, "user-year",
|
||||||
|
0,
|
||||||
|
"Birth year of the user to distingush the age of the user"),
|
||||||
|
propertyWordMode(this, "word-mode",
|
||||||
|
appl::wordMode::wordMode_ALL_WORD,
|
||||||
|
"Word list mode"),
|
||||||
m_composer(null) {
|
m_composer(null) {
|
||||||
addObjectType("appl::Windows");
|
addObjectType("appl::Windows");
|
||||||
propertyTitle.setDirectCheck("River IO viewer");
|
propertyTitle.setDirectCheck("River IO viewer");
|
||||||
|
// set property list:
|
||||||
|
propertyWordMode.add(appl::wordMode::wordMode_ALL_WORD, "ALL_WORD");
|
||||||
|
propertyWordMode.add(appl::wordMode::wordMode_ORDERED_WORD, "ORDERED_WORD");
|
||||||
|
propertyWordMode.add(appl::wordMode::wordMode_SELECTED_WORD, "SELECTED_WORD");
|
||||||
|
propertyWordMode.add(appl::wordMode::wordMode_NUMBER, "NUMBER");
|
||||||
|
}
|
||||||
|
|
||||||
|
void appl::Windows::inputChangeValue() {
|
||||||
|
ememory::SharedPtr<appl::widget::DataViewer> tmpDisp = ememory::dynamicPointerCast<appl::widget::DataViewer>(getSubObjectNamed("displayer"));
|
||||||
|
if (tmpDisp != null) {
|
||||||
|
tmpDisp->propertyInput.set(propertyInput.get());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void appl::Windows::init() {
|
void appl::Windows::init() {
|
||||||
@ -39,6 +76,11 @@ void appl::Windows::init() {
|
|||||||
composition += " Reset Currrent Record\n";
|
composition += " Reset Currrent Record\n";
|
||||||
composition += " </label>\n";
|
composition += " </label>\n";
|
||||||
composition += " </button>\n";
|
composition += " </button>\n";
|
||||||
|
composition += " <button name='bt-next' expand='false,true' fill='true'>\n";
|
||||||
|
composition += " <label>\n";
|
||||||
|
composition += " Next\n";
|
||||||
|
composition += " </label>\n";
|
||||||
|
composition += " </button>\n";
|
||||||
composition += " </sizer>\n";
|
composition += " </sizer>\n";
|
||||||
composition += " <label name='text-to-say' expand='true' fill='true' font-size='75'>\n";
|
composition += " <label name='text-to-say' expand='true' fill='true' font-size='75'>\n";
|
||||||
composition += " Text to say ...\n";
|
composition += " Text to say ...\n";
|
||||||
@ -48,7 +90,7 @@ void appl::Windows::init() {
|
|||||||
|
|
||||||
m_composer = ewol::widget::Composer::create();
|
m_composer = ewol::widget::Composer::create();
|
||||||
if (m_composer == null) {
|
if (m_composer == null) {
|
||||||
APPL_CRITICAL(" An error occured ... in the windows creatrion ...");
|
APPL_CRITICAL(" An error occured ... in the windows creation ...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
APPL_ERROR("Composer LOAD [BEGIN]");
|
APPL_ERROR("Composer LOAD [BEGIN]");
|
||||||
@ -57,15 +99,17 @@ void appl::Windows::init() {
|
|||||||
APPL_ERROR("Composer LOAD [ END ]");
|
APPL_ERROR("Composer LOAD [ END ]");
|
||||||
subBind(ewol::widget::Button, "bt-record", signalPressed, sharedFromThis(), &appl::Windows::onCallbackRecord);
|
subBind(ewol::widget::Button, "bt-record", signalPressed, sharedFromThis(), &appl::Windows::onCallbackRecord);
|
||||||
subBind(ewol::widget::Button, "bt-reset", signalPressed, sharedFromThis(), &appl::Windows::onCallbackGenerate);
|
subBind(ewol::widget::Button, "bt-reset", signalPressed, sharedFromThis(), &appl::Windows::onCallbackGenerate);
|
||||||
|
subBind(ewol::widget::Button, "bt-next", signalPressed, sharedFromThis(), &appl::Windows::resetCount);
|
||||||
|
subBind(ewol::widget::Button, "bt-next", signalPressed, sharedFromThis(), &appl::Windows::next);
|
||||||
subBind(appl::widget::DataViewer, "displayer", signalFinished, sharedFromThis(), &appl::Windows::onCallbackFinished);
|
subBind(appl::widget::DataViewer, "displayer", signalFinished, sharedFromThis(), &appl::Windows::onCallbackFinished);
|
||||||
next();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void appl::Windows::onCallbackFinished() {
|
void appl::Windows::onCallbackFinished() {
|
||||||
APPL_INFO("Recording is finished");
|
APPL_INFO("Recording is finished");
|
||||||
ememory::SharedPtr<appl::widget::DataViewer> tmpDisp = ememory::dynamicPointerCast<appl::widget::DataViewer>(getSubObjectNamed("displayer"));
|
ememory::SharedPtr<appl::widget::DataViewer> tmpDisp = ememory::dynamicPointerCast<appl::widget::DataViewer>(getSubObjectNamed("displayer"));
|
||||||
if (tmpDisp != null) {
|
if (tmpDisp != null) {
|
||||||
tmpDisp->store("Edouard DUPIN", m_list[m_listPos], "FR_fr");
|
tmpDisp->store(propertyCorpusPath.get(), propertyUserName.get(), propertyUserBirthYear.get(), m_textToSay, "FR_fr");
|
||||||
m_count++;
|
m_count++;
|
||||||
if (m_count >= propertyCount.get()) {
|
if (m_count >= propertyCount.get()) {
|
||||||
m_count = 0;
|
m_count = 0;
|
||||||
@ -77,6 +121,10 @@ void appl::Windows::onCallbackFinished() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void appl::Windows::resetCount() {
|
||||||
|
m_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void appl::Windows::onCallbackRecord() {
|
void appl::Windows::onCallbackRecord() {
|
||||||
APPL_INFO("Start/stop Record of data");
|
APPL_INFO("Start/stop Record of data");
|
||||||
ememory::SharedPtr<appl::widget::DataViewer> tmpDisp = ememory::dynamicPointerCast<appl::widget::DataViewer>(getSubObjectNamed("displayer"));
|
ememory::SharedPtr<appl::widget::DataViewer> tmpDisp = ememory::dynamicPointerCast<appl::widget::DataViewer>(getSubObjectNamed("displayer"));
|
||||||
@ -85,6 +133,14 @@ void appl::Windows::onCallbackRecord() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void appl::Windows::stop() {
|
||||||
|
APPL_INFO("stop Record of data");
|
||||||
|
ememory::SharedPtr<appl::widget::DataViewer> tmpDisp = ememory::dynamicPointerCast<appl::widget::DataViewer>(getSubObjectNamed("displayer"));
|
||||||
|
if (tmpDisp != null) {
|
||||||
|
tmpDisp->stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void appl::Windows::onCallbackGenerate() {
|
void appl::Windows::onCallbackGenerate() {
|
||||||
ememory::SharedPtr<appl::widget::DataViewer> tmpDisp = ememory::dynamicPointerCast<appl::widget::DataViewer>(getSubObjectNamed("displayer"));
|
ememory::SharedPtr<appl::widget::DataViewer> tmpDisp = ememory::dynamicPointerCast<appl::widget::DataViewer>(getSubObjectNamed("displayer"));
|
||||||
if (tmpDisp != null) {
|
if (tmpDisp != null) {
|
||||||
@ -97,21 +153,44 @@ void appl::Windows::onCallbackGenerate() {
|
|||||||
void appl::Windows::next() {
|
void appl::Windows::next() {
|
||||||
m_total++;
|
m_total++;
|
||||||
m_listPos++;
|
m_listPos++;
|
||||||
#if 0
|
int32_t id = m_listPos-1;
|
||||||
if (m_listPos >= m_list.size()) {
|
if (propertyWordMode.get() == wordMode_ALL_WORD) {
|
||||||
m_listPos = 0;
|
if (propertyRandom.get() == false) {
|
||||||
m_list.clear();
|
if (id >= appl::wordList::getWord_FR_count()) {
|
||||||
while (m_list.size() == 0) {
|
stop();
|
||||||
int32_t id = appl::wordList::getRandWord_FR();
|
|
||||||
if (appl::wordList::getWord_FR(id).size() > 5 ) {
|
|
||||||
m_list.pushBack(appl::wordList::getWord_FR(id));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
id = appl::wordList::getRandWord_FR();
|
||||||
}
|
}
|
||||||
configureNewText(m_list[m_listPos]);
|
configureNewText(appl::wordList::getWord_FR(id));
|
||||||
#else
|
} else if (propertyWordMode.get() == wordMode_ORDERED_WORD) {
|
||||||
configureNewText(appl::wordList::getWord_FR_ordered(m_listPos-1));
|
if (propertyRandom.get() == false) {
|
||||||
#endif
|
if (id >= appl::wordList::getWord_FR_ordered_count()) {
|
||||||
|
stop();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
id = appl::wordList::getRandWord_FR_ordered();
|
||||||
|
}
|
||||||
|
configureNewText(appl::wordList::getWord_FR_ordered(id));
|
||||||
|
} else if (propertyWordMode.get() == wordMode_NUMBER) {
|
||||||
|
if (propertyRandom.get() == false) {
|
||||||
|
if (id >= appl::wordList::getWord_number_count()) {
|
||||||
|
stop();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
id = appl::wordList::getRandWord_number();
|
||||||
|
}
|
||||||
|
configureNewText(appl::wordList::getWord_number(id));
|
||||||
|
} else if (propertyWordMode.get() == wordMode_SELECTED_WORD) {
|
||||||
|
if (propertyRandom.get() == false) {
|
||||||
|
if (id >= appl::wordList::getWord_FR_selected_count()) {
|
||||||
|
stop();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
id = appl::wordList::getRandWord_FR_selected();
|
||||||
|
}
|
||||||
|
configureNewText(appl::wordList::getWord_FR_selected(id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void appl::Windows::updateCurentLabel() {
|
void appl::Windows::updateCurentLabel() {
|
@ -9,9 +9,21 @@
|
|||||||
#include <ewol/widget/Composer.hpp>
|
#include <ewol/widget/Composer.hpp>
|
||||||
|
|
||||||
namespace appl {
|
namespace appl {
|
||||||
|
enum wordMode {
|
||||||
|
wordMode_ALL_WORD,
|
||||||
|
wordMode_ORDERED_WORD,
|
||||||
|
wordMode_NUMBER,
|
||||||
|
wordMode_SELECTED_WORD,
|
||||||
|
};
|
||||||
class Windows : public ewol::widget::Windows {
|
class Windows : public ewol::widget::Windows {
|
||||||
public:
|
public:
|
||||||
eproperty::Value<int32_t> propertyCount;
|
eproperty::Value<int32_t> propertyCount;
|
||||||
|
eproperty::Value<etk::String> propertyInput;
|
||||||
|
eproperty::Value<bool> propertyRandom;
|
||||||
|
eproperty::Value<etk::Uri> propertyCorpusPath;
|
||||||
|
eproperty::Value<etk::String> propertyUserName;
|
||||||
|
eproperty::Value<int32_t> propertyUserBirthYear;
|
||||||
|
eproperty::List<enum wordMode> propertyWordMode;
|
||||||
private:
|
private:
|
||||||
ememory::SharedPtr<ewol::widget::Composer> m_composer;
|
ememory::SharedPtr<ewol::widget::Composer> m_composer;
|
||||||
protected:
|
protected:
|
||||||
@ -23,21 +35,16 @@ namespace appl {
|
|||||||
void onCallbackRecord();
|
void onCallbackRecord();
|
||||||
void onCallbackGenerate();
|
void onCallbackGenerate();
|
||||||
void onCallbackFinished();
|
void onCallbackFinished();
|
||||||
|
void resetCount();
|
||||||
|
void stop();
|
||||||
etk::String m_textToSay;
|
etk::String m_textToSay;
|
||||||
etk::Vector<etk::String> m_list = {
|
|
||||||
"",/*
|
|
||||||
"bonjour", */"ordinateur", "oui", "non", /*"démarre", "arrête", "joue",
|
|
||||||
"suivant", "suivante", "précédent", "précédente", "heure", "jour", "moi", "année",
|
|
||||||
"ne", "pas", "est",
|
|
||||||
"maître", "esclave",*/
|
|
||||||
"quelle", "quel", "comment", "pourquoi",
|
|
||||||
"zoo", "wagon", "téléphone", "télévision", "appel", "film", "musique", "vidéo", "annimation", "enfant", "adulte"};
|
|
||||||
int32_t m_listPos = 0;
|
int32_t m_listPos = 0;
|
||||||
int32_t m_count = 0;
|
int32_t m_count = 0;
|
||||||
int32_t m_total = 0;
|
int32_t m_total = 0;
|
||||||
void configureNewText(const etk::String& _text);
|
void configureNewText(const etk::String& _text);
|
||||||
void next();
|
void next();
|
||||||
void updateCurentLabel();
|
void updateCurentLabel();
|
||||||
|
void inputChangeValue();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -8,6 +8,6 @@
|
|||||||
|
|
||||||
|
|
||||||
int32_t appl::getLogId() {
|
int32_t appl::getLogId() {
|
||||||
static int32_t g_val = elog::registerInstance("RecoWord");
|
static int32_t g_val = elog::registerInstance("audio-reco-wordRecorder");
|
||||||
return g_val;
|
return g_val;
|
||||||
}
|
}
|
@ -43,6 +43,21 @@ static const etk::String configurationRiver =
|
|||||||
" }\n"
|
" }\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
|
static void usage() {
|
||||||
|
APPL_PRINT(" --random/-r Random record words (instead of ordered)");
|
||||||
|
APPL_PRINT(" --input=XXX Audio source");
|
||||||
|
APPL_PRINT(" microphone default Io of the backend (default)");
|
||||||
|
APPL_PRINT(" microphone_USB alsa hw1,0 input");
|
||||||
|
APPL_PRINT(" --source_type=XXX Record specific word source");
|
||||||
|
APPL_PRINT(" ALL_WORD All french word availlable (default)");
|
||||||
|
APPL_PRINT(" ORDERED_WORD The 1500 more used word");
|
||||||
|
APPL_PRINT(" NUMBER Say mumber -5 to 100 and 1k 1M 1B 1T ...");
|
||||||
|
APPL_PRINT(" SELECTED_WORD small list of selected word");;
|
||||||
|
APPL_PRINT(" --user_name=\"XXX\" Name of the user");
|
||||||
|
APPL_PRINT(" --user_birth_year=XXX Birth year of the speaker");
|
||||||
|
APPL_PRINT(" --corpus_root_path=XXX Root path of the corpus (add after a folder with the name and other informations");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
class MainApplication : public ewol::context::Application {
|
class MainApplication : public ewol::context::Application {
|
||||||
public:
|
public:
|
||||||
@ -52,15 +67,14 @@ class MainApplication : public ewol::context::Application {
|
|||||||
etk::String tmpppp = _context.getCmd().get(iii);
|
etk::String tmpppp = _context.getCmd().get(iii);
|
||||||
if ( tmpppp == "-h"
|
if ( tmpppp == "-h"
|
||||||
|| tmpppp == "--help") {
|
|| tmpppp == "--help") {
|
||||||
//APPL_PRINT(" --ctags=xxx c-flags-file-name" );
|
usage();
|
||||||
exit(0);
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
etk::theme::setName("COLOR", "color/white/");
|
etk::theme::setName("COLOR", "color/white/");
|
||||||
|
|
||||||
_context.setSize(vec2(800, 600));
|
_context.setSize(vec2(900, 600));
|
||||||
|
|
||||||
_context.setTitle("edn");
|
_context.setTitle("audio-reco-wordRecorder");
|
||||||
|
|
||||||
// select internal data for font ...
|
// select internal data for font ...
|
||||||
_context.getFontDefault().setUseExternal(true);
|
_context.getFontDefault().setUseExternal(true);
|
||||||
@ -88,7 +102,7 @@ class MainApplication : public ewol::context::Application {
|
|||||||
|
|
||||||
appl::widget::DataViewer::createManagerWidget(_context.getWidgetManager());
|
appl::widget::DataViewer::createManagerWidget(_context.getWidgetManager());
|
||||||
|
|
||||||
ememory::SharedPtr<ewol::widget::Windows> basicWindows = appl::Windows::create();
|
ememory::SharedPtr<appl::Windows> basicWindows = appl::Windows::create();
|
||||||
if (basicWindows == null) {
|
if (basicWindows == null) {
|
||||||
APPL_ERROR("Can not allocate the basic windows");
|
APPL_ERROR("Can not allocate the basic windows");
|
||||||
_context.exit(-1);
|
_context.exit(-1);
|
||||||
@ -99,33 +113,48 @@ class MainApplication : public ewol::context::Application {
|
|||||||
|
|
||||||
// add files
|
// add files
|
||||||
APPL_INFO("show list of files : ");
|
APPL_INFO("show list of files : ");
|
||||||
/*
|
|
||||||
for( int32_t iii=0 ; iii<_context.getCmd().size(); iii++) {
|
for( int32_t iii=0 ; iii<_context.getCmd().size(); iii++) {
|
||||||
etk::String tmpppp = _context.getCmd().get(iii);
|
etk::String tmpppp = _context.getCmd().get(iii);
|
||||||
if (tmpppp.startWith("--ctags=") == true) {
|
if ( tmpppp == "-h"
|
||||||
etk::String name = tmpppp.extract(8);
|
|| tmpppp == "--help") {
|
||||||
APPL_INFO("Load ctag file : \"" << name << "\"" );
|
|
||||||
appl::setCtagsFileName(name);
|
|
||||||
} else if ( tmpppp == "-h"
|
|
||||||
|| tmpppp == "--help") {
|
|
||||||
// nothing to do ...
|
// nothing to do ...
|
||||||
} else {
|
} else if ( tmpppp == "--random"
|
||||||
etk::Path file(tmpppp);
|
|| tmpppp == "-r") {
|
||||||
if (etk::path::isFile(file) == true) {
|
// random display word
|
||||||
APPL_INFO("need load file : \"" << file << "\"" );
|
APPL_ERROR("SET mode RANDOM");
|
||||||
m_bufferManager->open(file);
|
basicWindows->propertyRandom.set(true);
|
||||||
} else if (etk::path::isDirectory(file) == true) {
|
} else if (tmpppp.startWith("--source_type=") == true) {
|
||||||
etk::Vector<etk::Path> listOfFiles = etk::path::list(file, etk::path::LIST_FILE);
|
etk::String mode = tmpppp.extract(14);
|
||||||
for (auto &it: listOfFiles) {
|
if (mode == "ALL_WORD") {
|
||||||
if (etk::path::isFile(it) == true) {
|
basicWindows->propertyWordMode.set(appl::wordMode_ALL_WORD);
|
||||||
APPL_INFO("need load file : \"" << it << "\"" );
|
} else if (mode == "ORDERED_WORD") {
|
||||||
m_bufferManager->open(it);
|
basicWindows->propertyWordMode.set(appl::wordMode_ORDERED_WORD);
|
||||||
}
|
} else if (mode == "NUMBER") {
|
||||||
}
|
basicWindows->propertyWordMode.set(appl::wordMode_NUMBER);
|
||||||
|
} else if (mode == "SELECTED_WORD") {
|
||||||
|
basicWindows->propertyWordMode.set(appl::wordMode_SELECTED_WORD);
|
||||||
|
} else {
|
||||||
|
APPL_ERROR("Can not select mode in list: '" << mode << "'" );
|
||||||
|
usage();
|
||||||
}
|
}
|
||||||
|
} else if (tmpppp.startWith("--input=") == true) {
|
||||||
|
etk::String input = tmpppp.extract(8);
|
||||||
|
basicWindows->propertyInput.set(input);
|
||||||
|
} else if (tmpppp.startWith("--user_name=") == true) {
|
||||||
|
etk::String userName = tmpppp.extract(12);
|
||||||
|
basicWindows->propertyUserName.set(userName);
|
||||||
|
} else if (tmpppp.startWith("--user_birth_year=") == true) {
|
||||||
|
etk::String userBirthDate = tmpppp.extract(18);
|
||||||
|
basicWindows->propertyUserBirthYear.set(etk::string_to_int32_t(userBirthDate));
|
||||||
|
} else if (tmpppp.startWith("--corpus_root_path=") == true) {
|
||||||
|
etk::Path corpusPath = tmpppp.extract(19);
|
||||||
|
basicWindows->propertyCorpusPath.set(corpusPath);
|
||||||
|
} else {
|
||||||
|
APPL_ERROR("Unknow parameter: '" << tmpppp << "'" );
|
||||||
|
//usage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
basicWindows->next();
|
||||||
APPL_INFO("==> START ... (END)");
|
APPL_INFO("==> START ... (END)");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
@ -9,6 +9,9 @@
|
|||||||
#include <etk/tool.hpp>
|
#include <etk/tool.hpp>
|
||||||
#include <ewol/object/Manager.hpp>
|
#include <ewol/object/Manager.hpp>
|
||||||
|
|
||||||
|
#include <etk/typeInfo.hpp>
|
||||||
|
ETK_DECLARE_TYPE(appl::widget::DataViewer);
|
||||||
|
|
||||||
static const int32_t nbSecondOffset = 3;
|
static const int32_t nbSecondOffset = 3;
|
||||||
static const float nbSecondSilence = 1.1;
|
static const float nbSecondSilence = 1.1;
|
||||||
static const int32_t nbSecond = 10;
|
static const int32_t nbSecond = 10;
|
||||||
@ -19,6 +22,9 @@ static const float stopThresholdLevel = 0.1;
|
|||||||
|
|
||||||
|
|
||||||
appl::widget::DataViewer::DataViewer() :
|
appl::widget::DataViewer::DataViewer() :
|
||||||
|
propertyInput(this, "input",
|
||||||
|
"microphone",
|
||||||
|
"play microphone stream"),
|
||||||
m_minVal(-1.0f),
|
m_minVal(-1.0f),
|
||||||
m_maxVal(1.0f),
|
m_maxVal(1.0f),
|
||||||
m_sampleRate(48000) {
|
m_sampleRate(48000) {
|
||||||
@ -90,7 +96,7 @@ void appl::widget::DataViewer::start() {
|
|||||||
m_interface = m_manager->createInput(m_sampleRate,
|
m_interface = m_manager->createInput(m_sampleRate,
|
||||||
channel,
|
channel,
|
||||||
audio::format_int16,
|
audio::format_int16,
|
||||||
"microphone_USB");
|
propertyInput.get());
|
||||||
if(m_interface == null) {
|
if(m_interface == null) {
|
||||||
APPL_ERROR("null interface");
|
APPL_ERROR("null interface");
|
||||||
return;
|
return;
|
||||||
@ -307,14 +313,19 @@ bool appl::widget::DataViewer::onEventInput(const ewol::event::Input& _event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void appl::widget::DataViewer::store(const etk::String& _userName, const etk::String& _value, const etk::String& _language) {
|
void appl::widget::DataViewer::store(const etk::Uri& _baseUri, const etk::String& _userName, int32_t _userYearBirth, const etk::String& _value, const etk::String& _language) {
|
||||||
if (m_data16.size() == 0) {
|
if (m_data16.size() == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
etk::String baseName = _language + "_" + _userName + "_" + etk::toString(m_time.get());
|
etk::String baseName = _language + "_" + _userName + "_" + etk::toString(m_time.get());
|
||||||
// create the buffer
|
// create the buffer
|
||||||
ejson::Document doc;
|
ejson::Document doc;
|
||||||
doc.add("user", ejson::String(_userName));
|
if (_userName != "") {
|
||||||
|
doc.add("user", ejson::String(_userName));
|
||||||
|
}
|
||||||
|
if (_userYearBirth != 0) {
|
||||||
|
doc.add("user-birth-year", ejson::Number(_userYearBirth));
|
||||||
|
}
|
||||||
doc.add("value", ejson::String(_value));
|
doc.add("value", ejson::String(_value));
|
||||||
doc.add("language", ejson::String(_language));
|
doc.add("language", ejson::String(_language));
|
||||||
doc.add("time", ejson::Number(m_time.get()));
|
doc.add("time", ejson::Number(m_time.get()));
|
||||||
@ -323,26 +334,27 @@ void appl::widget::DataViewer::store(const etk::String& _userName, const etk::St
|
|||||||
doc.add("audio_sample_rate", ejson::Number(48000));
|
doc.add("audio_sample_rate", ejson::Number(48000));
|
||||||
doc.add("audio_filename", ejson::String(baseName + ".raw"));
|
doc.add("audio_filename", ejson::String(baseName + ".raw"));
|
||||||
|
|
||||||
|
etk::Uri uriMetaData = _baseUri;
|
||||||
|
uriMetaData.setPath(_baseUri.getPath() / (baseName + ".json"));
|
||||||
|
doc.storeSafe(uriMetaData);
|
||||||
|
APPL_WARNING("store: " << uriMetaData);
|
||||||
|
|
||||||
etk::String fileNameMetaData = "USER_DATA:///corpus/" + baseName + ".json";
|
etk::Uri uriAudioFile = _baseUri;
|
||||||
doc.storeSafe(etk::Uri(fileNameMetaData));
|
uriAudioFile.setPath(_baseUri.getPath() / (baseName + ".raw"));
|
||||||
APPL_WARNING("store: " << fileNameMetaData);
|
|
||||||
|
|
||||||
etk::String fileNameAudioFile = "USER_DATA:///corpus/" + baseName + ".raw";
|
|
||||||
|
|
||||||
int64_t posStart = int64_t(m_detectStartPosition)-nbSecondPreviousPost*m_sampleRate;
|
int64_t posStart = int64_t(m_detectStartPosition)-nbSecondPreviousPost*m_sampleRate;
|
||||||
posStart = etk::avg(int64_t(0), posStart, int64_t(m_data.size()));
|
posStart = etk::avg(int64_t(0), posStart, int64_t(m_data.size()));
|
||||||
int64_t posStop = int64_t(m_detectStopPosition)+nbSecondPreviousPost*m_sampleRate;
|
int64_t posStop = int64_t(m_detectStopPosition)+nbSecondPreviousPost*m_sampleRate;
|
||||||
posStop = etk::avg(int64_t(0), posStop, int64_t(m_data.size()));
|
posStop = etk::avg(int64_t(0), posStop, int64_t(m_data.size()));
|
||||||
{
|
{
|
||||||
ememory::SharedPtr<etk::io::Interface> fileIO = etk::uri::get(fileNameAudioFile);
|
ememory::SharedPtr<etk::io::Interface> fileIO = etk::uri::get(uriAudioFile);
|
||||||
if (fileIO->open(etk::io::OpenMode::Write) == false) {
|
if (fileIO->open(etk::io::OpenMode::Write) == false) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fileIO->write(&m_data16[posStart], 1*audio::getFormatBytes(audio::format_int16), (posStop-posStart));
|
fileIO->write(&m_data16[posStart], 1*audio::getFormatBytes(audio::format_int16), (posStop-posStart));
|
||||||
fileIO->close();
|
fileIO->close();
|
||||||
}
|
}
|
||||||
APPL_WARNING("store: " << fileNameAudioFile);
|
APPL_WARNING("store: " << uriAudioFile);
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
|
|
@ -17,6 +17,7 @@ namespace appl {
|
|||||||
class DataViewer : public ewol::Widget {
|
class DataViewer : public ewol::Widget {
|
||||||
public:
|
public:
|
||||||
esignal::Signal<> signalFinished;
|
esignal::Signal<> signalFinished;
|
||||||
|
eproperty::Value<etk::String> propertyInput;
|
||||||
private:
|
private:
|
||||||
mutable ethread::MutexRecursive m_mutex;
|
mutable ethread::MutexRecursive m_mutex;
|
||||||
private:
|
private:
|
||||||
@ -52,7 +53,7 @@ namespace appl {
|
|||||||
public:
|
public:
|
||||||
void onDraw() override;
|
void onDraw() override;
|
||||||
void onRegenerateDisplay() override;
|
void onRegenerateDisplay() override;
|
||||||
void store(const etk::String& _userName, const etk::String& _value, const etk::String& _language);
|
void store(const etk::Uri& _baseUri, const etk::String& _userName, int32_t _userYearBirth, const etk::String& _value, const etk::String& _language);
|
||||||
protected:
|
protected:
|
||||||
esignal::Connection m_PCH; //!< Periodic Call Handle to remove it when needed
|
esignal::Connection m_PCH; //!< Periodic Call Handle to remove it when needed
|
||||||
/**
|
/**
|
@ -341212,3 +341212,10 @@ int32_t appl::wordList::getRandWord_FR() {
|
|||||||
return etk::tool::irand(0, wordListSize-1);
|
return etk::tool::irand(0, wordListSize-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t appl::wordList::getWord_FR_count() {
|
||||||
|
return wordListSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -10,5 +10,6 @@ namespace appl {
|
|||||||
namespace wordList {
|
namespace wordList {
|
||||||
etk::String getWord_FR(int32_t _id);
|
etk::String getWord_FR(int32_t _id);
|
||||||
int32_t getRandWord_FR();
|
int32_t getRandWord_FR();
|
||||||
|
int32_t getWord_FR_count();
|
||||||
};
|
};
|
||||||
}
|
}
|
61
wordRecorder/appl/wordList_FR_selected.cpp
Normal file
61
wordRecorder/appl/wordList_FR_selected.cpp
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2019, Edouard DUPIN, all right reserved
|
||||||
|
* @license MPL v2.0 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ewol/ewol.hpp>
|
||||||
|
#include <appl/debug.hpp>
|
||||||
|
#include <appl/wordList_FR_selected.hpp>
|
||||||
|
#include <etk/tool.hpp>
|
||||||
|
|
||||||
|
static const char* myWordList[] = {
|
||||||
|
"bonjour",
|
||||||
|
"ordinateur",
|
||||||
|
"oui",
|
||||||
|
"non",
|
||||||
|
"démare",
|
||||||
|
"arrête",
|
||||||
|
"joue",
|
||||||
|
"suivant",
|
||||||
|
"précédent",
|
||||||
|
"précédente",
|
||||||
|
"heure",
|
||||||
|
"jour",
|
||||||
|
"moi",
|
||||||
|
"année",
|
||||||
|
"ne",
|
||||||
|
"pas",
|
||||||
|
"est",
|
||||||
|
"maître",
|
||||||
|
"esclave",
|
||||||
|
"quelle",
|
||||||
|
"quel",
|
||||||
|
"comment",
|
||||||
|
"pourquoi",
|
||||||
|
"zoo",
|
||||||
|
"wagon",
|
||||||
|
"téléphone",
|
||||||
|
"télévision",
|
||||||
|
"appel",
|
||||||
|
"film",
|
||||||
|
"musique",
|
||||||
|
"vidéo",
|
||||||
|
"annimation",
|
||||||
|
"enfant",
|
||||||
|
"adulte"
|
||||||
|
};
|
||||||
|
static int32_t wordListSize = sizeof(myWordList)/sizeof(char*);
|
||||||
|
|
||||||
|
etk::String appl::wordList::getWord_FR_selected(int32_t _id) {
|
||||||
|
return myWordList[_id];
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t appl::wordList::getRandWord_FR_selected() {
|
||||||
|
return etk::tool::irand(0, wordListSize-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t appl::wordList::getWord_FR_selected_count() {
|
||||||
|
return wordListSize;
|
||||||
|
}
|
||||||
|
|
15
wordRecorder/appl/wordList_FR_selected.hpp
Normal file
15
wordRecorder/appl/wordList_FR_selected.hpp
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2019, Edouard DUPIN, all right reserved
|
||||||
|
* @license MPL v2.0 (see license file)
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <etk/types.hpp>
|
||||||
|
|
||||||
|
namespace appl {
|
||||||
|
namespace wordList {
|
||||||
|
etk::String getWord_FR_selected(int32_t _id);
|
||||||
|
int32_t getRandWord_FR_selected();
|
||||||
|
int32_t getWord_FR_selected_count();
|
||||||
|
};
|
||||||
|
}
|
25
wordRecorder/appl/wordList_number.cpp
Normal file
25
wordRecorder/appl/wordList_number.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2019, Edouard DUPIN, all right reserved
|
||||||
|
* @license MPL v2.0 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ewol/ewol.hpp>
|
||||||
|
#include <appl/debug.hpp>
|
||||||
|
#include <appl/wordList_number.hpp>
|
||||||
|
#include <etk/tool.hpp>
|
||||||
|
|
||||||
|
static int32_t wordListSize = 2000000000;
|
||||||
|
|
||||||
|
etk::String appl::wordList::getWord_number(int32_t _id) {
|
||||||
|
return etk::toString(_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t appl::wordList::getRandWord_number() {
|
||||||
|
return etk::tool::irand(0, wordListSize-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t appl::wordList::getWord_number_count() {
|
||||||
|
return wordListSize;
|
||||||
|
}
|
||||||
|
|
15
wordRecorder/appl/wordList_number.hpp
Normal file
15
wordRecorder/appl/wordList_number.hpp
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2019, Edouard DUPIN, all right reserved
|
||||||
|
* @license MPL v2.0 (see license file)
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <etk/types.hpp>
|
||||||
|
|
||||||
|
namespace appl {
|
||||||
|
namespace wordList {
|
||||||
|
etk::String getWord_number(int32_t _id);
|
||||||
|
int32_t getRandWord_number();
|
||||||
|
int32_t getWord_number_count();
|
||||||
|
};
|
||||||
|
}
|
@ -30,7 +30,9 @@ def configure(target, my_module):
|
|||||||
'appl/Windows.cpp',
|
'appl/Windows.cpp',
|
||||||
'appl/widget/DataViewer.cpp',
|
'appl/widget/DataViewer.cpp',
|
||||||
'appl/wordList_FR.cpp',
|
'appl/wordList_FR.cpp',
|
||||||
'appl/wordList_FR_ordered.cpp'
|
'appl/wordList_FR_ordered.cpp',
|
||||||
|
'appl/wordList_FR_selected.cpp',
|
||||||
|
'appl/wordList_number.cpp',
|
||||||
])
|
])
|
||||||
my_module.add_depend(['ewol', 'audio-river'])
|
my_module.add_depend(['ewol', 'audio-river'])
|
||||||
my_module.add_path(".")
|
my_module.add_path(".")
|
Loading…
x
Reference in New Issue
Block a user