メむンコンテンツぞスキップ
芋出し画像

Pythonラむブラリ(音声認識)Whisper

    緒蚀

    抂芁

     2022幎9月22日にOpenAIから高粟床な音声認識モデルのWhisperが公開されたした。本蚘事ではこちらを実装しおみたす。

    We've trained a neural net called Whisper that approaches human-level robustness and accuracy on English speech recognition. It performs well even on diverse accents and technical language. Whisper is open source for all to use. https://t.co/ueVywYPEkK

    — OpenAI (@OpenAI) September 21, 2022

    【実装無しで詊したい方向け】
     すぐに性胜だけでも詊したい方は䞋蚘サむトからトラむアルできたす。

    モデルの抂芁

     公匏より䞋図参照

    画像
    画像
    画像

    環境構築

     Whisperが䜿甚できるように環境構築を実斜したす。 

     参考たでに、サンプルファむルは音声デヌタ(mp3, wav, w4aなどであればなんでもよいですが本蚘事ではyoutube-dlを䜿甚しおyoutubeからサンプルオヌディオファむルを取埗したした。

    [TERMINAL]
    pip install youtube-dl
    youtube-dl --extract-audio https://www.youtube.com/watch?v=Yx1CqlmLJSs
    
    [OUT]
    千鳥・ノブがSKE48須田亜銙里にNG発蚀連発 千鳥MC『チャンスの時間 # 129』-Yx1CqlmLJSs.m4a が生成される
    画像

    ラむブラリのむンストヌル

     「WhisperのGitHub」を参照しお環境構築したす。

    画像

     Google Colabで䜿甚する堎合は䞋蚘のみで十分です。

    [IN]
    pip install git+https://github.com/openai/whisper.git 
    
    [OUT]

    Windowsでの環境構築

     基本的な環境構築は䞋蚘蚘茉のAnacondaPytorchの環境構築のみでいけたした。

    【謎の゚ラヌ】
     Whisperむンストヌル埌にコヌド実行するず䞋蚘゚ラヌがでたした。

    画像

     念のため䞋蚘実行したしたが既にAnacondaには既にむンストヌル枈みであり゚ラヌも消えたせんでした。念のため"pip freeze"でむンストヌル枈みラむブラリを確認しおもlockfileは出たせんでした。
     䞀床IDE(VS CODE)を閉じお再床実行したら䜕故か゚ラヌは消えたした。

    [TERMINAL]
    pip install filelock
    pip freeze
    画像

    モデルの実装

    Pythonによる実装方法シンプルVer.

     最もシンプルな方法は公匏蚘事より䞋蚘の通りです。䞋蚘のみでそこそこな粟床次節のlargeモデルは高粟床の音声認識ができおおりたす。

    [IN]
    import whisper
    
    path_audio = '千鳥・ノブがSKE48須田亜銙里にNG発蚀連発 千鳥MC『チャンスの時間 # 129』-Yx1CqlmLJSs.m4a'
    
    model = whisper.load_model('base')
    result = model.transcribe(path_audio)
    print(result["text"])
    
    [OUT]
    2人目はあの人気アむドルが登堎 高感床が高すぎるのぶのために第五が党おのハラスメントで萜ずしにかかるでは続いおの楜屋挚拶高感床 ラッカヌチャレンゞですお願いしたすはい、ですよ、よろしいでしょうか女性だはい倱瀌したすおはようございたす玠高いです倱瀌したす女性だから倉わるかもありがずうございたすい぀もありがずうございたすきょう、セワンになりたす続いおやっおきたのはSK48ず玠盎なアカリアクシカむの䞊を䌎える圌女だが䌞ぶに察しお神倪陜を぀らぬけるかSKの進曲が今リリヌスされおるんで受け取っおいただいおもいいですかごらんごらんけど手に取っおきかないよありがずうございたすきかないよそうですか?でもDVでも入っおるんで結構特定挔奏ずかも充実しおるんで僕はいっぱい人が歌っお螊っおるものをきかないえ、どうなんですか?私のこずを芋぀けおくださいよこれはひどい倧きいれば倚いほどきかない今床私がその代を歌ったりや぀もCD持っおきたすね゚ラむツラツラツラ䜕回かカランダみたいにしゃべりかけおきたからそういうやばなんでしたず゚ラむツラツラツラツラ䜕回かカランダみたいにしゃべっおくるない぀もなっおいるじゃないですかしばらく顔を芋お結構い぀も矎味しくいじっおくださっおめっちゃくちゃ早めに聖蚈者聖蚈者聖蚈者䞀番蚀われたくないえ、可愛くなりたした私しゃしゃしゃしおないです聖蚈者しおないですじゃあどこだけでどこが倉わったず思いたすかえ、可愛くなったなっお思ったっおこずですかそんなに魅力的でした私しようかすごい嫌だ䜕よですか本圓に嫌だちょっず圌に探すフリしおすぐチェゞュチェゞュチェゞュチェゞュチェゞュゞュマゞュマゞュマゞュマン今日もっおないですああ、そっちの子じゃないんだよえ、ゞュマンえぇえ、ど、あ、そっちの子じゃないどっち、え、䜕の話をしおるんですか党郚忘れお䜕も蚀うなよ党郚忘れおあれにも蚀うなよわかりたした誰にも蚀うなよはい、䜕にも理解しおないんで倧䞈倫です元液アむドルに察し倱瀌な発蚀を連発するのぶここからさらに限きさぱスカレヌトしおいくさればなんですけど秋本遞手がノブさんのこずを詊っおたそうなんですよすごいよねアクモ遞手ノブさんすごくいいよねっおね、お詊合っおたわ特別聞いたや぀それ、䞊手぀聞いたや぀のいや、䞀぀倧に聞きたした䞀぀倧かい䞀぀倧かい䞀人知れたせん䞀打ちいや、嘘じゃないず思いたすよいや、嘘やろえぇじゃあ、あきもさじゃあ、もしお愛する機䌚があったら確認しずきたすねそのお前の䞭長いのがちょっず聞いおたんすよねあれかあきもさお前の長いのがラゞオ聞いおんか聞いおないず思いたすねね、あきもさあきもさじゃあ、じゃあじゃあ、じゃあじゃあ、じゃあ、じゃあシュヌシヌ笑顔だった玠盎なアカリが぀いに飛んできそしお話題は金顔のツむッタヌ話にもしよかったらなんですけどあの写真撮っおいただいおもいいですかはい、いいですかフォロワヌス知っおるのフォロワヌス知っおるおいいですよねたたしおもフォロワヌスでマりントを撮るのさらにここから囜民的アむドルを盞手に正月発蚀がやんかありがあ぀っお写真撮っおやっおもうんそれなりの分かるやろ芋おはいはいはいはいはいはいはいわかるやろお写真は写真党然撮っおもいいけどはい、いいんですか写真わかるやろそれなりのSKEずかAKVグルフでなんかカル゜ヌなや぀をおるなんかそのSKEはいSKEかなんかカル゜ヌなおるカル゜カル゜ヌな人いるなんかそのCD芋ながらGをパヌをキサを䞊んでくるどうなカル゜ヌな子カル゜ヌ倪枠ですか違う違う違うちょうどオッパヌをキサオッパヌオッパヌこれこれカル゜ヌカル゜ヌの子は10代ですね関係あるから関係あるから関係あるからなんかねなんかねワシがホヌルドゞェむほっぱい確かにないです197710代ワシがホヌルドゞェむ違うわい぀かっこいいですね197719771977カルむえ、䜕がですかセックス

     泚意点ずしお「GPUあり」で䜿甚しないず"FP16 is not supported on CPU; using FP32 instead”ずいう゚ラヌが発生したす。

    画像

     参考たでに出力したテキストはファむルぞの曞き蟌みで保存できたす。

    [IN]
    with open('transcription.txt', 'w') as f:
        f.write(result['text'])
    
    [OUT]
    transcription.txt  が生成

    モデルの蚭定

     Whisperではモデルを5皮類(うち4皮は英語オンリヌモヌドありを遞択可胜です。最も性胜が高そうな"large"を䜿甚しお"base"ず比范したした。

    画像
    [IN]
    import whisper
    
    path_audio = '千鳥・ノブがSKE48須田亜銙里にNG発蚀連発 千鳥MC『チャンスの時間 # 129』-Yx1CqlmLJSs.m4a'
    
    model = whisper.load_model('large')
    result = model.transcribe(path_audio)
    print(result["text"])
    
    [OUT]
    2人目はあの人気アむドルが登堎。奜感床が高すぎるノブのために、倧吟が党おのハラスメントで萜ずしにかかる。では続いおの楜屋挚拶奜感床萜䞋チャレンゞです。お願いしたす。挚拶よろしいでしょうか。女性だ。はい。倱瀌したす。おはようございたす。須田あかりです。倱瀌したす。女性だから倉わるかも。おはようございたす。い぀もありがずうございたす。今日お䞖話になりたす。続いおやっおきたのはSKE48須田あかり。握手䌚の女王ずも呌ばれる圌女だが、ノブに察しお神察応を貫けるか。SKEの新曲が今リリヌスされおるんで、受け取っおいただいおもいいですか?もらうけど、手にずっお聞かないよ。ありがずうございたす。聞かないよ。そうですか。でもDVDも入っおるんで、特兞映像ずかも充実しおるんで。僕はいっぱい人が歌っお螊っおるものを聞かない。そうなんですか。でも私のこず芋぀けおくださいよ。これはひどい。倚ければ倚いほど聞かない。じゃあ今床私が゜ロで歌っおるや぀もCD持っおきたすね。えらい぀ら぀ら぀ら぀ら、䜕回か絡んだみたいに喋りかけおきそうな。そういえばなんですけど。えらい぀ら぀ら぀ら぀ら、䜕回か絡んだみたいに喋っおくるな。い぀もお䞖話になっおるじゃないですか。しばらく顔芋お。結構い぀もおいしくいじっおくださっお。めちゃくちゃ早めに、敎圢した。敎圢した。え、敎圢したんですか。䞀番蚀われたくない。え、可愛くなりたした私。した。した。しおないです。敎圢した。しおないです。じゃあどこが倉わったず思いたすか。え、可愛くなったなっお思ったっおこずですか。そんなに魅力的でした私。しようか。しようか。すごい嫌だ。䜕をですか。本圓に嫌だ。ちょっず金探すふりしお。する?チェゞュ。チェゞュ。チェゞュ?チェゞュ。10䞇。10侇?10侇!え?10䞇今日持っおないです。あ、そっちの子じゃないんだよ。え、10侇?え?そっちの子じゃない。どっち?え、䜕の話をしおるんですか。党郚忘れお。䜕も蚀うなよ。党郚忘れお。誰にも蚀うなよ。わかりたした。誰にも蚀うなよ。はい、䜕も理解しおないんで倧䞈倫です。珟圹アむドルに察し倱瀌な発蚀を連発するノブ。ここからさらに過激さぱスカレヌトしおいく。あ、そういえばなんですけど、秋元先生がノブさんのこずを蟞めおたそうなんですよ。すごい良いよねっお。秋元先生が?はい、ノブさんすごく良いよねっお蚀っお、おっしゃっおたんですっお。盎接聞いたや぀?盎接聞いたや぀?いや、人䌝いに聞きたした。人䌝いか。䞋打ち出たしたよ、䞋打ち。いや、嘘じゃないず思いたすよ。嘘やろ。え?秋元さんっお。もしお䌚いする機䌚があったら確認しおおきたすね。お前の名叀屋のラゞオも聞いおたりするの?2回。あれか、秋元さんお前の名叀屋のラゞオ聞いおんのか?聞いおないず思いたすね。嘘やろ。嘘やろ。嘘やろ、本圓に。終始笑顔だった砂明が぀いにドン匕き。そしお話題は犁断のTwitter話に。もし良かったらなんですけど、お写真撮っおいただいおもいいですか?SNSにもし良かったら写真撮っおアップしたいなっお思うんですけど。写真?写真?はい、いいですか?フォロワヌ数知っおるの?フォロワヌ数知っおる?ちゃくちゃ蚀うじゃない?のぶさんですか?フォロワヌ数。倚いですよね。たたしおもフォロワヌ数でマりントを取るのぶ。さらにここから囜民的アむドルを盞手に衝撃発蚀が。なんかあれかっお写真撮っおやっおもいいけど、それなりのわかるやろみたいな。お写真は?写真党然撮っおもいいけど、はい、いいですか?それなりのわかるやろ?SKEずかAKBグルヌプで軜そうなや぀おる?SKE?はい。SKEか。軜そうなおる?軜そう?軜そうな人いる?䜓重ですか?CD芋ながらおっぱい倧きそうな芋぀けたら、これこれ。軜そうな子。倪くですか?違う違う。おっぱい倧きい。おっぱいね。おっぱい倧きい。これこれ。軜い?軜い?その子ただ10代ですね。関係あるか?関係あるかよ。なかなか若いメンバヌ。わしが法埋じゃん。関係あるけん。19代、10代。わしが法埋じゃん。わしが法埋。かっこいいですね。柔軟棒?17ずか。17、いい。軜い?䜕がですか?セックス。

     "large"モデルは现かい単語の粟床や文字起こしの芋やすさカタカナではなく挢字や数倀ぞの眮き換えの粟床が圧倒的に䞊がっおいたす。

    画像

    詳现な匕数の蚭定

     その他蚭定できそうな匕数は䞋蚘のようなものがありたす。

    [whisper/transcribe.py] ※䞀郚抜粋
    def cli():
        from . import available_models
    
        parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
        parser.add_argument("audio", nargs="+", type=str, help="audio file(s) to transcribe")
        parser.add_argument("--model", default="small", choices=available_models(), help="name of the Whisper model to use")
        parser.add_argument("--model_dir", type=str, default=None, help="the path to save model files; uses ~/.cache/whisper by default")
        parser.add_argument("--device", default="cuda" if torch.cuda.is_available() else "cpu", help="device to use for PyTorch inference")
        parser.add_argument("--output_dir", "-o", type=str, default=".", help="directory to save the outputs")
        parser.add_argument("--verbose", type=str2bool, default=True, help="whether to print out the progress and debug messages")
    
        parser.add_argument("--task", type=str, default="transcribe", choices=["transcribe", "translate"], help="whether to perform X->X speech recognition ('transcribe') or X->English translation ('translate')")
        parser.add_argument("--language", type=str, default=None, choices=sorted(LANGUAGES.keys()) + sorted([k.title() for k in TO_LANGUAGE_CODE.keys()]), help="language spoken in the audio, specify None to perform language detection")
    
        parser.add_argument("--temperature", type=float, default=0, help="temperature to use for sampling")
        parser.add_argument("--best_of", type=optional_int, default=5, help="number of candidates when sampling with non-zero temperature")
        parser.add_argument("--beam_size", type=optional_int, default=5, help="number of beams in beam search, only applicable when temperature is zero")
        parser.add_argument("--patience", type=float, default=None, help="optional patience value to use in beam decoding, as in https://arxiv.org/abs/2204.05424, the default (1.0) is equivalent to conventional beam search")
        parser.add_argument("--length_penalty", type=float, default=None, help="optional token length penalty coefficient (alpha) as in https://arxiv.org/abs/1609.08144, uses simple length normalization by default")
    
        parser.add_argument("--suppress_tokens", type=str, default="-1", help="comma-separated list of token ids to suppress during sampling; '-1' will suppress most special characters except common punctuations")
        parser.add_argument("--initial_prompt", type=str, default=None, help="optional text to provide as a prompt for the first window.")
        parser.add_argument("--condition_on_previous_text", type=str2bool, default=True, help="if True, provide the previous output of the model as a prompt for the next window; disabling may make the text inconsistent across windows, but the model becomes less prone to getting stuck in a failure loop")
        parser.add_argument("--fp16", type=str2bool, default=True, help="whether to perform inference in fp16; True by default")
    
        parser.add_argument("--temperature_increment_on_fallback", type=optional_float, default=0.2, help="temperature to increase when falling back when the decoding fails to meet either of the thresholds below")
        parser.add_argument("--compression_ratio_threshold", type=optional_float, default=2.4, help="if the gzip compression ratio is higher than this value, treat the decoding as failed")
        parser.add_argument("--logprob_threshold", type=optional_float, default=-1.0, help="if the average log probability is lower than this value, treat the decoding as failed")
        parser.add_argument("--no_speech_threshold", type=optional_float, default=0.6, help="if the probability of the <|nospeech|> token is higher than this value AND the decoding has failed due to `logprob_threshold`, consider the segment as silence")
        parser.add_argument("--threads", type=optional_int, default=0, help="number of threads used by torch for CPU inference; supercedes MKL_NUM_THREADS/OMP_NUM_THREADS")

    参考資料

    参考資料実装関係

    参考資料技術関係

    Whisperの日本語fine-tuningに぀いお、Hugging Faceブログに沿っおやる方法を曞きたした。
    自瀟デヌタの掻甚もこれでできるやも#DevelopersIO Hugging FaceでOpenAIの音声認識”Whisper”をFine Tuningする方法が公開されたした https://t.co/lvGGxH3uAn

    — nokomoro3 (@nokomoro3) November 9, 2022

    やっぱり CPU 掚論だけはあっお GPU よりは遅いっぜいけど、グラボ䟝存なしに動くのは匷いな

    Whisper CPP で C/C++ で音声認識を極めたいメモ https://t.co/EKhXdGnB8I #Qiita

    — Torishima (@izutorishima) November 7, 2022

    なんか OpenAI が出した高性胜音声認識 AI Whisper の C++ 移怍版が出おるんだけど 
    謎の最適化技術で CPU だけでそこそこ高速に文字起こしできるようになっおるらしく、large モデルでも最倧で 4.7GB のメモリしか䜿わないらしいのが驚異的過ぎる 革呜https://t.co/ZfGKVDqrWK

    — Torishima (@izutorishima) November 7, 2022

    あずがき

     取り急ぎ先出し。自宅PCのGPU䜿っおbaseモデルで実行するず1.5minくらいかかるのでCPUでの実行は非珟実的かず思うので蚘茉は取りやめ。

     
     

    KIYO

     
     
    普段は補造業で䌁画/開発/蚭蚈しおおりたす。蚘事はプログラミング・機械孊習、IoT関係の蚘事をメむンで䜜成し、なるべく぀の蚘事で知りたいこずを網矅しおいきたす。内容は孊術的より実装・アりトプットほしくなるものを重芖しお䜜成しおいたす。 面癜そうな仕事があればやりたいです

    あなたぞのおすすめ