3.25 GB
17 files
Updated 2 months ago
Name
Size
.gitattributes1.75 kB
xet
README.md30.6 kB
xet
added_tokens.json34.6 kB
xet
config.json1.25 kB
xet
generation_config.json3.76 kB
xet
merges.txt494 kB
xet
model.safetensors3.24 GB
xet
normalizer.json52.7 kB
xet
preprocessor_config.json340 Bytes
xet
special_tokens_map.json2.19 kB
xet
test_sound_en.wav1.3 MB
xet
test_sound_nonspeech.wav320 kB
xet
test_sound_ru.wav959 kB
xet
test_sound_ru_longform.wav9.53 MB
xet
tokenizer.json2.71 MB
xet
tokenizer_config.json283 kB
xet
vocab.json1.04 MB
xet
README.md

Whisper-Podlodka-Turbo

Whisper-Podlodka-Turbo is a new fine-tuned version of a Whisper large-v3-turbo. The main goal of the fine-tuning is to improve the quality of speech recognition and speech translation for Russian and English, as well as reduce the occurrence of hallucinations when processing non-speech audio signals.

Model Description

Whisper-Podlodka-Turbo is a new fine-tuned version of Whisper-Large-V3-Turbo, optimized for high-quality Russian speech recognition with proper punctuation + capitalization and enhanced with noise resistance capability.

Key Benefits

  • 🎯 Improved Russian speech recognition quality compared to the base Whisper-Large-V3-Turbo model
  • ✍️ Correct Russian punctuation and capitalization
  • 🎧 Enhanced background noise resistance
  • 🚫 Reduced number of hallucinations, especially in non-speech segments

Supported Tasks

  • Automatic Speech Recognition (ASR):
    • πŸ‡·πŸ‡Ί Russian (primary focus)
    • πŸ‡¬πŸ‡§ English
  • Speech Translation:
    • Russian ↔️ English
  • Speech Language Detection (including non-speech detection)

Uses

Installation

Whisper-Podlodka-Turbo is supported in Hugging Face πŸ€— Transformers. To run the model, first install the Transformers library. For this example, we'll also install πŸ€— Datasets to load toy audio dataset from the Hugging Face Hub, and πŸ€— Accelerate to reduce the model loading time:

pip install --upgrade pip
pip install --upgrade transformers datasets[audio] accelerate

Also, I recommend using whisper-lid for initial spoken language detection. Therefore, this library is also worth installing:

pip install --upgrade whisper-lid

Usages Cases

Speech recognition

The model can be used with the pipeline class to transcribe audios of arbitrary language:

import librosa  # for loading sound from local file
from transformers import pipeline  # for working with Whisper-Podlodka-Turbo
import wget  # for downloading demo sound from its URL
from whisper_lid.whisper_lid import detect_language_in_speech  # for spoken language detection

model_id = "bond005/whisper-podlodka-turbo"  # the best Whisper model :-)
target_sampling_rate = 16_000  # Hz

asr = pipeline(model=model_id, device_map='auto', torch_dtype='auto')

# An example of speech recognition in Russian, spoken by a native speaker of this language
sound_ru_url = 'https://huggingface.co/bond005/whisper-podlodka-turbo/resolve/main/test_sound_ru.wav'
sound_ru_name = wget.download(sound_ru_url)
sound_ru = librosa.load(sound_ru_name, sr=target_sampling_rate, mono=True)[0]
print('Duration of sound with Russian speech = {0:.3f} seconds.'.format(
    sound_ru.shape[0] / target_sampling_rate
))
detected_languages = detect_language_in_speech(
    sound_ru,
    asr.feature_extractor,
    asr.tokenizer,
    asr.model
)
print('Top-3 languages:')
lang_text_width = max([len(it[0]) for it in detected_languages])
for it in detected_languages[0:3]:
    print('  {0:>{1}} {2:.4f}'.format(it[0], lang_text_width, it[1]))
recognition_result = asr(
    sound_ru,
    generate_kwargs={'task': 'transcribe', 'language': detected_languages[0][0]},
    return_timestamps=False
)
print(recognition_result['text'] + '\n')

