2017-04-18 12 views
2

ファイルからマイクにオーディオデータをフィードする方法を探しています。などのサードパーティアプリケーションやChromiumの「search by voice」機能などのマイクを使用している場合オーディオ入力の場合は、代わりにファイルからオーディオデータを受信します。Linuxパイプオーディオファイルからマイク入力

ここに私のシナリオ:私が書いたアプリケーションは、(ALSAを使って)マイクからオーディオデータを記録し、それをファイル(audioFile0.raw)に保存します。未知の時点では、未知の第三者アプリケーション(Chromium Webブラウザの「音声による検索」機能などの開発コントロールがないように、私が開発していないものもあります)のマイクを使用します音声データを取得する。サードパーティのアプリケーションが集めているオーディオデータを、実際のマイク自体ではなく、audioFile.rawから取得したいと思います。

デフォルトのオーディオ入力デバイスをオーディオファイルまたは名前付きパイプに変更して、cat audioFile0.raw > mypipeのようなものを実行することができたと思っていました(別のアプリケーションがマイクから読み込もうとしたとき)。おそらくこれを行うもっと簡単な方法がありますか?

私は十分な詳細と明確さを提供したいと思います。何かが不明な場合は教えてください。


EDIT: は、だから私は自分のホームディレクトリに、次の.asoundrcファイルを作成することにより、仮想マイクを作る方法を考え出し

pcm.!virtmic { 
    type file 
    slave.pcm "hw:0,0" 
    file /dev/null 
    infile "/home/charles/audioFiles/audioFile0.raw" 
} 

pcm.!default { 
    type hw 
    card 0 
} 

ctl.!default { 
    type hw 
    card 0 
} 

は、私は、コマンドラインからarecord test.raw -c 1 -f S16_LE -r 16000 -t raw -D virtmicを呼び出し、私はaudioFile0.rawにあるオーディオデータをtest.rawに録音できます。

マイクにアクセスするアプリケーションが実際のマイク自体ではなくaudioFile0.rawのオーディオデータを読み込むように、デフォルトのデバイスをマイクに置き換えることが私の目標です。だから私は、次のように表示されるように私の.asoundrcファイルを編集した:

pcm.!virtmic { 
    type file 
    slave.pcm "hw:0,0" 
    file /dev/null 
    infile "/home/charles/audioFiles/audioFile0.raw" 
} 

pcm.!default { 
    type asym 
    playback.pcm { 
     type hw 
     card 0 
    } 
    capture.pcm { 
     type plug 
     slave.pcm "virtmic" 
    } 
} 

ctl.!default { 
    type hw 
    card 0 
} 

それから私は、コマンドラインからarecord test.raw -c 1 -f S16_LE -r 16000 -t rawと呼ばれます。私はtest.rawを再生しましたが、それはマイク自体からの録音であり、audioFile0.rawではないようです。

私は間違っていますか?マイクの入力ではなくaudioFile0.rawのデータを読み込むように、デフォルトのキャプチャデバイスをどのくらい正確に変更しますか?


EDIT 2:わかりましたので、私は正しい軌道に乗っていました。私は私が前に示した私のホームディレクトリに同じ.asoundrcファイルを使用しています。どこにデフォルトデバイスをvirtmicに変更しましたか? 、

# PulseAudio alsa plugin configuration file to set the pulseaudio plugin as 
# default output for applications using alsa when pulseaudio is running. 
hook_func.pulse_load_if_running { 
    lib "libasound_module_conf_pulse.so" 
    func "conf_pulse_hook_load_if_running" 
} 

@hooks [ 
    { 
     func pulse_load_if_running 
     files [ 
#   "/usr/share/alsa/pulse-alsa.conf" 
      "/home/charles/.asoundrc" 
     ] 
     errors false 
    } 
] 

私がやった唯一の事は、ライン"/usr/share/alsa/pulse-alsa.conf"をコメントアウトので、PulseAudioはプラグインがALSAを使用してアプリケーションのデフォルトではありません"/home/charles/.asoundrc"に置き換えた:私は、ファイル/usr/share/alsa/alsa.conf.d/pulse.confを変更するために必要なので、それはこのようになりますむしろ私のバーチャルマイクをデフォルトとして使います。これは最良の解決策ではないかもしれませんが、機能します。

