<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Yuriy Gavrilov: posts tagged Audio</title>
<link>https://gavrilov.info/tags/audio/</link>
<description>Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov</description>
<author></author>
<language>en</language>
<generator>Aegea 11.4 (v4171e)</generator>

<itunes:owner>
<itunes:name></itunes:name>
<itunes:email>yvgavrilov@gmail.com</itunes:email>
</itunes:owner>
<itunes:subtitle>Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov</itunes:subtitle>
<itunes:image href="https://gavrilov.info/pictures/userpic/userpic-square@2x.jpg?1643451008" />
<itunes:explicit>no</itunes:explicit>

<item>
<title>Транскрибация аудио python на faster-whisper</title>
<guid isPermaLink="false">239</guid>
<link>https://gavrilov.info/all/transkribaciya-audio-python-na-faster-whisper/</link>
<pubDate>Tue, 27 May 2025 22:15:27 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/transkribaciya-audio-python-na-faster-whisper/</comments>
<enclosure url="https://gavrilov.info/audio/test.mp3" type="audio/mpeg" length="42578" />
<enclosure url="http://a.gavrilov.info/data/posts/AA_Cat_2025_v1.mp3" type="audio/mpeg" length="" />
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-174.png" width="256" height="256" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Все достаточно легко&lt;/p&gt;
&lt;p&gt;Подготовка&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;python3 -m venv ./whisper&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Активация и установка этого &lt;a href="https://github.com/SYSTRAN/faster-whisper"&gt;https://github.com/SYSTRAN/faster-whisper&lt;/a&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;source ./whisper/bin/activate
pip install faster-whisper&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Сам код&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;import sys
import os
import time
from faster_whisper import WhisperModel

# --- Конфигурация модели Whisper ---
model_size = &amp;quot;large-v3&amp;quot;
# Выберите свою конфигурацию:
# model = WhisperModel(model_size, device=&amp;quot;cuda&amp;quot;, compute_type=&amp;quot;float16&amp;quot;) # Если есть GPU и CUDA
# model = WhisperModel(model_size, device=&amp;quot;cuda&amp;quot;, compute_type=&amp;quot;int8_float16&amp;quot;) # Если есть GPU и CUDA с INT8
model = WhisperModel(model_size, device=&amp;quot;cpu&amp;quot;, compute_type=&amp;quot;int8&amp;quot;) # Для CPU (как в вашем примере)
# -----------------------------------

def transcribe_mp3_to_text(mp3_filepath):
    &amp;quot;&amp;quot;&amp;quot;
    Транскрибирует MP3 файл и сохраняет результат в текстовый файл.
    &amp;quot;&amp;quot;&amp;quot;
    if not os.path.exists(mp3_filepath):
        print(f&amp;quot;Ошибка: Файл MP3 не найден: {mp3_filepath}&amp;quot;)
        return False

    if not mp3_filepath.lower().endswith(&amp;quot;.mp3&amp;quot;):
        print(f&amp;quot;Ошибка: Файл '{mp3_filepath}' не является MP3 файлом. Пропускаем.&amp;quot;)
        return False

    # Извлечение имени файла без расширения
    filename_without_ext = os.path.splitext(os.path.basename(mp3_filepath))[0]
    output_txt_filepath = os.path.join(os.path.dirname(mp3_filepath), f&amp;quot;{filename_without_ext}.txt&amp;quot;)

    print(f&amp;quot;[{time.strftime('%Y-%m-%d %H:%M:%S')}] Начинаем транскрипцию '{mp3_filepath}'...&amp;quot;)
    print(f&amp;quot;Результат будет сохранен в '{output_txt_filepath}'&amp;quot;)

    try:
        segments, info = model.transcribe(mp3_filepath, beam_size=5)

        detected_language_msg = f&amp;quot;Detected language: '{info.language}' with probability {info.language_probability:.2f}&amp;quot;
        print(detected_language_msg)

        # Сохранение транскрипции в текстовый файл
        with open(output_txt_filepath, 'w', encoding='utf-8') as f_out:
            f_out.write(f&amp;quot;--- Транскрипция для: {os.path.basename(mp3_filepath)} ---\n&amp;quot;)
            f_out.write(f&amp;quot;{detected_language_msg}\n\n&amp;quot;)
            
            full_text = [] # Для сбора всего текста, если нужно вывести в конце

            for segment in segments:
                segment_line = f&amp;quot;[{segment.start:.2f}s -&amp;gt; {segment.end:.2f}s] {segment.text}&amp;quot;
                print(segment_line) # Выводим в консоль для отладки
                f_out.write(f&amp;quot;{segment.text}\n&amp;quot;) # Записываем только текст в файл, по сегментам
                full_text.append(segment.text)

            # Если вы хотите сохранить всю транскрипцию одним блоком в конце файла или отдельный файл
            # f_out.write(&amp;quot;\n\n--- Полный текст ---\n&amp;quot;)
            # f_out.write(&amp;quot; &amp;quot;.join(full_text))

        print(f&amp;quot;[{time.strftime('%Y-%m-%d %H:%M:%S')}] Транскрипция успешно завершена! Результат в '{output_txt_filepath}'&amp;quot;)
        return True

    except Exception as e:
        print(f&amp;quot;Ошибка при транскрипции файла '{mp3_filepath}': {e}&amp;quot;)
        # Вы можете добавить логирование ошибки в отдельный файл, если нужно
        return False