# An example of speech recognition in English, pronounced by a non-native speaker of that language with an accent
sound_en_url = 'https://huggingface.co/bond005/whisper-podlodka-turbo/resolve/main/test_sound_en.wav'
sound_en_name = wget.download(sound_en_url)
sound_en = librosa.load(sound_en_name, sr=target_sampling_rate, mono=True)[0]
print('Duration of sound with English speech = {0:.3f} seconds.'.format(
    sound_en.shape[0] / target_sampling_rate
))
detected_languages = detect_language_in_speech(
    sound_en,
    asr.feature_extractor,
    asr.tokenizer,
    asr.model
)
print('Top-3 languages:')
lang_text_width = max([len(it[0]) for it in detected_languages])
for it in detected_languages[0:3]:
    print('  {0:>{1}} {2:.4f}'.format(it[0], lang_text_width, it[1]))
recognition_result = asr(
    sound_en,
    generate_kwargs={'task': 'transcribe', 'language': detected_languages[0][0]},
    return_timestamps=False
)
print(recognition_result['text'] + '\n')

As a result, you can see a text output like this:

Duration of sound with Russian speech = 29.947 seconds.
Top-3 languages:
         russian 0.9568
         english 0.0372
       ukrainian 0.0013
Ну, виспСр сам ΠΏΠΎ сСбС. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ виспСр? ВиспСр β€” это ΡƒΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ΅ end-to-end нСйросСтСвоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с авторСгрСссионным Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΎΠΌ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ это Π½Π΅ чистый энкодСр, ΠΊΠ°ΠΊ Wave2Vec, это Π½Π΅ просто тСкстовый сСк-Ρ‚ΠΎ-сСк, энкодСр-Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€, ΠΊΠ°ΠΊ T5, это ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ прСобразования Ρ€Π΅Ρ‡ΠΈ Π² тСкст, Π³Π΄Π΅ энкодСр ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, акустичСскиС Ρ„ΠΈΡ‡ΠΈ Ρ€Π΅Ρ‡ΠΈ, Π½Ρƒ ΠΈ сСмантика Ρ‚ΠΎΠΆΠ΅ постСпСнно ΠΏΠΎΠ΄ΠΌΠ΅ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ, Π° Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ β€” это ΡƒΠΆΠ΅ языковая модСль, которая Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠΊΠ΅Π½ Π·Π° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠΌ.

Duration of sound with English speech = 20.247 seconds.
Top-3 languages:
         english 0.9526
         russian 0.0311
          polish 0.0006
Ensembling can help us to solve a well-known bias-variance trade-off. We can decrease variance on basis of large ensemble, large ensemble of different algorithms.

Speech recognition with timestamps

In addition to the usual recognition, the model can also provide timestamps for recognized speech fragments:

