gpt4 book ai didi

ffmpeg - 将格式为 8Khz `mulaw` 的 Twilio 保存到文件中

转载 作者:行者123 更新时间:2023-12-04 23:12:56 29 4
gpt4 key购买 nike

有几篇文章解决了这个问题,但我无法成功播放保存的文件。它通常以半速播放。

Convert 8kHz mulaw to 16KHz PCM in real time

使用上述问题中接受的答案,我将原始和 base64 解码的音频保存在 go 中:

// Media event
type Media struct {
Track string `json:"track"`
Chunk string `json:"chunk"`
Timestamp string `json:"timestamp"`
Payload string `json:"payload"`
}

// SaveAudio will upgrade connection to websocket and save the audio to file
func SaveAudio(w http.ResponseWriter, r *http.Request) {
utility.DebugLogf("SaveAudio")
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Print("upgrade:", err)
return
}

defer utility.SafeClose(c)
inBuf := bytes.Buffer{}

loop := true
for loop == true {
_, message, err := c.ReadMessage()
utility.PanicIfErr(err)
decMessage := TwilioWSSMessage{}
err = json.Unmarshal(message, &decMessage)
utility.PanicIfErr(err)

switch decMessage.Event {
case "connected":
utility.DebugLogf("Connected a %s protocol version:%s", decMessage.Protocol, decMessage.Version)
case "start":
utility.DebugLogf("Starting audio stream: %#v", decMessage.Start)
case "media":
chunk, err := base64.StdEncoding.DecodeString(decMessage.Media.Payload)
utility.PanicIfErr(err)
_, err = inBuf.Write(chunk)
utility.PanicIfErr(err)
case "stop":
utility.DebugLogf("Ending audio stream: %#v", decMessage.Stop)
loop = false
default:
utility.LogWarningf("Unrecognized event type: %s", decMessage.Event)
loop = false
}
}

saveRaw(&inBuf)
}

func saveRaw(buf *bytes.Buffer) {
rawOut, err := os.Create("out.ulaw")
utility.PanicIfErr(err)

_, err = rawOut.Write(buf.Bytes())
utility.PanicIfErr(err)
}

然后我用了 ffmpegmulaw 转换为默认 pcm_s16le :

ffmpeg -f mulaw -ar 8000 -ac 1 -i out.ulaw mulaw_decoded.wav 

然后从 8k->16k 上采样音频并使用 vlc 播放:

ffmpeg -i mulaw_decoded.wav -ar 16000 upsampled.wav && vlc upsampled.wav

但它以半速播放。

最终,我想在 rust 或 go 中完成这一切,但我什至无法使用 ffmpeg 在本地工作。

提前致谢。

以上两个 ffmpeg的输出与建议的 sox 重采样器相结合的操作:

命令:

ffmpeg -y -loglevel verbose -f mulaw -ar 8000 -ac 1 -bits_per_raw_sample 8 -i testsamples/raw_mulaw_bytes -af aresample=resampler=soxr -ar 16000 upsampled.wav

输出:

[mulaw @ 0x7fecc0814000] Estimating duration from bitrate, this may be inaccurate
Guessed Channel Layout for Input Stream #0.0 : mono
Input #0, mulaw, from 'testsamples/raw_mulaw_bytes':
Duration: 00:00:20.74, bitrate: 64 kb/s
Stream #0:0: Audio: pcm_mulaw, 8000 Hz, mono, s16, 64 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (pcm_mulaw (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
[graph_0_in_0_0 @ 0x7fecc0505600] tb:1/8000 samplefmt:s16 samplerate:8000 chlayout:0x4
[Parsed_aresample_0 @ 0x7fecc0505280] ch:1 chl:mono fmt:s16 r:8000Hz -> ch:1 chl:mono fmt:s16 r:16000Hz
Output #0, wav, to 'upsampled.wav':
Metadata:
ISFT : Lavf58.29.100
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 16000 Hz, mono, s16, 256 kb/s
Metadata:
encoder : Lavc58.54.100 pcm_s16le
No more output streams to write to, finishing.
size= 648kB time=00:00:20.74 bitrate= 256.0kbits/s speed=1.55e+03x
video:0kB audio:648kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.011753%
Input file #0 (testsamples/raw_mulaw_bytes):
Input stream #0:0 (audio): 519 packets read (165920 bytes); 519 frames decoded (165920 samples);
Total: 519 packets (165920 bytes) demuxed
Output file #0 (upsampled.wav):
Output stream #0:0 (audio): 200 frames encoded (331840 samples); 200 packets muxed (663680 bytes);
Total: 200 packets (663680 bytes) muxed
[AVIOContext @ 0x7fecc0433cc0] Statistics: 4 seeks, 6 writeouts
[AVIOContext @ 0x7fecc042a6c0] Statistics: 165920 bytes read, 0 seeks

音频听起来和以前一样

最佳答案

多亏了这个答案,我终于弄明白了:Slow motion effect when decoding OPUS audio stream

他提到:

Another possible reason of "slow motion" is more than one stream decoded by the same decoder. But in this case you also get distorted slow audio.



所以这次通话的轨道是 inboundoutbound所以在 case "media":只保存一首轨道:

if decMessage.Media.Track == "outbound" {
chunk, err := base64.StdEncoding.DecodeString(decMessage.Media.Payload)
utility.PanicIfErr(err)
_, err = outboundBuf.Write(chunk)
utility.PanicIfErr(err)
}

并且 ffmpeg 命令按预期工作

关于ffmpeg - 将格式为 8Khz `mulaw` 的 Twilio <Stream> 保存到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60955908/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com