if __name__ == &amp;quot;__main__&amp;quot;:
    if len(sys.argv) &amp;lt; 2:
        print(&amp;quot;Использование: python process_mp3.py &amp;lt;путь/к/вашему/файлу.mp3&amp;gt;&amp;quot;)
        sys.exit(1)

    mp3_file_path_arg = sys.argv[1] # Это будет полный путь к MP3 файлу, переданный из Automator/Bash
    transcribe_mp3_to_text(mp3_file_path_arg)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Итоги запуска&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;(whisper) (base) yuriygavrilov@MacBookPro fastwhisper % python whisp.py            
Detected language 'ru' with probability 0.998883
[0.00s -&amp;gt; 4.96s]  Раз, два, три, привет, как дела?
[5.94s -&amp;gt; 8.54s]  Все хорошо, а у тебя как?
[9.54s -&amp;gt; 10.78s]  И у меня все хорошо
[10.78s -&amp;gt; 12.98s]  Спасибо, пока
(whisper) (base) yuriygavrilov@MacBookPro fastwhisper %&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;тестовый файл тут&lt;/p&gt;
&lt;div class="e2-text-audio"&gt;
&lt;div class="e2-text-super-wrapper e2-jouele-wrapper"&gt;&lt;a class="jouele" data-space-control="true" data-length="14" href="https://gavrilov.info/audio/test.mp3"&gt;test.mp3&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ограничений по времени нет, кормите его любыми файлами любой длины. Если нужно можно упростить запуск как хотите. На мак можно даже поставить действие на папку и при появлении там файлов типа mp3 они будут автоматически транскрибироваться.&lt;/p&gt;
&lt;p&gt;Буду делать через приложении на маке automator&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-05-29-v-04.39.57.png" width="316" height="342" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-05-27-v-21.04.40.png" width="1134" height="240" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Как то примерно так :)&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-05-27-v-21.38.38.png" width="1228" height="1198" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;осталось прикрутить это а действие к папке&lt;/p&gt;
&lt;p&gt;кажись заработало :)&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-05-27-v-22.07.03.png" width="132" height="58" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Создалась транскрипция сама&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-05-27-v-22.07.58.png" width="386" height="282" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-05-27-v-22.08.33.png" width="750" height="280" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;получилось в итоге вот так: Открываем Automator, настраиваем действие и все.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-05-27-v-22.10.06.png" width="1184" height="870" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-05-27-v-22.12.51.png" width="2482" height="490" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;работает так: кидаем файл в папку тест, скрипт запускается, транскрипция появляется рядом. Все.&lt;/p&gt;
&lt;p&gt;Проверим качество модели на этом:&lt;/p&gt;
&lt;div class="e2-text-audio"&gt;
&lt;div class="e2-text-super-wrapper e2-jouele-wrapper"&gt;&lt;a class="jouele" data-space-control="true" href="http://a.gavrilov.info/data/posts/AA_Cat_2025_v1.mp3"&gt;AA_Cat_2025_v1.mp3&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-05-27-v-22.24.14.png" width="824" height="558" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;почти идеал 🤘&lt;/p&gt;
&lt;p&gt;Второй раз чуть иначе, но почти точно.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-05-27-v-22.37.19.png" width="874" height="546" alt="" /&gt;
&lt;/div&gt;
</description>
</item>


</channel>
</rss>