これは私がarecord test.raw -t raw -c 1 -f S16_LE -r 16000をしたときに機能しました。マイクの代わりにaudiofile0.rawのデータがあります。私は、コマンドlsof /dev/snd/*を使用して、arecordコマンドが実行されている間、オーディオデバイスに正確に何がアクセスしていたかを確認しました。次のように出力されました:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 
pulseaudi 2044 charles 22u CHR 116,6  0t0 8977 /dev/snd/controlC0 
pulseaudi 2044 charles 29u CHR 116,6  0t0 8977 /dev/snd/controlC0 
arecord 4051 charles mem CHR 116,5   8976 /dev/snd/pcmC0D0c 
arecord 4051 charles 4u CHR 116,5  0t0 8976 /dev/snd/pcmC0D0c 

私はその後、クロムのブラウザの「検索音声による」機能を使用してみましたし、私はそれがaudioFile0.rawから録音することができなかったことを見ました。次に、lsof /dev/snd/*を使用して、オーディオデバイスに正確にアクセスしていたものを確認しました。

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 
pulseaudi 2044 charles mem CHR 116,5   8976 /dev/snd/pcmC0D0c 
pulseaudi 2044 charles 22u CHR 116,6  0t0 8977 /dev/snd/controlC0 
pulseaudi 2044 charles 29u CHR 116,6  0t0 8977 /dev/snd/controlC0 
pulseaudi 2044 charles 30r CHR 116,33  0t0 7992 /dev/snd/timer 
pulseaudi 2044 charles 31u CHR 116,5  0t0 8976 /dev/snd/pcmC0D0c 

私は、彼らはすべての彼らはすべてのALSA経由つもりはない、PulseAudioはデーモンを使用している同じPID、2044を持っていることがわかります。

私の質問:私は、オーディオ入力のためのpulseaudioを通過するすべてのアプリケーションではなく、私のファイルではなく、マイクからの音声データを取得しますデフォルトでは、私の仮想マイクを使用するのpulseaudioを取得するにはどうすればよいですか?

+2

[aplayからcentosのarecordへの出力パイプライン]の可能な複製(http://stackoverflow.com/questions/42843128/piping-output-from-aplay-to-arecord-in-centos) –

+0

@CL。私が間違っていれば私を訂正してください。その場合、録音アプリケーションがわかっているようです(_arecord test.raw -r 8000 -t raw_)。私の場合、どのアプリケーションがマイクロフォンにアクセスするのかを制御することはできません。マイクから読み込んで、ファイルから読み込むアプリケーションが必要です。 – cheerupcharlie

+1

'arecord'呼び出しはデバイス名を指定せず、デフォルトのデバイスを使用しています。 (そして、プログラムが明示的に別のデバイス名を使用することは常に可能です。) –

答えて

5

多くの苦労した時間の後、私はついに何か受け入れられる仕事を得ました。私はALSAでやったことをすべて元に戻しました(デフォルトではALSAがPulseAudioを代わりに使用しています。私はPulseAudioはが使用する「仮想マイク」などのPulseAudioクライアントを作成するには、簡単なbashスクリプトinstall_virtmic.shを作成:

#!/bin/bash 

# This script will create a virtual microphone for PulseAudio to use and set it as the default device. 

# Load the "module-pipe-source" module to read audio data from a FIFO special file. 
echo "Creating virtual microphone." 
pactl load-module module-pipe-source source_name=virtmic file=/home/charles/audioFiles/virtmic format=s16le rate=16000 channels=1 

# Set the virtmic as the default source device. 
echo "Set the virtual microphone as the default device." 
pactl set-default-source virtmic 

# Create a file that will set the default source device to virtmic for all 
PulseAudio client applications. 
echo "default-source = virtmic" > /home/charles/.config/pulse/client.conf 

# Write the audio file to the named pipe virtmic. This will block until the named pipe is read. 
echo "Writing audio file to virtual microphone." 
while true; do 
    cat audioFile0.raw > /home/charles/audioFiles/virtmic 
done 

インストールスクリプトによって行われ、すべてを元に戻すための迅速なスクリプトuninstall_virtmic.sh

#!/bin/bash 

# Uninstall the virtual microphone. 

pactl unload-module module-pipe-source 
rm /home/charles/.config/pulse/client.conf 

私はChromiumを起動し、マイクをクリックして音声検索機能を使用しました。私もarecord test.raw -t raw -f S16_LE -c 1 -r 16000で試してみました。スクリプト内の無限ループ(私のtest.rawファイルが非常に大きくなりました)の名前付きパイプvirtmicに書き込みを続けているので、完璧ではありませんが、今のところそれがあります。

より良い解決策が見つかった場合は、お気軽にお問い合わせください。

関連する問題