Pull to refresh

Comments 10

Мнээ

Такое можно и на питон написать. Использовать Rust как клей для вызова библиотек такое себе.

Цель то какая? Я что-то упустил?

Будет интегрированно в Rust приложение? Это сервис / демон?

Про цель:

  • Статья получилась практическим рукаводством, которое может стать отправной точкой там, где нужно интегрировать аудио в Rust-приложение (будь то сервис, демон или десктопное приложение, как в моем случае). Цель — не написать "еще один диктофон", а показать на сколько я охуенен, как работать с низкоуровневыми аудиопотоками.

Про Python и Rust как "клей":

  • С Python, ты прав, это сделать проще. Но если только это. Если проект хотябы среднего размера, и его предстоит поддерживать, на Rust это бедет делать проще.

  • Да, здесь используется FFmpeg. Но ключевая часть — работа с CPAL, написана на Rust.

Кстати, вызов FFmpeg через команду позволяет параллельно и видео записывать, что удивительно, оставаясь в преемлимых ресурсах.

Хорошая статья. Было бы интересно как с микрофона сигнал передать в vosk-rs (там передескритизация нужна в 16000 (микрофон мака сильно больше минимальную частоту отдает))... у меня так и не вышло нормально ее реализовать

Привести фаайл в нужный формат (wav) для whisper-rs можно командой

ffmpeg -i samples/woice_sample.mp3 -ar 16000 -ac 1 -c:a pcm_s16le samples/woice_sample.wav

Должно подойти и для Воска.

Я имею ввиду аудио поток с микрофона в реальном времени напрямую - минуя файл... с файлом там и так пример есть

Распознание речи всеравно "чанками" происходит, чтобы в них целые слова попадали. Я бы посмотрел в эту сторону, чтобы писать короткие фрагменты с разрывами между словами.

println!("{}", config.sample_rate().0); // 48000
let mut recognizer = Recognizer::new(&model, config.sample_rate().0 as f32)

Работает но меня вот этот момент смущает - 48000 sample_rate на вход подается... еще потестирую но вроде это очень плохо для точности... (меньше нельзя выставить в микрофоне ноута (разве что 44100 но это не сильно помогает) - я пробовал и программно и руками через операционку)

Вот что говорит копилот (я сам в Audio теме ничего не понимаю):
Функция vosk_recognizer_new(model, sample_rate) ожидает, что частота дискретизации аудио совпадает с той, на которой обучена модель. Большинство моделей Vosk обучены на 16 кГц, и вот почему это критично:
Модели Vosk не делают ресемплирование автоматически.
Если вы подаёте аудио с частотой 48000 Гц, а модель обучена на 16000 Гц, то распознавание будет работать, но с пониженной точностью.
Это связано с тем, что акустические признаки (MFCC и др.) будут искажены.
Рекомендация: ресемплировать аудио до 16000 Гц перед подачей в распознаватель.
Например, с помощью sox, ffmpeg, dasp, cpal или других Rust-библиотек

И по моим предыдущим тестам - точность была просто отвратительной... если сравнивать с T-one моделью

Не знаю на счёт rust, но на си можно посмотреть официальные примеры как такое делать на ffmpeg:

https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/HEAD:/doc/examples/resample_audio.c

В примере происходит генерация sin tone с изменением частоты (48к double -> 44.1к s16) и с записью результата в файл (rawaudio). Можно взять этот пример и привести к нужному функционалу.

Копилот сам может не понимать, что он говорит :) Так в итоге, какова точность на текущий момент, если сравнить один и тот же аудио фрагмент в 48000 и 16000? Я бы предположил, что если распознавание работает не хуже, да в придачу к этому нас ещё и просят указать частоту дискретизации при вызове метода, то скорее всего, ресэмплинг 48k->16k всё же происходит где-то там под капотом (либо на стороне клиента, либо прямо на сервере).

Sign up to leave a comment.

Articles