コンピューター システム環境のアプリケーション ffmpeg は conda 環境では使用できません。ffmpeg はローカルの Windows マイクを呼び出して読み取ります。

1. ffmpegzai は conda 環境では実行できませんが、システム内では実行できます

import ffmpeg

stream = ffmpeg.input(r'D:\sound\222.mp4')
stream = ffmpeg.filter(stream, 'fps', fps=25, round='up')
stream = ffmpeg.output(stream, r'D:\sound\dummy2.mp4')
ffmpeg.run(stream)

エラーが報告されます:
ファイル「C:\Users\loong.conda\envs\nlp\lib\subprocess.py」、行 1435、_execute_child
hp、ht、pid、tid = _winapi.CreateProcess(executable, args,
FileNotFoundError ) : [WinError 2] 指定されたファイルが見つかりません。
ここに画像の説明を挿入
ここに画像の説明を挿入

解決策、すべての絶対パスを使用して実行すると正常に実行できます

C:/Users/loong/.conda/envs/nlp/python.exe  D:\sound\ffmpeg_sounddevice.py

ここに画像の説明を挿入

2. ffmpeg はローカル Windows マイクを呼び出して読み取ります。


(これは後続の他のデータドッキングに使用され、「-f」、「s16le」、 「-acodec」、「pcm_s16le」、
「-ar」、「16000」、サンプリング値が定式化されます)

デバイス名 name を表示します: ffmpeg -list_devices true -f dshow -i dummy
ここに画像の説明を挿入

ffmpeg_cmd = [
    "ffmpeg",
    "-f", "dshow",  # 使用alsa作为音频输入设备
    "-i", "audio=麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)",  # 使用默认的音频输入设备(麦克风)
    "-f", "s16le",
    "-acodec", "pcm_s16le",
    "-ar", "16000",
    "-ac", "1",
    "-"
]
ffmpeg_cmd = [
    "ffmpeg",
    "-f", "dshow",  # 使用dshow作为音频输入设备(名字必须是这个,其他会报错)
    "-i", "audio=Microphone",  # 麦克风的设备名称
    "-f", "s16le",
    "-acodec", "pcm_s16le",
    "-ar", "16000",
    "-ac", "1",
    "-"
]

このコマンドは、dshow をオーディオ入力デバイスとして使用し、Microphone という名前のマイク デバイスを指定します。別のマイクデバイス名を使用している場合は、実際のデバイス名に置き換えることができます。

他のパラメーターは、前述の Linux の例と同じ意味を持ちます。 -f s16le は、出力オーディオ形式が 16 ビット非圧縮 PCM オーディオであることを指定します。 -acodec pcm_s16le は、オーディオ コーデックが 16 ビット非圧縮 PCM オーディオであることを指定します。 -ar 16000サンプリング レートを指定します。16000Hz の場合、-ac 1 はチャネル数を 1 (モノラル) に指定します。

最後に、出力ファイル名が - に置き換えられ、オーディオ データがファイルに書き込まれるのではなく、標準出力を通じてストリーミングされることを示します。

上記のコマンド パラメーターは Windows システムに適用され、DirectShow がオーディオ入力デバイスとして使用されることに注意してください。別の OS で実行している場合は、適切なオーディオ入力デバイスとコマンド引数を使用してください。

import subprocess

import numpy as np


ffmpeg_cmd = [
    "ffmpeg",
    "-f", "dshow",  # 使用alsa作为音频输入设备
    "-i", "audio=麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)",  # 使用默认的音频输入设备(麦克风)
    "-f", "s16le",
    "-acodec", "pcm_s16le",
    "-ar", "16000",
    "-ac", "1",
    "-"
]

# 创建FFmpeg进程
process = subprocess.Popen(
    ffmpeg_cmd,
    stdout=subprocess.PIPE,
    stderr=subprocess.DEVNULL,
    bufsize=1600
)


# 读取和处理音频数据
while True:
    # 从FFmpeg进程中读取音频数据
    data = process.stdout.read(frames_per_read * channels * 2)  # 每个样本16位,乘以2
    if not data:
        break
    
    # 将音频数据转换为numpy数组
    samples = np.frombuffer(data, dtype=np.int16)
    samples = samples.astype(np.float32)
    # samples = MinMaxScaler(feature_range=(-1, 1)).fit_transform(samples.reshape(-1, 1))
    samples /= 32768.0  # 归一化到[-1, 1]范围
    ##数据后续处理逻辑

ffmpeg は数秒ごとにローカル コンピュータを保存します

ローカル サンプリング値「-f」、「wav」、
「-acodec」、「pcm_s16le」、
「-ar」、「44100」、
「-ac」、「2」、ローカル コンピューターは正常に再生できます

import subprocess
import time
import numpy as np



i = 0
while True:
    start_time = time.time()

    output_file = f"D:\llm\output{i}.wav"  # 创建输出文件名,例如output0.wav, output1.wav, ...

    ffmpeg_cmd = [
        "ffmpeg",
        "-f", "dshow",
        "-i", "audio=麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)",
        "-f", "wav",
        "-acodec", "pcm_s16le",
        "-ar", "44100",
        "-ac", "2",
        output_file,
    ]
    process = subprocess.Popen(ffmpeg_cmd)


    # 等待两秒
    time.sleep(2)

    # 终止ffmpeg进程
    process.terminate()

    i += 1

おすすめ

転載: blog.csdn.net/weixin_42357472/article/details/131441793