Skip to content

Commit f827e44

Browse files
committed
Merge remote-tracking branch 'origin' into links_to_task_attempts_151
2 parents 654cd97 + a51cf6e commit f827e44

File tree

6 files changed

+116
-9
lines changed

6 files changed

+116
-9
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
.venv
22
venv
3+
.venv
34
.idea
45
ssl
56
__pycache__

app/criteria/utils.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from app.root_logger import get_root_logger
22
import math
33
import traceback
4+
import string # to remove punctuation
45
from typing import Optional, Callable
56

67
from app.audio import Audio
@@ -60,13 +61,20 @@ def get_proportional_result(value: float,
6061
else:
6162
return f(upper_bound / value)
6263

63-
6464
def get_fillers(fillers: list, audio: Audio) -> list:
6565
found_fillers = []
66+
# пунктуация + пробелы для str.translate
67+
removable = string.punctuation + string.whitespace
68+
translation_table = str.maketrans('', '', removable)
69+
6670
for audio_slide in audio.audio_slides:
6771
found_slide_fillers = []
72+
# добавлена предобработка слов - перевод в нижний регистр, очистка от пунктуации
6873
audio_slide_words = [
69-
recognized_word.word.value for recognized_word in audio_slide.recognized_words]
74+
recognized_word.word.value.lower().translate(translation_table)
75+
for recognized_word in audio_slide.recognized_words
76+
]
77+
7078
for i in range(len(audio_slide_words)):
7179
for filler in fillers:
7280
filler_split = filler.split()

app/filters.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def __new__(cls):
2727
cls.init_done = True
2828
return cls.instance
2929

30-
def __collect_filters(self, filters: dict) -> (dict, dict):
30+
def __collect_filters(self, filters: dict) -> tuple[dict, dict]:
3131
simple_filters = {}
3232
complex_filters = {}
3333

@@ -64,8 +64,11 @@ def __create_simple_query(self, applicable_filters: dict) -> dict:
6464
logger.info("ELSE ID: " + str(values[0]))
6565
mongodb_query[key] = ObjectId(values[0])
6666
elif key == "username" or key == "full_name":
67-
# Частичное совпадение
68-
mongodb_query[key] = {"$regex": regex.escape(values[0], literal_spaces=True)}
67+
# Частичное совпадение без учета регистра
68+
mongodb_query[key] = {
69+
"$regex": regex.escape(values[0], literal_spaces=True),
70+
"$options": 'i'
71+
}
6972
elif key == "presentation_record_duration":
7073
# Range по длительности воспроизведения
7174
start_range_time = datetime.strptime(values[0], "%M:%S").time()

