Rumah >pembangunan bahagian belakang >Golang >Golang melaksanakan sembang suara

Golang melaksanakan sembang suara

王林
王林asal
2023-05-10 16:47:071376semak imbas

Dengan perkembangan pesat teknologi Internet, semakin ramai orang mula menggunakan sembang suara untuk berkomunikasi dalam talian, dan kaedah ini semakin popular di kalangan pengguna. Artikel ini akan memperkenalkan cara menggunakan Golang untuk melaksanakan fungsi sembang suara.

Golang ialah bahasa pengaturcaraan berdasarkan pengaturcaraan serentak, sesuai untuk pengaturcaraan rangkaian dan senario konkurensi tinggi, jadi kita boleh menggunakan Golang untuk melaksanakan fungsi sembang suara. Realisasi keperluan sembang suara memerlukan penggunaan teknologi komunikasi rangkaian dan teknologi pemprosesan audio.

1. Prinsip asas komunikasi suara

Prinsip asas komunikasi suara ialah penghantaran aliran kod audio. Biasanya kami memampatkan aliran audio ke dalam paket kecil dan kemudian menghantarnya melalui rangkaian. Proses ini memerlukan penggunaan teknologi pengekodan dan penyahkodan. Pengekodan ialah proses menukar bunyi kepada isyarat digital, dan penyahkodan ialah proses memulihkan isyarat digital kepada bunyi.

Dalam penghantaran rangkaian, kita perlu menggunakan protokol UDP untuk menghantar data. Protokol UDP dicirikan oleh kelajuan penghantaran yang cepat tetapi tidak boleh dipercayai. Memandangkan panggilan suara mempunyai keperluan masa nyata yang tinggi, menggunakan penghantaran protokol UDP boleh meningkatkan kualiti panggilan suara.

2. Langkah untuk melaksanakan fungsi sembang suara

1. Mengumpul audio

Mengumpul audio memerlukan mikrofon untuk merakam bunyi , perpustakaan OpenAL, dsb. Di sini kami mengambil PortAudio sebagai contoh untuk mengumpul audio.

Mula-mula kita perlu memasang pustaka PortAudio:

brew install portaudio

Kemudian pasang pustaka go-portaudio:

go get github.com/gordonklaus/portaudio

Kod untuk mengumpul audio adalah seperti berikut:

import (
    "github.com/gordonklaus/portaudio"
)

// 录音
func RecordAudio(ch chan []int16) {
    // 初始化PortAudio
    portaudio.Initialize()
    defer portaudio.Terminate()

    // 打开默认输入设备
    stream, err := portaudio.OpenDefaultStream(1, 0, 44100, len(window))
    if err != nil {
        log.Fatal(err)
    }
    defer stream.Close()

    // 开始录音
    err = stream.Start()
    if err != nil {
        log.Fatal(err)
    }
    defer stream.Stop()

    // 采集音频数据
    for {
        buffer := make([]int16, len(window))
        err := stream.Read(buffer)
        if err != nil {
            fmt.Println(err)
        }
        ch <- buffer
    }
}

2. Edit Penyahkodan

Selepas pengumpulan audio, ia perlu dikodkan dan dinyahkod sebelum ia boleh dihantar. Pengekodan adalah untuk memampatkan data audio yang dikumpul ke dalam paket kecil Terdapat banyak algoritma pengekodan, dan yang biasa digunakan termasuk MP3, AAC, Opus, dll. Penyahkodan adalah untuk memulihkan data audio yang dimampatkan kepada data audio.

Di sini kami menggunakan algoritma pengekodan dan penyahkodan Opus Golang menyediakan sokongan untuk Opus, dan anda boleh menggunakan perpustakaan opus untuk pengekodan dan penyahkodan. Pasang perpustakaan opus:

brew install opus

Kemudian pasang pustaka go-opus:

go get github.com/hraban/go-opus

Kod pengekodan dan penyahkodan adalah seperti berikut:

import (
    "github.com/hraban/go-opus"
)

// 初始化Opus编解码器
func InitOpus() (*opus.Encoder, *opus.Decoder) {
    // 初始化编码器
    enc, err := opus.NewEncoder(44100, 1, opus.AppVoIP)
    if err != nil {
        log.Fatal(err)
    }

    // 初始化解码器
    dec, err := opus.NewDecoder(44100, 1)
    if err != nil {
        log.Fatal(err)
    }

    return enc, dec
}