recognition_result = asr(
    sound_ru,
    generate_kwargs={'task': 'transcribe', 'language': 'russian',
    return_timestamps=True
)
print('Recognized chunks of Russian speech:')
for it in recognition_result['chunks']:
    print(f'  {it}')

recognition_result = asr(
    sound_en,
    generate_kwargs={'task': 'transcribe', 'language': 'english'},
    return_timestamps=True
)
print('\nRecognized chunks of English speech:')
for it in recognition_result['chunks']:
    print(f'  {it}')

As a result, you can see a text output like this:

Recognized chunks of Russian speech:
  {'timestamp': (0.0, 4.8), 'text': 'Ну, виспСр, сам ΠΏΠΎ сСбС, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ виспСр. ВиспСр β€” это ΡƒΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ΅'}
  {'timestamp': (4.8, 8.4), 'text': ' end-to-end нСйросСтСвоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с авторСгрСссионным Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΎΠΌ.'}
  {'timestamp': (8.4, 10.88), 'text': ' Π’ΠΎ Π΅ΡΡ‚ΡŒ, это Π½Π΅ чистый энкодСр, ΠΊΠ°ΠΊ Wave2Vec.'}
  {'timestamp': (10.88, 15.6), 'text': ' Π­Ρ‚ΠΎ Π½Π΅ просто тСкстовый сСк-Ρ‚ΠΎ-сСк, энкодСр-Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€, ΠΊΠ°ΠΊ T5.'}
  {'timestamp': (15.6, 19.12), 'text': ' Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ прСобразования Ρ€Π΅Ρ‡ΠΈ Π² тСкст,'}
  {'timestamp': (19.12, 23.54), 'text': ' Π³Π΄Π΅ энкодСр ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, акустичСскиС Ρ„ΠΈΡ‡ΠΈ Ρ€Π΅Ρ‡ΠΈ,'}
  {'timestamp': (23.54, 25.54), 'text': ' Π½Ρƒ ΠΈ сСмантика Ρ‚ΠΎΠΆΠ΅ постСпСнно ΠΏΠΎΠ΄ΠΌΠ΅ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ,'}
  {'timestamp': (25.54, 29.94), 'text': ' Π° Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ β€” это ΡƒΠΆΠ΅ языковая модСль, которая Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠΊΠ΅Π½ Π·Π° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠΌ.'}

Recognized chunks of English speech:
  {'timestamp': (0.0, 8.08), 'text': 'Ensembling can help us to solve a well-known bias-variance trade-off.'}
  {'timestamp': (8.96, 20.08), 'text': 'We can decrease variance on basis of large ensemble, large ensemble of different algorithms.'}

Long-form speech recognition

While previous examples demonstrate accurate transcription for audio segments under thirty seconds, practical applications often require processing extensive recordings ranging from several minutes to multiple hours. This necessitates specialized techniques like the sliding window approach to overcome memory constraints and preserve contextual coherence across the entire signal. The following example showcases the model's capability to handle such long-form audio, enabling accurate transcription of lectures, interviews, and meetings.

import nltk  # for splitting long text into sentences
from whisper_lid.whisper_lid import detect_language_in_long_speech  # for spoken language detection in long audio

nltk.download('punkt_tab')

long_sound_ru_url = 'https://huggingface.co/bond005/whisper-podlodka-turbo/resolve/main/test_sound_ru_longform.wav'
long_sound_ru_name = wget.download(long_sound_ru_url)
long_sound_ru = librosa.load(long_sound_ru_name, sr=target_sampling_rate, mono=True)[0]
print('Duration of long sound with Russian speech = {0:.3f} seconds.'.format(
    sound_ru.shape[0] / target_sampling_rate
))

detected_languages, _ = detect_language_in_long_speech(
    long_sound_ru,
    asr.feature_extractor,
    asr.tokenizer,
    asr.model
)
print('\nTop-3 languages:')
lang_text_width = max([len(it[0]) for it in detected_languages])
for it in detected_languages[0:3]:
    print('  {0:>{1}} {2:.4f}'.format(it[0], lang_text_width, it[1]))

recognition_result = asr(
    sound_ru_longform,
    generate_kwargs={
        'max_new_tokens': 410,
        'num_beams': 5,  # beam search width (higher values improve accuracy at the cost of increased computation)
        'condition_on_prev_tokens': False,
        'compression_ratio_threshold': 2.4,             # used to detect and suppress repetitive loops (a common failure mode)
        'temperature': (0.0, 0.2, 0.4, 0.6, 0.8, 1.0),  # controls the randomness of token sampling during generation
        'logprob_threshold': -1.0,   # the threshold for the average log-probability of the generated tokens (provides a filter to exclude low-confidence, potentially erroneous transcriptions)
        'no_speech_threshold': 0.6,  # threshold for the probability of the `<|nospeech|>` token (segments with a probability above this threshold are considered silent and skipped)
        'task': 'transcribe',
        'language': detected_languages[0][0]
    },
    return_timestamps=True
)
print('\nRecognized text in the long audio, split into sentences:')
for it in map(lambda sent: sent.strip(), nltk.sent_tokenize(recognition_result['text'])):
    print(f'  {it}')

As a result, you can see a text output like this:

Duration of long sound with Russian speech = 148.845 seconds.

Top-3 languages:
         russian 0.9787
         english 0.0186
       ukrainian 0.0006

Recognized text in the long audio, split into sentences:
  ЗдравствуйтС, Π΄Ρ€ΡƒΠ·ΡŒΡ!
  ЗдравствуйтС!
  Π― ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π°Π΄ вас всСх Π²ΠΈΠ΄Π΅Ρ‚ΡŒ здСсь, Π² этом Π·Π°Π»Π΅ Π½Π° Π₯Π°ΠΉΠ»ΠΎΠΎΠ΄Π΅.
  Π― Иван, ΠΊΠ°ΠΊ мСня ΡƒΠΆΠ΅ прСдставили, ΠΈ я люблю машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅.
  Π― люблю машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ с 2005 Π³ΠΎΠ΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ ΠΏΡ€ΠΎΠ½ΠΈΠΊΠ»ΠΎ Π² ΠΌΠΎΡ‘ сСрдцС Π΅Ρ‰Ρ‘, ΠΊΠΎΠ³Π΄Π° я Π±Ρ‹Π» студСнтом.
  Π‘ 2006 Π³ΠΎΠ΄Π° я Ρ€Π°Π±ΠΎΡ‚Π°Π» Π² акадСмичСской сфСрС, ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°Π²Π°Π» Π½Π΅ΠΉΡ€ΠΎΠ½Π½Ρ‹Π΅ сСти, искусствСнный ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚, машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ своим студСнтам.
  Π‘ Ρ‚Ρ€ΠΈΠ½Π°Π΄Ρ†Π°Ρ‚ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° я ΠΏΠ΅Ρ€Π΅ΡˆΡ‘Π» Π² IT-ΠΈΠ½Π΄ΡƒΡΡ‚Ρ€ΠΈΡŽ, Ρ€Π°Π±ΠΎΡ‚Π°Π» Π² Ρ€Π°Π·Π½Ρ‹Ρ… компаниях, занимаясь ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ всё Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈ искусством ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΠΎΠΌ.
  И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π² Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π³ΠΎΠ΄Ρƒ ΠΌΠ½Π΅ всё это Π½Π°Π΄ΠΎΠ΅Π»ΠΎ, я Ρ€Π΅ΡˆΠΈΠ» ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΈΠ· IT-индустрии ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² Π°ΠΊΠ°Π΄Π΅ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ сфСру.
  И сСйчас я Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ Π² Новосибирском государствСнном унивСрситСтС, занимаюсь Π½Π°ΡƒΡ‡Π½Ρ‹ΠΌΠΈ исслСдованиями, ΡƒΡ‡Ρƒ студСнтов, Π΄Π΅Π»Π°Π΅ΠΌ всякиС интСрСсныС ΡˆΡ‚ΡƒΠΊΠΈ.
  Ну, Π° Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° я ΠΈ ΠΌΠΎΠΈ ΡƒΡ‡Π΅Π½ΠΈΠΊΠΈ Ρ€Π΅ΡˆΠΈΠ»ΠΈ всё-Ρ‚Π°ΠΊΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ исслСдованиями Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ, ΠΈ Π½Π°ΡƒΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠ½ΠΎΡΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·Ρƒ людям, ΠΈ ΠΌΡ‹ сдСлали малСнький стартап ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ «БибирскиС нСйросСти».
  Π’ΠΎ Π΅ΡΡ‚ΡŒ, сибирскоС Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΠ΅ ΠΈ сибирскиС нСйросСти Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ.
  Всё, Ρ‡Ρ‚ΠΎ я Π΄Π΅Π»Π°Π», ΠΎΠ½ΠΎ связано ΠΎΠ΄Π½ΠΈΠΌ, ΠΌΠΎΠ΅ΠΉ любовью ΠΊ ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡŽ.
  МнС это ΠΎΡ‡Π΅Π½ΡŒ интСрСсно Π±Ρ‹Π»ΠΎ всСгда.
  Ну, Π° ΠΏΠΎΠΌΠΈΠΌΠΎ машинного обучСния, ΠΌΠ½Π΅ интСрСсно ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² сорСвнованиях.
  НаучныС сорСвнования β€” это Π½Π΅ просто способ Ρ€Π°Π·Π²Π»Π΅Ρ‡ΡŒΡΡ, это способ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎ гамбургскому счСту, насколько Ρ‚Π²ΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ…ΠΎΡ€ΠΎΡˆ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π² сравнСнии с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ.
  Когда ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ систСму для Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ°, ΠΌΡ‹ ориСнтируСмся Π½Π° Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅, эти Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ кастомизации, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ качСство, ΠΌΠΎΠΆΠ΅Ρ‚, Π΄Π°ΠΆΠ΅ Ρ‡Π΅Ρ€Π΅ΠΏΠΈΠΊΠΈΠ½Π³ ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π΅Π»Π°Π΅ΠΌ, хотя это Ρ„Ρƒ, Π½ΠΎ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅.
  А ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ наши Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, наш Π½Π°ΡƒΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, наш Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π½Π° сорСвновании, ΠΌΡ‹ всС Π² Ρ€Π°Π²Π½Ρ‹Ρ… условиях, ΠΈ ΠΌΡ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ, насколько Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ‚ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ сСбя ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚.
  ΠŸΡ€ΠΈ этом самоС Π³Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ сорСвнования Π΄Π°ΡŽΡ‚ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… датасСтов для дальнСйшСй воспроизводимости, Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΎΠΏΡΡ‚ΡŒ-Ρ‚Π°ΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Π½Π°ΡƒΠΊΠ΅, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° воспроизводимости стоит остро, А ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π½Π°ΡƒΡ‡Π½Ρ‹Π΅ сорСвнования, я имСю Π² Π²ΠΈΠ΄Ρƒ Π½Π΅ КСгл, Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ интСрСсноС ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ‚Π°ΠΊΠΎΠ΅ систСмноС, ΠΎΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΡƒΠΊΠΈ Π²ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ.

Voice activity detection (speech/non-speech)

Along with special language tokens, the model can also return the special token <|nospeech|>, if the input audio signal does not contain any speech (for details, see section 2.3 of the corresponding paper about Whisper). This skill of the model forms the basis of the speech/non-speech classification algorithm, as demonstrated in the following example:

nonspeech_sound_url = 'https://huggingface.co/bond005/whisper-podlodka-turbo/resolve/main/test_sound_nonspeech.wav'
nonspeech_sound_name = wget.download(nonspeech_sound_url)
nonspeech_sound = librosa.load(nonspeech_sound_name, sr=target_sampling_rate, mono=True)[0]
print('Duration of sound without speech = {0:.3f} seconds.'.format(
    nonspeech_sound.shape[0] / target_sampling_rate
))
detected_languages = detect_language_in_speech(
    nonspeech_sound,
    asr.feature_extractor,
    asr.tokenizer,
    asr.model
)
print('Top-3 languages:')
lang_text_width = max([len(it[0]) for it in detected_languages])
for it in detected_languages[0:3]:
    print('  {0:>{1}} {2:.4f}'.format(it[0], lang_text_width, it[1]))

As a result, you can see a text output like this:

Duration of sound without speech = 10.000 seconds.
Top-3 languages:
       NO SPEECH 0.9957
         lingala 0.0002
       cantonese 0.0002

Speech translation

In addition to the transcription task, the model also performs speech translation (although it translates better from Russian into English than from English into Russian):

print(f'Speech translation from Russian to English:')
recognition_result = asr(
    sound_ru,
    generate_kwargs={'task': 'translate', 'language': 'english'},
    return_timestamps=False
)
print(recognition_result['text'] + '\n')

print(f'Speech translation from English to Russian:')
recognition_result = asr(
    sound_en,
    generate_kwargs={'task': 'translate', 'language': 'russian'},
    return_timestamps=False
)
print(recognition_result['text'] + '\n')

As a result, you can see a text output like this:

Speech translation from Russian to English:
Well, Visper, what is Visper? Visper is already a complete end-to-end neural network with an autoregressive decoder. That is, it's not a pure encoder like Wave2Vec, it's not just a text-to-seq encoder-decoder like T5, it's a complete algorithm for the transformation of speech into text, where the encoder considers, first of all, acoustic features of speech, well, and the semantics are also gradually moving, and the decoder is already a language model that generates token by token.

Speech translation from English to Russian:
ЭнсСмблинг ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстный Ρ‚ΠΎΡ€Π³ΠΎΠ²Ρ‹ΠΉ Π±Π°ΠΉΠ·-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π½Π° основС ΠΊΡ€ΡƒΠΏΠ½ΠΎΠ³ΠΎ энсСмбла, ΠΊΡ€ΡƒΠΏΠ½ΠΎΠ³ΠΎ энсСмбла Ρ€Π°Π·Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

As you can see, in both examples the speech translation contains some errors, however in the example of translation from English to Russian these errors are more significant.

Bias, Risks, and Limitations

  • While improvements are observed for English and translation tasks, statistically significant advantages are confirmed only for Russian ASR
  • The model's performance on code-switching speech (where speakers alternate between Russian and English within the same utterance) has not been specifically evaluated
  • Inherits basic limitations of the Whisper architecture

Training Details

Training Data

The model was fine-tuned on a composite dataset including:

Training Features

1. Data Augmentation:

  • Dynamic mixing of speech with background noise and music
  • Gradual reduction of signal-to-noise ratio during training

2. Text Data Processing:

3. Training Strategy:

  • Progressive increase in training example complexity
  • Balanced sampling between speech and non-speech data
  • Special handling of language tokens and no-speech detection (<|nospeech|>)

Evaluation

The experimental evaluation focused on two main tasks:

  1. Russian speech recognition
  2. Speech activity detection (binary classification "speech/non-speech")

Testing was performed on publicly available Russian speech corpora. Speech recognition was conducted using the standard pipeline from the Hugging Face πŸ€— Transformers library. Due to the limitations of this pipeline in language identification and non-speech detection (caused by a certain bug), the whisper-lid library was used for speech presence/absence detection in the signal.

Testing Data & Metrics

Testing Data

The quality of the Russian speech recognition task was tested on test sub-sets of six different datasets:

The quality of the long-form Russian speech recognition was tested on the dangrebenkin/long_audio_youtube_lectures dataset, developed by Daniel Grebenkin. This dataset contains seven long-form (20-40 minute) Russian audio recordings that were manually annotated. The audios cover a variety of topics and speaking styles; they are excerpts from Russian scientific lectures on various subjects: philology, mathematics, history, etc. All recordings were made in relatively quiet, lecture-hall-like acoustic environments. However, some natural background noises, such as the sound of chalk on a blackboard, are present.

The quality of the voice activity detection task was tested on test sub-sets of two different datasets:

Noise was added using a special augmenter capable of simulating the superposition of five different types of acoustic noise (reverberation, speech-like sounds, music, household sounds, and pet sounds) at a given signal-to-noise ratio (in this case, a signal-to-noise ratio of 2 dB was used).

The quality of the robust Russian speech recognition task was tested on test sub-set of above-mentioned noised Golos Crowd.

Metrics

1. Modified WER (Word Error Rate) for Russian speech recognition quality:

  • Text normalization before WER calculation:
    • Unification of numeral representations (digits/words)
    • Standardization of foreign words (Cyrillic/Latin scripts)
    • Accounting for valid transliteration variants
  • Enables more accurate assessment of semantic recognition accuracy
  • The lower the WER, the better the speech recognition quality

2. F1-score for speech activity detection:

  • Binary classification "speech/non-speech"
  • Evaluation of non-speech segment detection accuracy using <|nospeech|> token
  • The higher the F1 score, the better the voice activity detection quality

Generation Parameters

For experiments with short audio signals (under 30 seconds), we used standard greedy decoding (num_beams=1). For long-form audio, two approaches were tested: simple 30-second chunking and the sequential long-form algorithm.

For the sequential long-form mode, the implementation followed the strategy from Section 4.5 of the paper about Whisper with two key hyperparameter differences:

  1. Beam Search: The paper implies the use of beam search for optimal performance, while our initial experiments for this task used greedy decoding (num_beams=1).

  2. Compression Ratio Threshold: A key deviation was the use of a more conservative compression_ratio_threshold of 1.35 (compared to 2.4 in the paper). This lower threshold makes the repetition-detection algorithm significantly more aggressive, triggering fallback mechanisms (e.g., temperature rescoring) sooner to suppress repetitive outputs.

The parameters for voice activity detection (no_speech_threshold=0.6) and low-confidence detection (logprob_threshold=-1.0) were kept aligned with the paper's recommendations. Context conditioning between segments (condition_on_prev_tokens) was disabled for this experimental run.

Results

Automatic Speech Recognition (ASR)

Result (WER, %):

Dataset bond005/whisper-podlodka-turbo openai/whisper-large-v3-turbo
bond005/podlodka_speech 8.17 8.33
rulibrispeech 9.76 10.25
sberdevices_golos_farfield 11.61 20.12
sberdevices_golos_crowd 11.85 14.55
sova_rudevices 15.35 17.70
common_voice_11_0 5.22 6.63

Long-form ASR

Result (WER, %):

Dataset bond005/whisper-podlodka-turbo openai/whisper-large-v3-turbo
the simple chunking 11.66 15.98
the sequential long-form algorithm 7.84 9.59

Voice Activity Detection (VAD)

Result (F1):

bond005/whisper-podlodka-turbo openai/whisper-large-v3-turbo
0.9235 0.8484

Robust ASR (SNR = 2 dB, speech-like noise, music, etc.)

Result (WER, %):

Dataset bond005/whisper-podlodka-turbo openai/whisper-large-v3-turbo
sberdevices_golos_crowd (noised) 46.58 75.20

Citation

If you use this model in your work, please cite it as:

@misc{whisper-podlodka-turbo,
  author = {Ivan Bondarenko},
  title = {Whisper-Podlodka-Turbo: Enhanced Whisper Model for Russian ASR},
  year = {2025},
  publisher = {Hugging Face},
  journal = {Hugging Face Model Hub},
  howpublished = {\url{https://huggingface.co/bond005/whisper-podlodka-turbo}}
}
Total size
3.25 GB
Files
17
Last updated
Jun 29
Pre-warmed CDN
US EU US EU

Contributors