app/static/css/training.css

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
}
2121
.tutorButtons{
2222
width: 80px;
23-
height 30px;
23+
height: 30px;
2424
}
2525
.model {
2626
display: none;
@@ -37,7 +37,7 @@
3737
background-color: #f2dede;
3838
margin: 15% auto;
3939
padding: 20px;
40-
border: 1px solid #ebccd;
40+
border: 1px solid #ebccd0;
4141
width: 50%;
4242
text-align: center;
4343
color: #a94442;
@@ -47,11 +47,13 @@
4747
display: flex;
4848
font-size: 18px;
4949
margin-top: 1%;
50+
align-items: center;
51+
gap: 30px;
5052
}
5153
.pulse{
5254
position: relative;
5355
text-align: center;
54-
left: 25px;
56+
/* left: 25px; */
5557
border-radius: 50%;
5658
background: #ff0000;
5759
width: 20px;

app/static/js/recording.js

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,13 @@ function startRecording() {
5656
time++;
5757
}, 1000);
5858
}, 3000);
59+
5960
let audioContext = new window.AudioContext();
6061
gumStream = stream;
6162
input = audioContext.createMediaStreamSource(stream);
63+
64+
startMicVisualizer(stream, audioContext);
65+
6266
recorder = new WebAudioRecorder(input, {
6367
workerDir: "/static/js/libraries/WebAudioRecorder.js/",
6468
encoding: "mp3",
@@ -126,3 +130,91 @@ $(document).ready(function () {
126130
return "Do you really want to close?";
127131
};
128132
});
133+
134+
function startMicVisualizer (stream, audioContext) {
135+
const canvasElement = document.querySelector("#mic-visualizer-canvas");
136+
const canvasVisializerCxt = canvasElement.getContext("2d");
137+
const volumeLevelElement = document.querySelector("#volume-level-box");
138+
139+
const audioStream = audioContext.createMediaStreamSource( stream );
140+
const analyser = audioContext.createAnalyser();
141+
const fftSize = 128;
142+
143+
analyser.fftSize = fftSize;
144+
audioStream.connect(analyser);
145+
146+
const bufferLength = analyser.frequencyBinCount;
147+
148+
let frequencyArray = new Uint8Array(bufferLength);
149+
150+
const setUpCanvas = function () {
151+
canvasVisializerCxt.fillStyle = "rgb(255 255 255)";
152+
canvasVisializerCxt.fillRect(0, 0, canvasElement.width, canvasElement.height);
153+
154+
canvasVisializerCxt.lineWidth = 1.5;
155+
canvasVisializerCxt.strokeStyle = "rgb(0 0 0)";
156+
157+
canvasVisializerCxt.beginPath();
158+
}
159+
160+
const doDraw = function () {
161+
requestAnimationFrame(doDraw);
162+
163+
setUpCanvas();
164+
165+
const sliceWidth = (canvasElement.width * 1.0) / (bufferLength + 1);
166+
167+
canvasVisializerCxt.moveTo(0, canvasElement.height / 2);
168+
169+
let x = 0 + sliceWidth;
170+
171+
analyser.getByteFrequencyData(frequencyArray);
172+
173+
let direction = 1;
174+
175+
for (let i = 0; i < bufferLength; i++) {
176+
const v = frequencyArray[i] / (canvasElement.height * 2);
177+
const y = (v * canvasElement.height) / 2;
178+
179+
canvasVisializerCxt.lineTo(x, canvasElement.height / 2 + y * direction);
180+
181+
x += sliceWidth;
182+
direction *= -1;
183+
}
184+
185+
canvasVisializerCxt.lineTo(canvasElement.width, canvasElement.height / 2);
186+
canvasVisializerCxt.stroke();
187+
}
188+
189+
const showVolume = function () {
190+
setTimeout(showVolume, 500);
191+
192+
analyser.getByteFrequencyData(frequencyArray);
193+
let total = 0
194+
195+
for(let i = 0; i < bufferLength; i++) {
196+
let x = frequencyArray[i];
197+
total += x * x;
198+
}
199+
200+
const rms = Math.sqrt(total / bufferLength);
201+
let db = 20 * ( Math.log(rms) / Math.log(10) );
202+
203+
db = Math.max(db, 0);
204+
205+
let status = "";
206+
207+
// добавить эти поля в локаль
208+
if (db == 0) {
209+
status = "Ваш микрофон не работает";
210+
}
211+
else if (db <= 35) { // или другое значение/проверка (например только по средним частотам)
212+
status = "Пожалуйста, говорите громче"; // проверить, что пауза достаточно продолжительна
213+
}
214+
215+
volumeLevelElement.innerHTML = `db: ${db.toFixed(1)} ${status}`;
216+
}
217+
218+
doDraw();
219+
showVolume();
220+
}

app/templates/training.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
<div id="record-contain" style="display: none;">
2020
Идёт запись
2121
<div class="pulse"></div>
22-
22+
<canvas id="mic-visualizer-canvas" width="128" height="96"></canvas>
23+
<span id="volume-level-box"></span>
2324
</div>
2425

2526
<div id="controls">

0 commit comments

Comments
 (0)