Прочитать * .wav файл в golang

Я использовал file_get_contents для чтения файла WAV в PHP, и я хочу использовать пакет github.com/mjibson/go-dsp/wav для той же задачи в Go. Но об этом пакете нет простого примера. Я новичок в Go и не понимаю этого. Кто-нибудь направляет меня или предлагает другой путь?

Код на PHP:

$wsdl = 'http://myApi.asmx?WSDL';
$client = new SoapClient($wsdl));
$data = file_get_contents(public_path() . "/forTest/record.wav");
$param = array(
  'userName' => '***',
  'password' => '***',
  'file' => $data);

$res = $client->UploadMessage($param);
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
2 721
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Похоже, вам не нужно использовать этот пакет github.com/mjibson/go-dsp/wav. Функция file_get_contents - это предпочтительный способ чтения содержимого файла в строку.

В Go можно сделать что-то вроде этого:

package main

import (
    "fmt"
    "io/ioutil"
)

func public_path() string {
    return "/public/path/"
}

func main() {
    dat, err := ioutil.ReadFile(public_path() + "/forTest/record.wav")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Print(string(dat))
}

https://play.golang.org/p/l9R0940iK50

репо, о котором упоминает OP, анализирует заголовок файла wav ... ваш код не обрабатывает сведения о чтении аудио

Scott Stensland 27.10.2018 21:37

Ваш подход слишком общий. с этим кодом вы можете без толку читать любой файл.

rdo 09.05.2021 12:48

Думаю, вам просто нужно прочитать файл, действительно неважно, это .wav или какой-то другой файл. Вы можете использовать встроенный пакет go'sio/ioutil.

Вот что вам нужно сделать в go для чтения файла на диске:

package main

import (
    "fmt"
    "io/ioutil"
    "log"
)

func main() {
    // Reading .wav file from disk.

    fileData, err := ioutil.ReadFile("DISK_RELATIVE_PATH_PREFIX" + "/forTest/record.wav")

    // ioutil.ReadFile returns two results, 
    // first one is data (slice of byte i.e. []byte) and the other one is error.
    // If error is having nil value, you got successfully read the file, 
    // otherwise you need to handle the error.

    if err != nil {
        // Handle error here.

        log.Fatal(err)
    } else {
        // Do whatever needed with the 'fileData' such as just print the data, 
        // or send it over the network.

        fmt.Print(fileData)
    }
}

Надеюсь это поможет.

При наличии файла WAV он возвращает полезную нагрузку в виде звуковой кривой с плавающей запятой вместе с важными деталями аудиофайла, такими как битовая глубина, частота дискретизации и количество каналов.

Если бы вы просто читали двоичный аудиофайл, используя один из базовых примитивов ввода-вывода, чтобы получить звуковую кривую, вам пришлось бы бороться со своим собственным битовым сдвигом, чтобы извлекать многобайтовые int, а также обрабатывать большой или малый порядок байтов.

Вы все равно должны знать, как обрабатывать многоканальное чередование аудиосэмплов из каждого канала, что не является проблемой для монофонического звука.

package main

import (
    "fmt"
    "os"
    "github.com/youpy/go-wav"
    "math"
)

func read_wav_file(input_file string, number_of_samples uint32) ([]float64, uint16, uint32, uint16) {

    if number_of_samples == 0 {
        number_of_samples = math.MaxInt32
    }

    blockAlign := 2
    file, err := os.Open(input_file)
    if err != nil {
        panic(err)
    }

    reader := wav.NewReader(file)
    wavformat, err_rd := reader.Format()
    if err_rd != nil {
        panic(err_rd)
    }

    if wavformat.AudioFormat != wav.AudioFormatPCM {
        panic("Audio format is invalid ")
    }

    if int(wavformat.BlockAlign) != blockAlign {
        fmt.Println("Block align is invalid ", wavformat.BlockAlign)
    }

    samples, err := reader.ReadSamples(number_of_samples) // must supply num samples w/o defaults to 2048
    //                                                    // just supply a HUGE number then actual num is returned
    wav_samples := make([]float64, 0)

    for _, curr_sample := range samples {
        wav_samples = append(wav_samples, reader.FloatValue(curr_sample, 0))
    }

    return wav_samples, wavformat.BitsPerSample, wavformat.SampleRate, wavformat.NumChannels
}

func main() {

    input_audio := "/blah/genome_synth_evolved.wav"

    audio_samples, bits_per_sample, input_audio_sample_rate, num_channels := read_wav_file( input_audio, 0)

    fmt.Println("num samples ", len(audio_samples)/int(num_channels))
    fmt.Println("bit depth   ",  bits_per_sample)
    fmt.Println("sample rate ", input_audio_sample_rate)
    fmt.Println("num channels", num_channels)
}

Другие вопросы по теме