実現したいこと
Go言語で音声ファイルを読み込んでサンプルレートを48000から8000に変更してchunkで送信したい。
前提
Go言語で音声ファイルを読み込んでその音声をchunkで送信したいのですが、その際にchunkごとにサンプルレートを変更して送信しています。
そうすると、時々ノイズが入ったり音声が二重に聞こえたりします。
Go
1import "github.com/zaf/resample" 2 3var buf bytes.Buffer 4res, err := resample.New(&buf, float64(48000), float64(8000), 1, resample.I16, resample.HighQ)
上記のchunkごとにサンプルレートを変更せずに読み込んだデータのサンプルレートを一気に変更して送信すると問題なく聞き取れます。
おそらくchunkごとにサンプルレートを変更する際に最後の方のデータが抜け落ちて、次に来る音声とうまく噛み合わないのかもしれません。この場合だとサンプルレートを48000から8000に変更する際にどのようにchunkを区切るのが良いのでしょうか?
もしくは他に原因があるのでしょうか?
https://github.com/zaf/resample
サンプルレートの変更には上記のライブラリを使っていますが、他にGo言語でサンプルレートを変更する良い方法があれば教えてくださると幸いです。
おそらくですが、
音声の存在する部分で区切った上でサンプルレートを下げると
発生する場合があるのだと思います。
よって、先に区切りたいのであるならば音声がない部分で区切る必要があると思います。
音声のある部分でも区切りたいのであれば、
一気に変換した結果を区切れば、良いと思います。
音声がある部分でも区切った上でサンプルレートを下げることも理論上はできます。
その場合、区切る部分に音声がないようにするために、窓関数(フィルタ)をかけた上で
サンプルレートを下げることになりますが、当然音は劣化する可能性があります。
なぜ音がある部分で区切ると、ノイズが入るかの説明はできますが
音声処理の基礎知識がないと理解できないため、ここでは説明しません。
ちなみに、サンプルレートを下げるだけでも、音声は劣化します。
高音が表現できなくなります。
コメントありがとうございます。
では、音声のない部分というのはどのように判断すれば良いのでしょうか?
当方は、Go言語の専門家ではなく、音声処理の専門家になります。
よって、具体的なプログラムの話に関してはアドバイスできません。
他の方の回答を待ってください。
音声のない部分を探すライブラリなどを探してみてはどうでしょうか?
また、一気にサンプルレートを下げてから分割すれば問題ないと
思うのでこちらで実装してみたらどうでしょう。
無音検出のアルゴリズムとしては、音声のパワーを計算し、一定時間しきい値以下が
続いたらその区間が無音であると判定すれば良いと思います。
※しきい値は背景音があった場合の対処として必要です。
![guest](/img/icon/icnUserSample.jpg)