Work in progress
The content of this page was not yet updated for Godot
4.5
and may be outdated. If you know how to improve this page or you can confirm
that it's up to date, feel free to open a pull request.
マイクでの録音
Godotは、Windows、macOS、Linux、Android、およびiOSのゲーム内オーディオ録音をサポートしています。
簡単なデモが公式デモプロジェクトに含まれており、このチュートリアルのサポートとして使用されます: https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record。
You will need to enable audio input in the Audio > Driver > Enable Input project setting, or you'll just get empty audio files.
デモの構造
デモは単一のシーンで構成されています。このシーンには、GUIとオーディオの2つの主要部分が含まれます。
オーディオ部分に焦点を当てます。このデモでは、オーディオ録音を処理するために、Recordエフェクトを持つ Record という名前のバスが作成されます。録音には AudioStreamRecord という名前の AudioStreamPlayer が使用されます。
var effect
var recording
func _ready():
# We get the index of the "Record" bus.
var idx = AudioServer.get_bus_index("Record")
# And use it to retrieve its first effect, which has been defined
# as an "AudioEffectRecord" resource.
effect = AudioServer.get_bus_effect(idx, 0)
private AudioEffectRecord _effect;
private AudioStreamSample _recording;
public override void _Ready()
{
// We get the index of the "Record" bus.
int idx = AudioServer.GetBusIndex("Record");
// And use it to retrieve its first effect, which has been defined
// as an "AudioEffectRecord" resource.
_effect = (AudioEffectRecord)AudioServer.GetBusEffect(idx, 0);
}
オーディオ録音は、get_recording()、is_recording_active() および set_recording_active() の3つのメソッドを持つ AudioEffectRecord リソースで処理されます。
func _on_record_button_pressed():
if effect.is_recording_active():
recording = effect.get_recording()
$PlayButton.disabled = false
$SaveButton.disabled = false
effect.set_recording_active(false)
$RecordButton.text = "Record"
$Status.text = ""
else:
$PlayButton.disabled = true
$SaveButton.disabled = true
effect.set_recording_active(true)
$RecordButton.text = "Stop"
$Status.text = "Recording..."
private void OnRecordButtonPressed()
{
if (_effect.IsRecordingActive())
{
_recording = _effect.GetRecording();
GetNode<Button>("PlayButton").Disabled = false;
GetNode<Button>("SaveButton").Disabled = false;
_effect.SetRecordingActive(false);
GetNode<Button>("RecordButton").Text = "Record";
GetNode<Label>("Status").Text = "";
}
else
{
GetNode<Button>("PlayButton").Disabled = true;
GetNode<Button>("SaveButton").Disabled = true;
_effect.SetRecordingActive(true);
GetNode<Button>("RecordButton").Text = "Stop";
GetNode<Label>("Status").Text = "Recording...";
}
}
デモの開始時には、録音エフェクトはアクティブではありません。ユーザーが RecordButton を押すと、エフェクトは set_recording_active(true) で有効になります。
次のボタンを押すと、effect.is_recording_active() は true なので、effect.get_recording() を呼び出すことで、記録されたストリームを recording 変数に保存できます。
func _on_play_button_pressed():
print(recording)
print(recording.format)
print(recording.mix_rate)
print(recording.stereo)
var data = recording.get_data()
print(data.size())
$AudioStreamPlayer.stream = recording
$AudioStreamPlayer.play()
private void OnPlayButtonPressed()
{
GD.Print(_recording);
GD.Print(_recording.Format);
GD.Print(_recording.MixRate);
GD.Print(_recording.Stereo);
byte[] data = _recording.Data;
GD.Print(data.Length);
var audioStreamPlayer = GetNode<AudioStreamPlayer>("AudioStreamPlayer");
audioStreamPlayer.Stream = _recording;
audioStreamPlayer.Play();
}
録音を再生するには、録音を AudioStreamPlayer のストリームとして割り当て、play() を呼び出します。
func _on_save_button_pressed():
var save_path = $SaveButton/Filename.text
recording.save_to_wav(save_path)
$Status.text = "Saved WAV file to: %s\n(%s)" % [save_path, ProjectSettings.globalize_path(save_path)]
private void OnSaveButtonPressed()
{
string savePath = GetNode<LineEdit>("SaveButton/Filename").Text;
_recording.SaveToWav(savePath);
GetNode<Label>("Status").Text = string.Format("Saved WAV file to: {0}\n({1})", savePath, ProjectSettings.GlobalizePath(savePath));
}
記録を保存するには、ファイルへのパスを指定して save_to_wav() を呼び出します。このデモでは、パスは LineEdit 入力ボックスを介してユーザーが定義します。