// Opus编码
func OpusEncode(enc *opus.Encoder, buffer []int16) []byte {
    data := make([]byte, 2048)
    n, err := enc.Encode(buffer, data)
    if err != nil {
        log.Fatal(err)
    }

    return data[:n]
}

// Opus解码
func OpusDecode(dec *opus.Decoder, data []byte) []int16 {
    buffer := make([]int16, 2048)
    n, err := dec.Decode(data, buffer)
    if err != nil {
        log.Fatal(err)
    }

    return buffer[:n]
}

3. Hantar data audio

Audio Selepas pengekodan dan penyahkodan data selesai, penghantaran rangkaian diperlukan. Di sini kami memilih protokol UDP untuk menghantar data audio. Kod untuk menghantar data adalah seperti berikut:

import (
    "net"
)

// 网络传输
func UDPTransfer(conn *net.UDPConn, addr *net.UDPAddr, ch chan []int16, enc *opus.Encoder) {
    for {
        buffer := <- ch
        data := OpusEncode(enc, buffer)
        _, err := conn.WriteToUDP(data, addr)
        if err != nil {
            fmt.Println(err)
        }
    }
}

4 Mainkan audio

Selepas menerima data audio yang dihantar daripada pihak lain, kami perlu menyahkod data audio dan kemudian memainkannya. Memainkan audio memerlukan pemain untuk diproses Pustaka pemain audio di Golang boleh melaksanakan main balik audio. Pasang pustaka pemain audio:

go get github.com/hajimehoshi/oto

Kod untuk main balik audio adalah seperti berikut:

import (
    "github.com/hajimehoshi/oto"
)

// 播放音频
func PlayAudio(player *oto.Player, ch chan []byte, dec *opus.Decoder) {
    for {
        data := <- ch
        buffer := OpusDecode(dec, data)
        player.Write(buffer)
    }
}

5 Sambungan hujung ke hujung untuk sembang audio

Sembang audio memerlukan akhir-. sambungan ke hujung dan menggunakan protokol UDP Tidak dapat mewujudkan sambungan yang stabil. Oleh itu, kita perlu menggunakan STUN dan TURN untuk penembusan NAT untuk mencapai sambungan hujung ke hujung. Kedua-dua STUN dan TURN adalah perkhidmatan teknikal yang digunakan terutamanya untuk menyelesaikan masalah sambungan P2P dan penembusan NAT.

6. Gunakan WebRTC untuk melaksanakan sembang suara

WebRTC ialah teknologi sembang suara dan video berdasarkan pelayar web, yang boleh merealisasikan fungsi sembang suara dan video antara penyemak imbas. WebRTC dibangunkan bersama oleh Google dan Mozilla dan boleh mengendalikan sambungan rangkaian melalui API WebRTC.

Menggunakan WebRTC untuk melaksanakan sembang suara memerlukan penggunaan rangka kerja WebRTC sumber terbuka, seperti PeerJS, EasyRTC, dsb.

3. Ringkasan

Artikel ini menggunakan algoritma pengekodan dan penyahkodan Golang dan Opus untuk melaksanakan fungsi sembang suara Proses pelaksanaan boleh dibahagikan kepada pengumpulan audio, pengekodan dan penyahkodan audio, penghantaran rangkaian, main balik audio dan sambungan WebRTC Tunggu beberapa langkah. Gunakan perpustakaan koleksi audio untuk koleksi audio, gunakan perpustakaan Opus untuk pengekodan dan penyahkodan audio, gunakan protokol UDP untuk penghantaran audio, gunakan pustaka pemain audio untuk main balik audio, gunakan WebRTC untuk melaksanakan sambungan P2P, dsb. Kod dalam artikel ini menunjukkan cara menggunakan bahasa Golang untuk melaksanakan sembang suara, yang boleh membantu pemula memahami pengetahuan pengekodan suara dan penghantaran rangkaian.

Atas ialah kandungan terperinci Golang melaksanakan sembang suara. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:golang mendapat nama kaedahArtikel seterusnya:golang mendapat nama kaedah